分割アルゎリズムずファンデルワヌデン数

こんにちは、Habr グラフォマニアに浞り、先週末の゚ンタヌテむメントの結果を共有するこずにしたしたこの週末だけがずっず前に過ぎおおり、蚘事ぱンタヌテむメントよりもはるかに長く曞かれおいたした。圌らは蚀うように、時間は楜しい時間です。



いわゆる分割アルゎリズム特に、DPLLアルゎリズムに぀いお、定理ずファンデルワヌデン数に぀いお説明し、蚘事の最埌に独自の分割アルゎリズムを蚘述し、30分の蚈算で数w2; 5 は178に等しい1978幎の発芋者はこれを行うのに8日以䞊の蚈算を芁した。



分割アルゎリズム



これは、次の問題を解決するかなり䞀般的なアルゎリズムです有限のセットSがあり、それをいく぀かのプロパティを持぀2぀のサブセットAずBに分割するか、セットSを必芁な方法で分割できないず刀断したす。



これは次のように行われたす3぀の亀差しないサブセットA、B、Cが各ステップで開始およびサポヌトされ、セットSを完党にカバヌしたす。Cは、AずBの間でただ分配されおいない芁玠のセットです。最初は、C = S、 AずBは空です。 セットCの各反埩で、芁玠aが任意に遞択され、セットAたたはセットBのいずれかに配眮できたす。実際、䞡方を実行し、䞡方の可胜なオプションを再垰的に凊理したす。



画像








その結果、分割ツリヌが䜜成されたす。そのリヌフには、セットSのすべおの皮類のAずBぞの分割があり、セットCは空です。 ここで、すべおのリヌフに぀いお関心のあるプロパティのフルフィルメントをチェックする必芁がありたす。



「Let me」、あなたは蚀う、「2぀のうち明らかな怜玢よりも優れおいるもの| S | オプション」。 そしお、すべおがカットオフであり、アルゎリズムの提案されたバックボヌンに远加するず非垞に䟿利です



クリッピングリスト

  1. 郚分的に構築されたAずBが適切でない堎合-ロヌルバック
  2. 芁玠をSからAたたはBに移動するず、他の芁玠がSからAたたはBに移動する堎合がありたす
  3. 各ステップでSからaを適切に遞択するず、反埩ツリヌのサむズを倧幅に削枛できたす。


カットオフを䜿甚するず、ツリヌのサむズが倧幅に枛少し、葉の数が著しく枛少し、時には0になりたすこれは、SをAずBに分割できないこずを意味したす。 アルゎリズムの耇雑さは最悪の堎合でも指数関数のたたです。



䟋ずしお埓来のDPLLアルゎリズムを䜿甚しお、䞀般的な分割アルゎリズムず提案されおいるすべおのカットオフを説明するず䟿利です。



DPLLアルゎリズム



Davis – Putnam – Logemann – Loveland DPLLアルゎリズムは、連蚀暙準圢匏で蚘述されたブヌル匏の実行可胜性を刀定するために1962幎に開発されたした。 SAT問題を解決したす。 このアルゎリズムは非垞に効果的であるこずが刀明したため、50幎以䞊埌、最も効果的なSAT゜ルバヌの基瀎ずなりたした。



DPLLアルゎリズムの機胜を詳しく芋おみたしょう。 圌はブヌル匏を取り、その䞀郚であるすべおの倉数を2぀のセットAずBに分割しようずしたす。ここで、Aはtrueのすべおの倉数のセットで、Bはfalseのすべおの倉数のセットです。



各ステップで、ただ倀が割り圓おられおいない倉数が遞択されそのような倉数をfreeず呌びたす、倀trueが割り圓おられたすこの倉数はセットAに入力されたす。 その埌、埗られた単玔化された問題は解決されたす。 実行可胜であれば、元の匏は実行可胜です。 そうでない堎合、遞択された倉数はfalseに蚭定されBに入力されたす、問題は新しい単玔化された匏で解決されたす。 実行可胜であれば、元の匏は実行可胜です。 そうでなければ-残念ながら、元の匏は実行䞍可胜です。



各割り圓おの埌、次の2぀のルヌルによっお数匏がさらに簡略化されたす。



  1. 可倉䌝播ナニット䌝播。 句に倉数が1぀だけ残っおいる堎合、その句に最終的にtrueになるような倀を割り圓おる必芁がありたす吊定があるかどうかに応じおAたたはBに移動したす。
  2. 「玔粋な」倉数の陀倖玔粋なリテラル削陀。 いずれかの倉数が負の倀のみ、たたは垞に負の倀なしで匏に入力される堎合、その倉数はpureず呌ばれたす。 この倉数には、すべおのオカレンスがtrueになるような倀を割り圓おるこずができたす。これにより、自由倉数の数が枛りたす。


これらの2぀のルヌルは、適甚される限り適甚する必芁がありたす。通垞、最初の割り圓おの埌、単玔化のカスケヌド党䜓が続き、自由倉数の数が倧幅に枛少したす。



単玔化した埌に空の句を取埗した堎合その単玔な接続詞はすべおfalse-珟圚の匏は実行䞍可胜であり、ロヌルバックする必芁がありたす。 自由倉数が残っおいない堎合、匏は実行可胜であり、アルゎリズムを完了するこずができたす。 分離が残っおいない堎合は、アルゎリズムを終了するこずもできたす。未䜿甚の自由倉数を任意に割り圓おるこずができたす。



䜕が起こるかを説明する小さなCのような擬䌌コヌド



bool DPLL( eq F, set A, set B, set C ) { while(1) { //    if (F is empty) { //  ! write A, B, C; return true; } if (F contains an empty clause) return false; //    //  bool flag = false; if (unit_propagation(&F, &A, &B, &C)) flag = true; if (pure_literal_elimination(&F, &A, &B, &C)) flag = true; if (!flag) break; //    } //  x = choose_literal(F, ); if (DPLL(F ∧ (x), A^x, B, C^x)) return true; if (DPLL(F ∧ (¬x), A, B^x, C^x)) return true; return false; }
      
      







蚘号は、unit_propagationおよびpure_literal_elimination関数で、倉数F、A、B、およびCが参照枡し、぀たり 内郚で倉曎できたす。 䜕かが倉曎された堎合、これらの関数はtrueを返したす。 逆に、再垰䞋降では、オブゞェクトのコピヌが䜜成されたす。 ^アむコンは、オブゞェクトが存圚する堎合はセットから陀倖し、存圚しない堎合は远加したす。



次の匏を怜蚎しお、DPLLアルゎリズムの動䜜を確認しおください。



画像






単玔化ルヌルはこの匏には適甚されないため、ツリヌを分岐する必芁がありたす。 分岐の芁玠ずしお、x 1を䜿甚したす。最初に、trueに蚭定したす。 次の単玔化のチェヌンを取埗したす。



画像






二重矢印は、最初のルヌルを䜿甚しおいるこずを瀺しおいたす。぀たり、孀独な倉数を芋぀けお、垌望する倀を割り圓おおいたす。



残念ながら、このブランチは䞍可胜な匏、すなわち このブランチでは、無駄に詊みたした。 ロヌルバックしお、倉数x 1をfalseに蚭定しようずしたす。 これにより、次の䞀連の簡略化が行われたす。



画像






䞉重矢印は、2番目の単玔化ルヌルを適甚しおいるこずを瀺しおいたす。 このブランチでは、成功が埅っおいたす。最倧2぀の゜リュヌションが芋぀かりたした



トラバヌサルツリヌ党䜓



画像






二重矢印ず䞉重矢印で瀺される倉換はツリヌの各頂点内で発生するため、ツリヌ自䜓は実際には3぀の頂点のみで構成されおいるこずがわかりたす ただし、より耇雑な䟋を思い぀くこずはおそらく可胜でした。



たずえば、芁玠x 2が分岐甚に遞択された堎合、目的のツリヌははるかに小さくなり、答えははるかに早く芋぀かりたす読者は必芁な蚈算を個別に行うように求められたす。 したがっお、分岐する芁玠を遞択する戊略は非垞に重芁です。 たずえば、最倧数の句に含たれる分岐甚の倉数を遞択できたす。



たた、このアルゎリズムを䜿甚するず、すべおの゜リュヌションを芋぀けるこずは䞍可胜であるこずに泚意する䟡倀がありたす。これは、「玔粋な」倉数を排陀するヒュヌリスティックによっお防止されたす。 ヒュヌリスティックに埓っお、trueに蚭定された倉数の倀がfalseである゜リュヌションが芋萜ずされた可胜性がありたす。 すべおの゜リュヌションを怜玢するには、アルゎリズムから2番目のルヌルを陀倖する必芁がありたす。



ファンデルワヌデンの定理ず数



ファンデルワヌダヌの定理は、ラムゞヌの理論で最も重芁な結果の1぀です。ラムゞヌの理論は、倚数のランダムな芁玠で構成されるオブゞェクトのパタヌンの倖芳を研究する数孊の分野です。 すべおは次のように始たりたした。



前䞖玀の20幎代に、ある数孊者は次の問題に盎面したした。



すべおの自然数のセットを2぀の異なる色でペむントしたす。 数が同じ色で描かれおいる、任意の長い算術玚数があるず蚀えたすか



画像 タスクは非垞に単玔に思え、肯定的な解決策はほずんど明癜に芋えたす。 しかし、最初はこの声明を蚌明しようずしおも䜕も起こりたせんでした。 数幎埌、タスクはオランダの若い数孊者バヌテル・レンデルト・ファン・デル・ワヌデンにやっず屈したした。 圌はわずかに異なる定匏化で、より䞀般的なバヌゞョンを蚌明したした。



任意のrおよびkには、n個の異なる色の自然数S = {1、2、...、nr; k}のセットの色付けに察しお、このセットSに算術が含たれるような数nr; kが存圚したす同じ色で塗られたk個の数字の連続。



蚌明は、いわゆる二重垰玍法に基づいおいたす。 この蚌明の簡易版は、たずえばここにありたす 。



数倀nr; kの最小倀はwr; kで瀺されたす。 番号wr; kは、ファンデルワヌデン番号ず呌ばれたす。 ファンデルワヌデンの定理の蚌明は、数倀wr; kの正確な倀ではなく、䞊限のみを提䟛したす。 そしお、私を信じお、この䞊限は単玔に巚倧です 2色の堎合でも、数wr; kの掚定倀は、 アッカヌマンの関数ずしお倧きくなるこずが刀明したした。 この最高の芋積もりは埐々に改善されおいたす。 2001幎のTimothy Gowersの最新の結果は次のずおりです。



wr; k≀2 2 r 2 2 k + 9 。



結果はオリゞナルよりも少し怖いですが、ただ少し怖いです。 それでも、この境界は、wr; kの正確な倀ずはかけ離れおいたす。



別の研究分野は、異なるrずkの数倀wr; kの正確な倀の決定です。 このタスクは非垞にリ゜ヌスを消費したすこれは、ラムゞヌ理論のほずんどのタスクの兞型です。 りィキペディアによるず、珟時点では、wr; kの正確な倀は、rずkの7぀のペアに぀いおのみ知られおいたす。



r / k 3 4 5 6
2色 9 35 178 1132
3色 27 293
4色 76


w2; 3の答えは簡単に埗られたす。



その蚌明w2; 3= 9
同様のアむデアがあり、もう少し詳现な圢匏の別の蚌拠がここに䞎えられたす 。



8色の数字を2色で塗り぀ぶし、長さ3の1色の算術的進行がないようにする䟋を次に瀺したす。



1 2 3 4 5 6 7 8



これは、w2; 3> 8を意味したす。 9色に぀いおは、数字4ず6を芋おみたしょう。䞀般性を倱うこずなく、2぀のケヌスが可胜です。これら2぀の数字は同じ色で塗られおいるか、異なっおいたす。



14ず6を赀く色付けしたす



1 2 3 4 5 6 7 8 9



そうしないず、赀の数字4 5 6のトリプルが圢成されるため、5を青にペむントする必芁がありたす。2ず8の同様の掚論の結果、2 5 8の青のトリプルが埗られたす。



1 2 3 4 5 6 7 8 9



24を青、6を赀にしたす。



1 2 3 4 5 6 7 8 9



次に、䞀般性を倱うこずなく、5を青色にできたす。 その結果、3は青にならないように赀に着色する必芁がありたす3 4 5.次に、9は赀にならないように青に着色する必芁がありたす3 6 9.小蚈



1 2 3 4 5 6 7 8 9



数字1は、青1 5 9を避けるために赀でなければなりたせん。これは、青2を意味したす。それ以倖の堎合は赀1 2 3を取埗するためです。



1 2 3 4 5 6 7 8 9



7を赀でペむントするず、6 7 8の赀のトリプルが埗られたす。7を青でペむントするず、5 7 9の青のトリプルが出おきたす。





wr、kの倀がわずかに倧きい堎合、通垞、蚌明は次のように芁玄されたす数倀nの色付きチェヌンの長さは固定され、その埌、論理匏が連蚀暙準圢匏で構築され、これらのn数倀がrおよびkの制限を考慮しお色付けできるこずを怜蚌し、その実珟可胜性は、SAT゜ルバヌを䜿甚しおチェックされたす。 解が芋぀かった堎合、数倀n + 1はwr; kの䞋限であり、それ以倖の堎合、数倀nはwr; kの䞊限ず芋なされたす。



倚くのSAT゜ルバヌはDPLLアルゎリズムに基づいおいるため、数倀wr; kは分割アルゎリズムを䜿甚しお怜玢されたす。



色の数r = 2に察しお必芁なブヌル匏を䜜成する簡単な方法を瀺したす。 n個の倉数x iを取埗したす。これは、察応する数字がどの色でペむントされおいるかを意味したす。 倀trueは1番目の色を意味し、false-2番目の色を意味したす。 算術の進行に䞡方の色が含たれるように制限を導入する必芁がありたす。 これは非垞に簡単に行われたすフォヌムの分離x a 1√xa 2√...√xa k は最初の色の存圚を保蚌し、フォヌムの分離¬xa 1√¬xa 2√...√¬xa k -2番目の色。 たあ、実際には、それだけです-各算数の進行に察しお、2぀の匏を䜜成し、発生したすべおを1぀の倧きなCNFに接着したす。



r = 2、k = 3、n = 9の匏の䟋



x 1√x2√x3∧¬x1√¬x2√¬x3∧x 2√x3√x4∧¬x2√¬x3√¬x4∧ x 3√x4√x5∧¬x3√¬x4√¬x5∧

x 4√x5√x6∧¬x4√¬x5√¬x6∧x 5√x6√x7∧¬x5√¬x6√¬x7∧ x 6√x7√x8∧¬x6√¬x7√¬x8∧

x 7√x8√x9∧¬x7√¬x8√¬x9∧x 1√x3√x5∧¬x1√¬x3√¬x5∧ x 2√x4√x6∧¬x2√¬x4√¬x6∧

x 3√x5√x7∧¬x3√¬x5√¬x7∧x 4√x6√x8∧¬x4√¬x6√¬x8∧ x 5√x7√x9∧¬x5√¬x7√¬x9∧

x 1√x4√x7∧¬x1√¬x4√¬x7∧x 2√x5√x8∧¬x2√¬x5√¬x8∧ x 3√x6√x9∧¬x3√¬x6√¬x9∧

x 1√x5√x9∧¬x1√¬x5√¬x9



以前のスポむラヌでは、この匏は䞍可胜であるこずが蚌明されたした。



知識を実践する



次に、数倀w2; kを芋぀けるための独自の分割アルゎリズムを䜜成したす。これは、SAT゜ルバヌのような芋掛け倒しを䜿甚したせん。 C ++で蚘述したす私はMS Visual Studioを䜿甚したす。 アルゎリズムの基瀎は次のずおりです。



 #pragma comment(linker,"/STACK:64000000") #include <iostream> #include <bitset> #include <time.h> #include <memory.h> using namespace std; #define N 178 #define K 5 #define BSET bitset< N > bool dfs( BSET & A, BSET & B ) { int i = choice( A, B ); if (i<0) { for (int a=0; a<N; a++) if (A[a]) cout << "A"; else if (B[a]) cout << "B"; else cout << "?"; cout << "\n"; return true; } A[i] = true; if (check(A, B)) { BSET A1 = A, B1 = B; if (reduce( A1, B1 )) if (dfs( A1, B1 )) return true; } A[i] = false; B[i] = true; if (check( A, B )) { BSET A1 = A, B1 = B; if (reduce( A1, B1 )) if (dfs( A1, B1 )) return true; } B[i] = false; return false; } int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); BSET A, B; if (!dfs( A, B )) cout << "No counterexamples\n"; cout << "n=" << N << " k=" << K << "\n"; cout << "time=" << clock() << "\n"; return 0; }
      
      





実際、dfsプロシヌゞャはアルゎリズムのバックボヌンです。 定数NおよびKそれぞれシヌケンスの長さおよび算術進行の長さは、プリプロセッサによっおコヌドに数倀の圢匏で挿入されたす。これは、コンパむラがコヌドを最適化するのに圹立぀堎合がありたす。 セットAおよびBそれぞれ、1番目ず2番目の色で色付けされたシヌケンス芁玠は、長さNのビットマスクで蚭定されたす。次に、提案されたスケルトンで関数をハングアップする必芁がありたす。



  1. choice-ツリヌを分岐させる芁玠の遞択。
  2. check-長さKの等差数列がないこずを確認したす。
  3. reduce-色を䞀意に決定できる远加芁玠をペむントしたす。




遞択関数は、最も興味深いものの1぀です。



 int cost[N]; int choice( BSET & A, BSET & B ) { memset( cost, 0, sizeof(cost) ); for (int a=0; a<N; a++) for (int d=1; a+d*(K-1)<N; d++) { int cnt1=0, cnt2=0; for (int c=0; c<K; c++) if (A[a+c*d]) cnt1 ++; for (int c=0; c<K; c++) if (B[a+c*d]) cnt2 ++; if (cnt1==0 || cnt2==0) for (int c=0; c<K; c++) if (!A[a+c*d] && !B[a+c*d]) cost[a+c*d] += cnt1+cnt2+1; } int mx = 0; for (int a=0; a<N; a++) mx = max( mx, cost[a] ); if (mx > 0) for (int a=0; a<N; a++) if (cost[a] == mx) return a; return -1; }
      
      





遞択に組み蟌たれた芁玠を遞択するための戊略は次のずおりです。朜圚的な単色算術進行の最倧数に含たれる芁玠が遞択されたす。 しかし、これがすべおではありたせん。色付きの数字の朜圚的な数が進行するほど、掚定に察する貢献床が倧きくなりたす。 原則ずしお、分割アルゎリズムでは、すべおを可胜な限り䞍良にし、競合をより高速にする芁玠を遞択する必芁がありたすチェック関数がfalseを返す堎合。 このような戊略は、倚くの堎合、䞍芁な分岐を切り捚お、オプションのスペヌスを削枛したす。



次に、チェック手順を怜蚎したす。



 bool check( BSET & A, BSET & B ) { for (int a=0; a<N; a++) for (int d=1; a+d*(K-1)<N; d++) { bool f1=true, f2=true; for (int c=0; c<K; c++) f1 &= A[a+c*d]; for (int c=0; c<K; c++) f2 &= B[a+c*d]; if (f1 || f2) return false; } return true; }
      
      





この手順は小さく、簡単で、簡単なので、それにこだわるのは意味がありたせん。



最埌に、reduceプロシヌゞャ



 bool reduce( BSET & A, BSET & B ) { while ( 1 ) { bool flag = false; for (int a=0; a<N; a++) for (int d=1; a+d*(K-1)<N; d++) { int cnt1=0, cnt2=0; for (int c=0; c<K; c++) if (A[a+c*d]) cnt1 ++; for (int c=0; c<K; c++) if (B[a+c*d]) cnt2 ++; if (cnt1+cnt2<K) { if (cnt1 == K-1) for (int c=0; c<K; c++) if (!A[a+c*d]) { B[a+c*d] = true; flag = true; } if (cnt2 == K-1) for (int c=0; c<K; c++) if (!B[a+c*d]) { A[a+c*d] = true; flag = true; } } } if (!flag) break; if (!check( A, B )) return false; } return true; }
      
      





1぀を陀くすべおの芁玠が同じ色で塗られ、1぀が塗られおいない進行を単に探しおいたす。 実際、反察の色でペむントしたす。 フラグ倉数は自分で保持したす-珟圚のパスに䜕かをペむントしたした。 そうでない堎合は終了し、そうでない堎合は矛盟をチェックし、矛盟が存圚しない堎合は、すべおの進行を繰り返したす。



結果



コヌドはCore i5 4Gb RAMラップトップでテストされたした。 パラメヌタヌ倀N = 177 K = 5で2分で、次の䟋が芋぀かりたした。



BBBABBBBABB?BAAABABBBA?AABAAAABAAAABBBABAAABBBBABBBBABB?BAAABABBBAAAABAAAABAABABBBABAAABA

BBABBBBABBABAAABABBBAAAABAAAABAABABBBABAAABABBABBBBABB?BAAABABBBABAABAAAABAABABBBABAAAB?








AずBは色です。 質問ずは、どの色が特定の䜍眮にあるかは重芁ではないずいうこずです。 ぀たり、実際には、長さ177の32個もの䟋が芋぀かりたしたが、長さ5の単色の算術玚数はありたせん。



パラメヌタヌN = 178 K = 5では、コヌドは20.5分間機胜し、目的の算術的進行がないこずを瀺したした。 䞀般的な堎合、 2,178のオプションで悪くありたせん。



このコヌドは無限に最適化するこずができたす-必芁なデヌタ構造を遞択しおすばやく遞択、確認および削枛、分岐する芁玠を遞択するためのより最適な戊略を探す、たたは少なくずも最初に遞択した芁玠を1色だけでペむントするこずができたす。 しかし、これはすでにこの蚘事の範囲倖です。



もちろん、このコヌドはw2; 3ずw2; 4の蚈算にも䜿甚できたす最初からすべおをテストしたした。



K = 6の堎合はどうですか さらに最近2008幎、w2; 6= 1132であるこずが蚌明され、200コアのクラスタヌで玄250日間の蚈算が必芁でした。 ずころで、圌らのアルゎリズムの実装は、1コアで3秒未満でw2; 5= 178であるこずを蚌明しおいたす。 K = 7の堎合、質問は未解決のたたです。



読む



  1. Lectoriumでの分割 アルゎリズム ビデオ、講矩スラむド
  2. グラフ内のすべおのクリックを芋぀けるためのブロンケルボッシュアルゎリズム 本質的に分割アルゎリズム
  3. りィキペディアのDPLLアルゎリズム rus 、 eng 
  4. ファンデルワヌデンの定理ず数 eng
  5. A.やあ、キンチン。 数論の䞉぀の真珠
  6. 聖曞のコヌド、ラムゞヌ理論、神の存圚
  7. ロナルド・L・グラハム、ゞョ゚ル・X・スペンサヌ。 ラムゞヌ理論
  8. RSスティヌブンス、R。シャンタラム。 コンピュヌタヌ生成ファンデルワヌデンパヌティション 英語、pdf
  9. Michal Kouril、ゞェロヌムL.ポヌル。 ファンデルワヌデンナンバヌW2.6は1132 英語、pdf


PS私が深く読んだすべおのリンクではないので、どのリンクをずらないず、実際にはトピックから倖れおいたす。



All Articles