0で満たされた5x5の行列があるとしましょう。
myMatrix <- matrix(rep(0, 25), ncol = 5)
それでは、1から5までの整数のトリプレットを選びましょう。
triplet <- c(1,2,3)
このトリプレットのすべての組み合わせについて、次の関数を使用して、マトリックスに1を追加します。
addCombinationsToMatrix <- function(.matrix, .triplet){
indexesToChange <- as.matrix(expand.grid(.triplet, .triplet))
.matrix[indexesToChange] <- .matrix[indexesToChange] + 1
.matrix
}
関数を使用して、
myMatrix
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 0 0 0
[2,] 0 0 0 0 0
[3,] 0 0 0 0 0
[4,] 0 0 0 0 0
[5,] 0 0 0 0 0
に
myMatrix <- addCombinationsToMatrix(myMatrix, triplet)
myMatrix
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 0 0
[2,] 1 1 1 0 0
[3,] 1 1 1 0 0
[4,] 0 0 0 0 0
[5,] 0 0 0 0 0
別のトリプレットを選択した場合は、次に進みます
nextTriplet <- 2:4
myMatrix <- addCombinationsToMatrix(myMatrix, nextTriplet)
myMatrix
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 0 0
[2,] 1 2 2 1 0
[3,] 1 2 2 1 0
[4,] 0 1 1 1 0
[5,] 0 0 0 0 0
したがって、行と列の組み合わせは、2つの整数がトリプレットで一緒に表示される頻度を表します。3と4が1回一緒に表示され、2と3が2回一緒に表示されています。
質問:すべての組み合わせ(1-2、1-3、1-4 ...)が少なくとも1回選択され、トリプレットの数が最小化されるように、トリプレットを選択するにはどうすればよいですか。
次のトリプレットを選択するアルゴリズムを探しています。
理想的には、
- 任意の大きな行列(10x10、100x100 ...)
- 任意の大きなベクトル(4つ組、5つ組、nつ組)
- 少なくとも組み合わせが選択されている必要がある回数
例:
myMatrix
myMatrix <- addCombinationsToMatrix(myMatrix, 1:3)
myMatrix
myMatrix <- addCombinationsToMatrix(myMatrix, 3:5)
myMatrix
myMatrix <- addCombinationsToMatrix(myMatrix, c(1,4,5))
myMatrix
myMatrix <- addCombinationsToMatrix(myMatrix, c(2,4,5))
myMatrix
編集:念のため:答えはR
コードである必要はありません。他の言語でも、疑似コードでもかまいません。
編集2:効率を測定するにはさまざまな方法があることに気づきました。私が実際に言ったのは、アルゴリズムはできるだけ少ない反復をとるべきだということです。アルゴリズムが高速であることも非常に優れていますが、ここでは主な目標ではありません。