効率的に整数の組み合わせを選びます

Georgery:

我々は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は、一度一緒に示されており、図2及び図3は、二回一緒に示されています。

質問:どのように1はトリプレットを選ぶことができ、すべての組み合わせ(1-2、1-3、1-4 ...)少なくとも一度選ばれたとトリプレットの数が最小になるように。

私は次のトリプレットを選び、ここでアルゴリズムを探しています。

理想的にはそれがに拡張することができます

  • 任意に大きな行列(10×10、100×100 ...)
  • 任意に大きなベクトル(四つ組、五つ子、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

EDIT:だけは確かに:答えはである必要はありませんRコード。これはよく、あるいは擬似コードのようないくつかの他の言語とすることができます。

EDIT 2:それは効率を測定する別の方法があることを、今、私に発生しました。私は実際に意味、アルゴリズムは、可能な限り少しの反復として取る必要があります。速いいるアルゴリズムは非常にクールもあるが、主な目標ではないここに。

josliber:

グレート質問!これは、それぞれが唯一の質問のサブセットが含まれていることを調査のいくつかの異なるバージョンを希望調査の設計、で起動しますが、あなたが質問のすべてのペア(またはT-タプル)は一度少なくとも頼まれたとします。

これはと呼ばれるデザインをカバーし、そして古典の変形である集合被覆問題あなたは素晴らしいで読むことができるよう数学スタック交換ポストのトピックに、人々はVからC(V、K、T)あなたは(あなたのケースではk = 3)を描画する必要がK-要素のサブセットの最小数を示す表記を使用しますセット全体(あなたの場合、T = 2)内のすべてのT-素子サブセットが選択したサブセットの1つに含まれるよう-elementセット(あなたの場合V = 5)。人々は、多くの異なる(V、K、T)タプルのために、この機能を評価しました。例えば、参照https://ljcr.dmgordon.org/cover/table.htmlを我々は、そのテーブルからの1つの可能な設計として、以下でそのC(5、3、2)= 4を読み取ることができます。

  1  2  3
  1  4  5
  2  3  4
  2  3  5

まず第一に、この問題はNP困難であるため、すべての既知の正確なアルゴリズムは、入力V、K、及びTに指数関数的にスケールします。あなたが列挙か(例えば、プログラミングの整数)いくつかのより多くの巧妙な正確な方法で正確に小さなインスタンスを解決できるかもしれないがだから、あなたはおそらく、問題のサイズが非常に大きくなるにつれて、ヒューリスティックな方法に頼る必要があります。

で提案されているように、この方向での一つの可能性は、辞書式カバーであるhttps://arxiv.org/pdf/math/9502238.pdf(あなたがサイト上でのソリューションの多くはの方法として、リストの上に「lexの覆いを」リンクしていることに注意します建設)。基本的には、辞書順にすべての可能なK-タプルをリストアップ:

123
124
125
134
135
145
234
235
245
345

そして、あなたは貪欲辞書式順序付けを使用して関係を壊し、最も以前に覆われていないT-タプルをカバーしていたkタプルを追加します。

ここでは、アルゴリズムが我々の場合にはどのように動作するかです:

  1. 我々は追加して、すべての3タプルカバー3異なる2つのタプル初めに123、それは辞書順で早いからです。

  2. これを実行した後、2タプルの1213、および23すべての残りの2つの要素がカバーされていない一方で、カバーされています。3タプルの数は、3以上2つのタプルをカバーするなど145して245私たちは選ぶ145ことが覆って、最初の辞書順であることから、1445、と15

  3. -今、私たちは4、残りの覆われていない2つの要素を持っている242534、と353組のカバーこれらの3が、いくつかのカバー2、例えばません234345私たちは、選択234辞書順で早いよう。

  4. 我々は残りの2つのカバーされない2つの要素を持っている- 2535我々は選択235の両方をカバーのみ3組として。

我々は、上記の厳密解で終わります。重要なことに、これは単に発見的方法である - それは4は、5つの要素を持つセット内のすべてのペアをカバーするのに必要な3タプルの最小数であることをいかなる保証を与えません。この場合、下部Schönheimによって結合(参照が上記連結資料に記載されている)、実際には、C(5、3、2)我々は、辞書式カバーから液であると結論4よりも小さくすることができない、ということを説得します実際の最適なインチ

あなたは、特定の回数rを各T-タプルをカバーするために微調整が必​​要になります。1つの明らかな一つだけ(SO各3タプル上記第一の工程において、例えば、R = 3と9 2タプルをカバーする)、「R」回カバーされる各タプルを繰り返し、その後、通常通りLEX被覆を実行することであろう。もちろんこれは、lexのカバーの使用にあなたの全体的な問題のヒューリスティックまま。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=33669&siteId=1