2

我正在寻找一种通用方法来枚举与以下问题相关的序列并将结果存放在 R 中的 3 维矩阵中。

我认为必须有一个组合解决方案,但我一直找不到。希望下面详述的内容将充分描述该问题。欢迎任何帮助。

假设有 n 个周期和 c 个不同的区域,其中事件 e 的发生必须在每个区域中恰好发生一次,那么可能的序列的枚举是多少?

例如,如果有 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 个不同的序列。如前所述,我希望为任意数量的周期和任意数量的区域实施通用解决方案,并将结果存储在由 [time][area][sequence] 索引的矩阵中。谢谢!

4

2 回答 2

1

Many thanks. I believe the following is working correctly.

# 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 个事件的所有可能的时段组合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 个事件,请添加另一个seq(3)inside expand.grid,并调整 inside 函数apply。同样,如果超过 3 个句点,则更seq(3)改为seq(number.of.periods)

于 2013-04-25T14:31:58.367 回答