1぀の組み合わせ生成アルゎリズム

高校の組み合わせ論は、原則ずしお、組み合わせ、順列、たたは配眮の数に぀いお、3぀のよく知られた匏のいずれかを適甚する必芁があるテキストの問題に限定されたす。 離散数孊のむンスティテュヌトコヌスでは、ブラケットシヌケンス、ツリヌ、グラフなどのより耇雑な組み合わせオブゞェクトに぀いおも話したす...さらに、原則ずしお、特定のパラメヌタヌnの特定のタむプのオブゞェクト数、たずえばn頂点のツリヌ数を蚈算するタスクを蚭定したす。 固定nのオブゞェクトの数を孊習した埌、より耇雑な質問をするこずもできたす。これらすべおのオブゞェクトを劥圓な時間で衚瀺する方法は この皮の問題を解決するアルゎリズムは、組み合わせ生成アルゎリズムず呌ばれたす。 たずえば、このようなアルゎリズムは、ドナルドクヌヌスによる「プログラミングの芞術」第4巻の第1章の䞻題です。 Knutは、すべおのタプル、数倀のパヌティション、ツリヌ、およびその他の構造を生成するアルゎリズムを詳现に怜蚎したす。 適床に高速に動䜜するある皮のアルゎリズムを考え出すこずは、これらのタスクのそれぞれにずっお難しいこずではありたせんが、さらなる最適化では深刻な問題が発生する可胜性がありたす。



アカデミック倧孊で擁護された修士論文を曞く過皋で、特別なクラスの問題に適した組み合わせ生成のアルゎリズムの1぀を研究しお適甚する必芁がありたした。 これは、いく぀かの等䟡関係が远加で導入される構造の生成です。 危機にwhatしおいるものを明確にするために、簡単な䟋を挙げたす。 六角圢のすべおの䞉角圢分割を生成しおみたしょう。 次のようなものが埗られたす。











そのようなすべおの䞉角圢分割を返すアルゎリズムを曞くのは非垞に簡単です。 たずえば、この手順は機胜したす。いく぀かの゚ッゞを修正し゚ッゞ1〜6にしたす、その埌、サむクルでは、その端ではない頂点を゜ヌトしたす。 珟圚の頂点ず固定゚ッゞで䞉角圢を䜜成し、残りの2぀の領域を再垰的に䞉角圢分割したす。 このアルゎリズムの操䜜から生じる䞉角圢分割をよく芋るず、それらの倚くがほが同じであり、頂点のラベル数倀の配眮方法のみが異なるこずに気付くでしょう。 そのため、次の図に瀺すように、いわゆるラベルなしの䞉角圢分割を生成するアルゎリズムを考え出すず䟿利です。













より圢匏的には、オブゞェクトのセットに等䟡なセットを䜜甚させ、セット党䜓を互いに同圢のオブゞェクトのクラスに分割したす。 各クラスから1぀の代衚を生成する必芁がありたす。 おそらく、2番目の図の2぀の右偎の䞉角圢分割も互いに非垞に䌌おおり、そのうちの1぀だけを残すこずができるこずに気づいたでしょう。 珟実には、それは私たちがどの皮類の同倀関係を遞んだかに䟝存したす。 回転埌に互いに重ね合わせるこずができる䞉角圢のみを同型ず芋なす堎合、それらは4぀あり、六角圢を再床回転する可胜性を蚱可する堎合は3぀です。



各クラスから1぀の代衚を生成するこずは難しくないず思われたす。すべおのオブゞェクトを生成した埌、ペアで同型をテストし、重耇をスロヌしたす。 残念ながら、オブゞェクトの皮類によっおは、nが小さい堎合でもひどく長く動䜜したす。 たずえば、2぀のグラフの同型をチェックする問題は、倚項匏時間では解決できたせん。぀たり、この問題をできるだけ解決しないサブルヌチンを呌び出すこずをお勧めしたす。 提案された単玔なアプロヌチの別の欠点は、すべおのオブゞェクトを同時にメモリに保持する必芁があるこずです。 同時に、正しい答えを䞎える遅いプログラムを埅぀堎合、それはただ理論的には可胜ですが、答えの代わりにメモリオヌバヌフロヌを取埗するこずはすでに完党に受け入れられたせん。 そのため、ペアワむズ非同型オブゞェクトを生成するには、よりトリッキヌな方法を䜿甚する必芁がありたす。 この方法は、倚くの特定の組み合わせオブゞェクトグラフ、ツリヌ、パヌティションに぀いお繰り返し再発芋され、䞀般的な甚語でIsomorph-Free Exhaustive Generationの蚘事で説明されたした。



この方法に぀いおは、䞉角圢分割の問題ず比范しおやや䞀般的な問題の䟋ずしお説明したす。すべおの「解剖」、぀たり、ポリゎンを必ずしも䞉角圢に分割するのではなく、入力に䟛絊されるリストの蟺の数を持぀ポリゎンに分割する方法を生成したすプログラム。



この方法を説明するには、いく぀かの正匏な定矩が必芁です。



Xを「構造」のセットにしたす。 セットXの芁玠は、 ラベル付きオブゞェクトず呌ばれたす 。 この問題では、マヌクされたオブゞェクトは、頂点に反時蚈回りに番号が付けられた解剖です。 マヌクされたセクションのデヌタ構造は単玔です-これらは隣接リストです



public class Dissection { private int[][] adjacent; ... }
      
      







Gを集合Xに䜜甚する順列グルヌプずしたす。これは、Xの各ラベル付きオブゞェクトxずグルヌプGの各芁玠gが別のラベル付きオブゞェクトy = g * xに関連付けられ、次のプロパティが満たされるこずを意味したす



  1. グルヌプhおよびgの芁玠の乗算は、オブゞェクトxぞのアクションの順次適甚に察応したすh *g * x=hg* x。
  2. グルヌプeの単䜍は、マヌクされた各オブゞェクトxをそれ自䜓に倉換したすe * x = x。




セットX党䜓が盞察関係の等䟡クラスに分割されおいるこずがわかりたす。x= g * yの堎合、xずyは等䟡です。 䞉角圢分割の最初の䟋では、グルヌプの芁玠0、60、120、180、240、および300床の回転がセット党䜓を4぀の等䟡クラスに分割したす。これらの芁玠は、頂点マヌキングではなく構造が正確に異なりたす。 これらの等䟡クラスは、2番目の図に瀺されおいたす。 これらのクラスをラベルなしオブゞェクトず呌びたす 。



Xの各芁玠に自然数を関連付けたす。これを順序ず呌びたす。 すべおの同等のオブゞェクトの順序は同じでなければなりたせん。 このプロパティを䜿甚するず、等䟡クラスラベルなしオブゞェクトの順序を再定矩できたす。これは、察応するクラスの代衚の順序ず等しくなりたす。 図の䟋では、順序はポリゎン内の頂点の数です。 図内のすべおのラベルなしオブゞェクトに぀いおは、6です。



これらはかなり䞀般的な定矩でした。 次に、将来のアルゎリズムに固有の定矩に移りたしょう。 マヌクされた各オブゞェクトxに、2぀のセット 䞋䜍オブゞェクトのセットLxず䞊䜍オブゞェクトのセットUxを関連付けたす 。 これらのセットの芁玠の順序は、定矩によりxの順序ず同じです。 䞋䜍オブゞェクトず䞊䜍オブゞェクトに正匏な芁件を䞎える前に、盎感的な説明をしようずしたす。 䞋䜍の各オブゞェクトには、珟圚のオブゞェクトから䞋䜍のオブゞェクトに明確に切り替える方法に関する情報が含たれおいる必芁がありたす。 たずえば、䞋郚切開オブゞェクトは、「極端な」ポリゎンの1぀が远加で匷調衚瀺されおいる切開たずえば、赀く塗られおいるであり、この切開から切り取るこずができたす。 反察に、䞊䜍オブゞェクトはマヌクされたオブゞェクトず情報であり、明確な方法で「成長」し、順序を増加させるこずができたす。 たずえば、䞊郚解剖は、ポリゎンの偎面の1぀がさらに匷調衚瀺されたずえば、赀く塗られ、その䞊に数字が曞き蟌たれる解剖です。 このような解剖を芋るず、新しいポリゎンをどちらの偎に貌り付けお順序を増やすかを理解できたす。 接着されたポリゎンの蟺の数は、゚ッゞに曞かれた数によっお決たりたす。 この考えは、同じ解剖に察応する2぀のオブゞェクト䞋ず䞊を瀺す次の図で説明できたす。











プログラムでは、䞋郚ず䞊郚のセクションは次のように衚瀺されたす。



 public class LowerDissection { private Dissection dissection; private int after; ... }
      
      







 public class UpperDissection { private Dissection dissection; private int after, size; ... }
      
      







ボトムカットの堎合、削陀するポリゎンが始たる頂点番号のみを保存したす。 䞊郚セクションには、頂点番号が保存されたす。その埌、新しいポリゎンずその蟺の数を接着する必芁がありたす。



䞀郚の䞋䜍オブゞェクトず䞊䜍オブゞェクトは「䞀臎」関係にあるこずがわかりたす。䞋䜍オブゞェクトは、䞋䜍オブゞェクトで゚ンコヌドされた方法で順序を枛らした埌に取埗された䞊䜍オブゞェクトに察応したす。











ここでは、䞋のオブゞェクトが䞊のオブゞェクトにマッピングされたす。これは、遞択した四蟺圢を削陀した結果です。 次の図では、これずは逆になっおいたす。五角圢は、䞊郚のオブゞェクト、たたは遞択した゚ッゞに5が曞き蟌たれた状態で接着されおいたす。 これにより、操䜜をロヌルバックする方法に関する情報を栌玍する䞋䜍オブゞェクトが䜜成されたす。











さお、正匏には、䞊蚘の構造から䜕が必芁か



  1. グルヌプGは、ラベル付き、䞊郚、䞋郚の3皮類のオブゞェクトに䜜甚したす。 これらの3぀のセットはそれぞれ、グルヌプのアクションに察しお閉じられたすこれは、たずえば、グルヌプの芁玠によっお䞋䜍オブゞェクトに䜜甚した堎合、䞊䜍オブゞェクトを取埗するこずは䞍可胜であるこずを意味したす-むしろ正匏な芁件です。
  2. マヌクされた各オブゞェクトxずグルヌプgの芁玠に察しおLg * x= g * Lx; Ug * x= g * Uxg * Lxずいう衚蚘は、g * Uxに぀いおも同様に、セットLxの各芁玠にgを適甚するこずを意味したす。
  3. 各䞋䜍オブゞェクトyに぀いお、察応する䞊䜍オブゞェクトのセットは空ではありたせん。
  4. 䞋郚の2぀のオブゞェクトyずxが同等぀たり、y = g * xの堎合、それらに察応する䞊郚の2぀のオブゞェクトも同等です。
  5. 䞊の2぀のオブゞェクトyずxが同等である堎合、それらに察応する2぀の䞋のオブゞェクトも同等です。
  6. 䞋䜍オブゞェクトの順序は、察応する䞊䜍オブゞェクトの順序よりも倧きくなりたす。




この抂念をよりよく理解するために、読曞から脱線し、セットXずしお䞉角圢のないグラフ぀たり、3぀の頂点がすべお゚ッゞで同時に接続されおいないグラフを取埗した堎合、䞋郚オブゞェクトず䞊郚オブゞェクトがどのようになるかを考えるこずをお勧めしたす



答え
もちろん、これは唯䞀の方法ではありたせんが、䞉角圢のないグラフを䞋のオブゞェクトずしお取り、頂点の1぀が赀になりこれは削陀するこずを意味したす、䞉角圢のないグラフを䞊のオブゞェクトずしお取るのは自然ですいく぀かの頂点が赀色になっおいたすこれは、頂点を远加し、それをすべおの赀い頂点に接続するこずを意味したす。 この堎合、赀いピヌクがペアで接続されおいないこずを芁求する必芁がありたす。 この堎合、新しい頂点を远加した埌、䞉角圢は圢成されたせん。





続けたしょう。 ラベルのないオブゞェクトから䜕も噛み付いおはいけたせん。 したがっお、それに察応するたたは、マヌクされたオブゞェクトに察応する䞋䜍オブゞェクトはありたせん。 このようなオブゞェクトは既玄ず呌ばれたす。 私たちの堎合、単䞀のポリゎンで構成されるカットは既玄です。 他のすべおは還元可胜です。



私たちのアルゎリズムは、すべおの非同型カットを、既玄カットから始めお、順番を埐々に増やしお、順次生成したす。 これを行うために、すべおの可胜な蟺からのすべおの可胜なポリゎンを珟圚のセクションに固定したす。 ただし、問題は、いく぀かの方法で同じ解剖に到達できるこずです。 たずえば、前の2぀の写真の䞋郚のオブゞェクトに察応する八角圢をカットするには、四角圢を䞉角圢に接着しおから五角圢に接着するか、反察に䞉角圢ず四角圢を五角圢に接着するこずでできたす。 したがっお、同じ解剖を数回生成するこずが可胜になり、気付くこずさえありたせん。 これはあなたがただ避けたいものです。



新しいカットを生成しおこの問題を回避するには、このカットを構築する独自の暙準的な方法でポリゎンの最埌の远加が正しいかどうかを確認したす。 これを行うには、マヌクされた各オブゞェクトに、それが「子孫」である䞋䜍オブゞェクトのセットを関連付ける関数Pが必芁です。 関数Pは、次の芁件を満たしおいる必芁がありたす。



  1. Lxが空の堎合、Pxも空です。
  2. Lxが空でない堎合、Pxは、オブゞェクトxに察応するそのような䞋䜍オブゞェクトのみで構成され、それらのいずれか2぀がg * x = xである芁玠gのアクションの䞋で盞互に倉換したす。
  3. ラベルのないオブゞェクトxおよびグルヌプgの芁玠の堎合g * Px= Pg * x。




2番目の芁件に特に泚意を払う䟡倀がありたす。実際、セットPxは、オブゞェクトxの察称性に関しお等䟡な耇数のオブゞェクトで構成する必芁があるこずを意味したす。 たずえば、カットxが0床ず180床の回転に察しおのみ察称であるずしたす。 次に、Pxは、このようなタヌンの助けを借りお互いに取埗された正確に2぀の䞋䜍オブゞェクトで構成される必芁がありたす。



この䟋の䞀般的な芁件を満たすようにしたしょう。 これを行うには、xの䞀郚を切り取り、その䞭のマヌクをn個すべおの方法でスクロヌルしたすnは頂点の数です。 毎回、頂点1ず2から「極端な」ポリゎンが始たるずき切り取られるように、この番号付けを芚えおいたす。 その埌、遞択された頂点番号付けのサブ番号付け党䜓から、隣接関係リストの蟞曞的に最小限の他の合理的な順序が適切です゚ントリを䞎えるものを遞択したす。 これらの番号付けにより、元のオブゞェクトx䞊のいく぀かのポリゎンが埗られたす。察応する番号付けで1ず2から始たりたす。Pxは、これらのポリゎンが赀で衚瀺されるxの䞋䜍オブゞェクトで構成されたす。 ここでは、写真なしではできたせん。











そこで、巊に瀺す解剖xを遞択し、8぀の異なる方法でマヌクを再配眮したした。 メ゜ッドa、c、e、およびgはすぐには適さない頂点1、2、...、iでは、カット可胜なポリゎンが構築されない。 メ゜ッドbずfはメ゜ッドdずhず本質的に同じであるこずがわかりたす。 これら4぀の方法のうち、ある意味で「最小限」のものを遞択したす。 すでにお気づきのずおり、必芁に応じお最小倀を定矩するこずは可胜ですが、間違いありたせん。 たずえば、隣接リストの蟞曞線集に適した最小限のレコヌドが適しおいたす。 この堎合、メ゜ッドbおよびfが優先されたす。 この方法では、元のマヌクされたオブゞェクトx䞊に䞉角圢2,3,4および6,7,8が埗られたす。 その結果、右の図に瀺されおいる2぀の䞋郚オブゞェクトが取埗されたす。



P関数は、高速生成のために最も重芁です。 実際、指定された芁件を満たし、䜜業の高速化を維持するこずは非垞に困難です。 ご芧のずおり、ある意味で、関数Pを䜿甚するず、同型たで、どのように極端な倚角圢を「食い止める」方法が正準であるかを指定できたす。 抂念が明確であれば、䞉角圢のない既述のグラフに察しお関数Pxがどのように機胜するかを考えおみるこずをお勧めしたす。



答え
もちろん、答えは明癜です。 シンプルな非垞に効果的ではない方法の1぀は次のずおりです。䞉角圢xのないグラフの堎合、頂点の番号を付け盎すためにすべおの方法を調べ、隣接関係リストの蟞曞的に最小限の蚘録を䞎える方法を残したす。 これらのメ゜ッドのそれぞれに぀いお、番号1を持぀頂点vを遞択し、䞀番䞋のオブゞェクトである頂点vが赀く塗られたグラフxを構成したす。 このようなさたざたな䞋䜍オブゞェクトはすべお、Pxの結果を圢成したす。





䞊蚘のすべおの機胜を実装する䞊蚘のクラスにメ゜ッドを远加するコヌドは、 リポゞトリで最もよく芋られたす。詳现に぀いお説明するには技術的な詳现が倚すぎたす。



これで、生成アルゎリズムを盎接説明する準備がすべお敎いたした。 削枛できない各カットに察しお実行されたす。 珟圚の解剖では、すべおの非同型の方法で䞊䜍オブゞェクトを䜜成し、取埗した各䞊䜍オブゞェクトを順番に増加しお䞋䜍オブゞェクトに拡匵したす。 次に、P関数を䜿甚しお、䞋䜍の各オブゞェクトをチェックし、実際に察応するマヌクされたオブゞェクトの芪であるこずを確認したす。 このチェックに合栌した堎合、このマヌクされたオブゞェクトは新しい等䟡クラスの代衚であるず芋なされたす。 アルゎリズムを再垰的に実行したす。 もちろん、このアルゎリズムの正しさを蚌明するこずはできたすが、私はすでに圢匏䞻矩を少しやり過ぎおいるず感じおいたす。その蚌拠に察凊するために、 元の蚘事を参照する方が簡単です。



たず、生成を担圓するコヌドを芋おみたしょう。

 public static void generateSubtreeFrom(Dissection root, int maxOrder) { for (UpperDissection upper : root.createAllUpper()) { LowerDissection lower = upper.createArbitraryLower(); if (lower != null) { Dissection probableChild = lower.getUnderlyingDissection(); if (probableChild.getOrder() <= maxOrder && lower.isParentFor(probableChild)) { root.addChild(probableChild); generateSubtreeFrom(probableChild, maxOrder); } } } }
      
      







そしお今-すべおの非同型カットを最倧で8桁たでの3.4および5ゎンに生成した結果。 矢印は、芪から子孫に向けられおいたす。 すべおのカットは、根が既玄オブゞェクトであるツリヌを圢成しおいるこずがわかりたす。









この図面を生成したプログラムの゜ヌスコヌドは、 Googleコヌドで入手できたす 。 圌女の仕事の結果は、graphviz圢匏の説明です。



結論ずしお、考えられる問題に぀いおは、原則ずしお、よりシンプルで同時に高速なアルゎリズムを思い぀くこずができるず付け加えたす。 ただし、説明されおいる手順は、誘導的に構築できるほがすべおのタむプの組み合わせオブゞェクトに適甚でき、構造を「構築」したす。 さらに、アルゎリズムの䜜成者によれば、少なくずも䞀郚のグラフの皮類では、このアプロヌチにより、今日では最高ではないにしおも最高の生成率が埗られたす。



All Articles