2

次の問題に関連するシーケンスを列挙し、その結果を R の 3 次元マトリックスに格納する一般的なアプローチを探しています。

コンビナトリアルな解決策があるに違いないと思いますが、見つけることができませんでした。願わくば、以下に詳述する内容が問題を十分に特徴付けていることを願っています。どんな助けでも大歓迎です。

n 個の期間と c 個の別個の領域があり、各領域でイベント e が 1 回だけ発生する必要がある場合、考えられるシーケンスの列挙は何ですか?

たとえば、3 つの期間 {1,2,3} と 2 つの領域 {a,b} がある場合、手動で解を列挙すると次のようになります。

Period 1    2    3
Area   a b  a b  a b
Sol 1  e e  - -  - -   ; ie event occurs in both areas at time 1, nothing happens at time 2 and 3
Sol 2  - -  e e  - -   ; event occurs in both areas at time 2 etc
Sol 3  - -  - -  e e
Sol 4  e -  - e  - -
Sol 5  e -  - -  - e
Sol 6  - e  e -  - -
Sol 7  - e  - -  e -
Sol 8  - -  e -  - e
Sol 9  - -  - e  e -

領域の数と時間ステップの数に関係なく、私が知っていることは、解の数は常に n^c になるということです。この場合、イベントが「a」で発生する 3 つの方法×「b」でイベントが発生する 3 つの方法であり、3 x 3 = 9 つの異なるシーケンスです。前述のように、任意の数の期間と任意の数の領域に対して一般化されたソリューションを実装し、[時間] [領域] [シーケンス] でインデックス付けされたマトリックスに結果を格納したいと考えています。ありがとう!

4

2 に答える 2

1

どうもありがとう。以下は正しく機能していると思います。

# Solution:
numperiods <- 4
numevents <- 2
numseqs <- numperiods^numevents

gridparam <- rep(list(seq(numperiods)),numevents)
g <- as.matrix(expand.grid(gridparam))
print(g)

m <- t(apply(g, 1, 
         function(z) {
            x <- rep(0, numperiods*numevents) 
            for (i in 1:numseqs) 
            {
              x[numevents * z[i] - (numevents-i)] <- 1
            }
            x
         }))
print(m)

result <- array(m,c(numseqs,numevents,numperiods))
colnames(result) <- outer("Event",1:numevents, paste)
rownames(result) <- outer("Seq", 1:numseqs, paste)
# Time period is third dim
print(result)
于 2013-04-26T03:05:42.833 に答える
0

したがって、2 つのイベントがあり、各イベントは 3 つの期間のいずれかで発生する可能性があります。を使用して、2 つのイベントが発生する期間のすべての可能な組み合わせを列挙できますexpand.grid

g <- as.matrix(expand.grid( seq(3), seq(3) ))
print(g)
      Var1 Var2
 [1,]    1    1
 [2,]    2    1
 [3,]    3    1    
 [4,]    1    2
 [5,]    2    2
 [6,]    3    2
 [7,]    1    3
 [8,]    2    3
 [9,]    3    3

行をループしてg、正しいインデックスで 1 (「イベント」) を持つベクトルを返します。

m <- t(apply(g, 1, 
             function(z) {
               x <- rep(0, 6)
               x[2 * z[1] - 1] <- 1
               x[2 * z[2]] <- 1
               x
             }))
print(m)
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    0    0    0    0
 [2,]    0    1    1    0    0    0
 [3,]    0    1    0    0    1    0
 [4,]    1    0    0    1    0    0
 [5,]    0    0    1    1    0    0
 [6,]    0    0    0    1    1    0
 [7,]    1    0    0    0    0    1
 [8,]    0    0    1    0    0    1
 [9,]    0    0    0    0    1    1

これはバイナリ形式で探している行列です。

イベントが 2 つ以上ある場合は、 内にもう 1 つ追加し、seq(3)expand.gridで関数を調整しますapply。同様に、ピリオドが 3 つ以上ある場合は、 に変更seq(3)seq(number.of.periods)ます。

于 2013-04-25T14:31:58.367 に答える