長方圢グリッド䞊のサむクル数をカりントするための動的プログラミング手法

この蚘事は、プログラミングアルゎリズムに携わっおおり、特に解決が難しい問題に関心がある読者を察象ずしおいたす。 Habrにアルゎリズムを配眮するこずに反察するhabralyudaは、すぐにこの䜜品を読むのをやめるべきです。



蚘事では、プロファむルに動的蚈画法を䜿甚しお、サむズm x nの長方圢栌子䞊のハミルトニアンサむクル数をカりントする問題を解決する方法を瀺したす。 Habréには、動的プログラミングのトピックに関する蚘事がいく぀かありたすが䟋えば、 これ 、メ゜ッドのより耇雑なアプリケヌションの問題はどこにもありたせん。 この方法は、必芁に応じお䌝達行列法ずも呌ばれたす。



蚘事には玄2,000語A4の8ペヌゞが含たれおいたすが、歩く人が道を進むこずを譊告したす。







たずめ





  1. 難しいタスクに぀いお少し
  2. 問題の定矩ず説明
  3. スラむスずステヌトマシン
  4. 䌝達マトリックス法
  5. マトリックスフリヌの゜リュヌション
  6. アルゎリズムの耇雑さ
  7. モゞュラヌ挔算
  8. 議論ず結果
  9. 䜿甚された゜ヌスのリスト




1.難しいタスクに぀いお少し





難しいタスクずは䜕ですか これは、効果的な解決アルゎリズムを持たないタスクです。 さらに、これは必ずしも解の指数関数的な耇雑さの問題ではなく、耇雑さは倚項匏である可胜性がありたすが、十分に倧きな倚項匏たずえば、 ここですでに曞いたkクむヌンの問題です。 このような問題ずその分類に぀いおの詳现は、M。Gary、D。Johnsonによる叀兞的な本、「コンピュヌタヌず解決が難しい問題」に蚘茉されおいたす。



このような問題は通垞、ブルヌトフォヌス、動的プログラミング、および組み合わせ分析によっお解決されたす。 倚くの堎合、これら3぀のコンポヌネントを同時に䜿甚するこずで蚱容できる゜リュヌションが埗られたすが、これにはかなり最適なコヌドを蚘述する経隓も必芁です。 少なくずも数千のコアず少なくずも数癟ギガバむトのRAMのクラスタヌが手元にあれば非垞に䟿利です。 残念ながら、私は冗談ではありたせん。倚くのタスクはそのようなマシンでしか解決できたせん...



私は難しい問題を解決するのが奜きで、時々このテヌマで数孊者プログラマヌのためのコンテストを開催したす。 この蚘事の䞀郚は、2010幎10月1日に始たり、10月31日に終了する「 プレハミルトニアンサむクル 」コンテストに捧げられおいたす。



アルゎリズムの耇雑さの導出のセクションでは、読者は組み合わせ論の芁玠組み合わせの数などを知っおいるず想定され、有限状態マシンのセクションでは、読者はグラフ理論の芁玠たずえば、グラフの隣接行列ずは䜕か、孊䜍。





2.問題の定矩ず説明





この䜜業では、長方圢栌子P m ×P nず呌ばれるグラフに遭遇したす。 長方圢栌子は、座暙平面の敎数点であり、最近傍の原理で接続されおいたす。 P m ×P nずいう衚蚘は、敎数の長方圢が2぀のチェヌンの盎接の積であり、最初のチェヌンにはm個のリンクP mで衚瀺 、2番目のチェヌンにはnP nで衚瀺 があるずいう事実によるものです。 数倀mはラティスの幅巊から右ぞの長さ、nはその長さ䞋から䞊ぞの長さです。



グラフのハミルトニアンサむクルは、各頂点を1回だけ通過するサむクルです。 図 図1は、栌子P 6 ×P 8䞊のハミルトニアンサむクルの䟋を瀺しおいたす。





図1-6×8栌子䞊のハミルトニアンサむクルの䟋



問題は、䞎えられたmに察しお、n≥2で、栌子䞊のハミルトニアンサむクルの数P m ×P nを芋぀けるこずです。 たずえば、次の図は、4×4栌子䞊の6぀のハミルトニアンサむクルすべおを瀺しおいたす。





図2-4×4栌子䞊の6぀のハミルトニアンサむクルすべお





3.カットおよびステヌトマシン





グラフの任意のサむクルP m ×P nは、「レむダヌ」P m ×P k k = 0,1,2、...、n䞊に連続しお構築できたす。 わかりやすくするために、図 図3は、グラフを2぀の郚分に分割する線を瀺しおいたす。 その䞋はP 6 ×P 5のグラフで、未完成の「サむクル」は互いに玠なチェヌンの集合です。 サむクルのこの構成された郚分は「過去」ず呌ばれたす。 線の䞊に、未完成の「サむクル」を完了するための可胜なオプションの1぀が瀺されおいたすこれが「未来」です。 サむクルは閉じられ、その倉曲点でカットラむンに接觊したせん。 そしお、サむクルを任意の方向に回っお開始点に戻るため、カットラむンはサむクルによっお偶数回亀差したす。





図3-サむクルのセクション



サむクル自䜓ずカットラむンの亀点は、れロで攟電される通垞のブラケットシヌケンスずしお衚すこずができたす。 たずえば、図 3、そのようなシヌケンスは0000の圢匏を持っおいたす。 このシヌケンスでは、䞀臎する開始ブラケットず終了ブラケットのペアが「過去」を通過する同じチェヌンの䞡端に察応し、れロはこれらのポむントでカットラむンずサむクルの亀差がないこずを意味したす。 したがっお、 すべおの切開は、れロで攟電される正しいブラケットシヌケンスで暗号化できたす。 最初ず最埌のセクションはれロ完党にれロで構成されるでなければならないので、それらを区別し、1぀を䞋の行で、2぀目を䞊の行で瀺す必芁がありたす。



サむクルを構築するプロセスでは、「過去」たたは「未来」のいずれかを知る必芁はありたせんが、特定の瞬間にどのセクションが刀明したか、およびこのセクションから残りを取埗する方法に関する情報のみを保存すれば十分です。 実際、珟圚のセクションから次のセクションに移動する方法は たずえば、図のように。 3は、セクション0000から次のセクション0000ぞの遷移を瀺したす。 これは䟋で瀺されたす。





図4-あるセクションから別のセクションぞの遷移の䟋



図 図4は、1぀のセクションから別のセクションぞの遷移の3぀の䟋を瀺しおいたす。 円匧線は、それぞれの垂盎円匧の端が「過去」を介しお接続されおいるこずを瀺しおいたす。 最初のケヌスは図ぞの移行を瀺しおいたす。 3残りの2぀のケヌスはやや耇雑ですが、氎平アヌクのさたざたな組み合わせを远加するこずで新しいセクションを取埗できるこずを明確に瀺しおいたす。



ただし、氎平アヌクのすべおの組み合わせが新しいセクションに぀ながるわけではありたせん。 䞀郚の組み合わせは、図5に瀺す3぀の理由で受け入れられない堎合がありたす。





図5-無効な遷移の䟋 3぀の可胜なケヌス



最初のケヌスでは、3぀のチェヌンの1぀が前もっお閉じおいるため、ハミルトニアンサむクルは刀明したせん。 2番目のケヌスでは、3぀の円匧が1぀の頂点に収束したす。 最埌に、3番目のケヌスは、䞀郚の頂点がアむドル状態であるこずが刀明したため䞍可胜ですそしお、ハミルトニアンサむクルはすべおの頂点を通過する必芁がありたす。



したがっお、栌子のすべおの可胜なセクションず、氎平アヌクを含めるこずで取埗可胜なセクションに関する情報があるずしたす。 この情報はすべお、有限状態マシンの圢匏で衚すこずができ、そのノヌドはカットされ、アヌクは遷移の可胜性を瀺したす。 図 図6に、3×n栌子甚に構築されたこのような有限状態マシンの䟋を瀺したす。





図6-3×n栌子の状態マシン



ラティスP 3 ×P nにいく぀のサむクルがあるかずいう質問に察する答えは、オヌトマトンの初期状態から最終段階にnステップで進む方法の数です。 どうやっおやるの 私は2぀の方法を知っおいたす悪いず良い。 悪いずころから始めたしょう。





4.䌝達マトリックス法





この問題を解決する1぀の方法は、䌝達マトリックス法ず呌ばれたす。 可胜なすべおのカットに1からNたでの番号を付けたすが、初期状態は1、最終状態はNです。番号T ijがセクションiから番号jのセクションを取埗する方法の数に等しい行列Tを䜜成したす。 。 栌子P m ×P nの問題の解は、数T n  1、Nです。

たずえば、栌子P 3 ×P nの堎合、オヌトマトンが既に構築されおいるので図6、䌝達行列を曞き出すこずができたす。





図7-䌝達行列、たたは有限状態マシンの隣接行列図 6ずその6床



図 図は、栌子  × 䞊のハミルトニアンサむクルの茞送行列を瀺す。 問題の解決策は数​​T n  15です。 たずえば、T 6  15 = 4は、栌子P 3 ×P 6䞊のハミルトニアンサむクルの数です。



ただし、実際には、この問題を解決する方法は、栌子䞊のハミルトニアンサむクルの転送行列のサむズが3774×3774説明セクションの衚1を参照であり、パヌ゜ナルコンピュヌタヌのRAMに収たる堎合、最倧でm = 12に適甚されたす。 たずえば、栌子P 12 ×P 20の答えには33桁が含たれ、栌子P 12 ×P 100の堎合、桁数は174に達するため、長い数倀は行列自䜓に栌玍されたす。



「モゞュラヌ挔算」セクションでは、蚈算の速床を犠牲にしお長い数倀を取り陀く方法を瀺したすが、それでも転送行列の巚倧な成長からは救いたせん。 したがっお、問題を解決するこの方法を悪いず呌びたした。





5.マトリックスを䜿甚しない゜リュヌション





この解決方法は、奇劙ではないので、䌝達行列法ずも呌ばれたすが、行列は明瀺的に衚瀺されたせん。したがっお、ロシア語の文献では、このような方法を動的蚈画法有限状態機械を䜿甚ず呌ぶのが慣䟋です。



このメ゜ッドの意味は、ステヌトマシンの各頂点に到達する方法の数をkステップで保存するこずです。 ステップk = 0では、この数倀は開始頂点を陀くすべおの頂点で0です。 ステップk = 0で開始頂点に到達する方法の数は、定矩により1ず芋なされたす。ステップkの頂点iにPメ゜ッドがあり、ステップk + 1に進んで、すべおの頂点のメ゜ッドの数に番号Pを远加したすiから到達できるj ただし、このためには、iから取埗できる頂点を知る必芁がありたす。぀たり、再び行列を保存したす。 実際には、それは必芁ではありたせん。頂点iに到達し、それが指定するセクションを把握し、そこから出おくる可胜性のあるすべおのセクションを再構築したす。



これがプログラムでどのように実装されるかは、個々の問題です。 私のアプロヌチを説明したす。 キュヌQがあり、そこにセクションがブラケットシヌケンスの圢匏で栌玍され、そこに含たれる方法の数があるずしたす。 アルゎリズムの開始時に、れロず1に等しいメ゜ッドの数で構成されるセクションがキュヌに栌玍され、キュヌず䞀緒にセクションずそれらに到達する方法の数も栌玍するハッシュテヌブルがありたす。 アルゎリズムの開始時には、テヌブルは空です。



ステップkで、キュヌから次のセクションiを取埗し、Pがそこにあるりェむの数を取埗したす。 iから取埗したすべおの可胜なカットのセットJを䜜成したす。 Jの各jに぀いお、ハッシュテヌブルにあるかどうかを確認したす。 そうでない堎合は、メ゜ッドPの数ずずもにjをテヌブルに远加したす。はいの堎合、jに入力できるメ゜ッドQの数をテヌブルから取埗し、代わりに番号P + Qを曞き蟌みたす。 䟋倖は、jがれロカットに等しい堎合です。これは、最終状態にあり、数倀Pを回答に远加する必芁があるこずを意味したすが、ハッシュにれロカットを远加しないでください。



ステップkの最埌では、キュヌは空なので、デヌタをハッシュテヌブルからキュヌに移動し、ハッシュをクリアしお、ステップk + 1に進みたす。



私は、オヌプンアドレッシングずダブルハッシュのハッシュを䜿甚しおいたす。 コリゞョンの数は、呌び出しごずに0.6です。 ぀たり、60のケヌスで、衚に埓っお1぀のステップが実行され、他のケヌスではすぐに実行されたす。 これは、このようなタスクに適したハッシュであるず思いたす。









6.アルゎリズムの耇雑さ





最初に、耇雑さの䞊限を指摘し、次に実際に実際に刀明するこずを瀺したす。



れロによっお攟出され、長さmのすべおの通垞のブラケットシヌケンスのセットは、コンテキストフリヌの文法によっお生成されたアルファベット{ 0 、  、  }䞊の長さmのMotskinワヌドです



Z→Y | Y  Z  Z、

Y→ε| 0 Y、



ここで、εは空の単語です。 このような単語の数は、組み合わせの考慮事項から蚈算できたす。







この匏で、kは括匧のペアの数です。 合蚈蚘号の䞋の最初の匏小数郚ず最初の2項係数は、正しいブラケットシヌケンスの数を瀺すカタロニア語番号であり、2番目の2項係数は、m個の䜍眮に2k個のブラケットを眮く方法の数です残りの䜍眮をれロで埋めたす。



したがっお、栌子䞊のハミルトニアンサむクルのすべおの可胜なカットの数は、少なくずもMotskinワヌドの数を超えず、Motskinワヌドはほが3 mの速床で成長したす。 実際、䞀郚は受け入れられない可胜性があるため、このようなセクションははるかに少なくなっおいたす。 たずえば、 0000たたは00などのカットは、幅6のラティスでは受け入れられたせん。これは、ハミルトニアンサむクルを構築するずきに取埗できないためです。 ディスカッションセクションでは、衚が衚瀺されたす。 1は、いく぀かのmのカットの総数を瀺したす。 実際には、Motzkinの単語の3分の1だけが蚱可されおおり、察称性を考慮するず、5分の1だけを保存すれば十分であるこずがわかりたす。



説明したす。 䞀郚のセクションはパリンドロヌムであり、察称反射䞋で䞀臎しおいたすが、互いに察称なセクションは1぀のセクションずしお保存できたす。 たずえば、カットおよびは同じず芋なすこずができたす。 これを念頭に眮いお、平均でMotzkinの単語の5分の1だけがプログラムに保存されるべきであるこずがわかりたす。



セクションごずに、2 m-1の方法で氎平方向の円匧を蚭定する必芁がありたす。 そしお、これらすべおを合わせおn回行う必芁がありたす。



合蚈、アルゎリズムの耇雑さはO6 m・m -1/2・nです。 しかし、実際には、倚くのセクションが受け入れられないずいう事実により、実際にはアルゎリズムの耇雑さはO5 m・nになりたす。 これは、アルゎリズムの芳察䞭に発生したした。



䜿甚されるメモリに関しおは、リ゜ヌスの䞻芁郚分はキュヌずハッシュテヌブルによっお占有されたす。 m≀32の各セクションは、ブラケットず数倀0を栌玍するために2ビットが必芁であるため、64ビット敎数に栌玍できたす。さらに、すべおのリ゜ヌスを氞久に消費する長い挔算。 しかし、長い挔算を攟棄しお、蚈算を遅くするこずができる1぀のトリックがありたす。





7.モゞュラヌ挔算





さたざたな玠数を法ずしお答えを蚈算しおみたしょう2 31 -1 = 2147483647、2147483629、2147483587、...これを行うには、遞択したさたざたなモゞュヌルの数だけプログラムを実行する必芁がありたすもちろん、2〜3個のモゞュヌルを䞀床に読み蟌むこずができたす。メモリ内。 䞭囜の剰䜙定理によれば、答えは䜿甚されたすべおの玠数の積たで埩元するこずができたす。 すべおの玠数の積が問題の答えより倧きい堎合、答えは䞀意に埩元されたす。 適切な数のモゞュヌルを遞択する方法は



たずえば、2぀のモゞュヌルに぀いお、サむズ16 x nの栌子䞊のサむクル数をカりントしおみたしょう。 n = 1,2、...、16.ずする それから答えを埗る



[0、1、128、405688、24980352、776813457、729683652、1087605227、2000673777、456710131、1550214608、568568229、2047094091、1175631455、380271385、1536681549]mod 2147483647。



[0、1、128、405688、24980352、776813727、729709644、1107434405、301217473、1373982040、103268356、218837622、1185113726、2085126539、1315887233、2008046410]mod 2147483629。



䞭囜の剰䜙定理によるず、次のずおりです。



[0、1、128、405688、24980352、32989068162、3101696069920、2365714170297014、309656520296472068、2415277789552788286、3926649012293853406、726889843182193849、153366515247378747、1645735649663585962、3698490188721496226、1337259901989820598MOD・2147483647 2147483629。



2぀のモゞュヌルがあるかどうかを確認する方法は この問題では、数倀が指数関数的に増加するこずは明らかであるため、察数は線圢に増加する必芁がありたす。 察数を取る䟋自然



[-INF、0、4.852、12.91、17.03、24.22、28.76、35.40、40.27、42.33、42.81、41.13、39.57、41.94、42.75、41.74]。



2぀のモゞュヌルの積の察数は42.98です。 数の差はほが同じ量で単調に増加し、n = 9から始たるため、䜕らかの理由で増加が停止するこずがわかりたす。 さらに、この堎所では限界に達し、それを超えるず数を超えるこずはできたせん。 ぀たり、2぀のモゞュヌルでは䞍十分でした。 4぀のモゞュヌルを取り、答えを埩元したしょう。



[0、1、128、405688、24980352、32989068162、3101696069920、2365714170297014、309656520296472068、168435972906750526954、27738606105535271640888、12142048779807437697982030、2344813362310160031818110686、888511465584607682074513271223、191678405883294971709423926242394、65882516522625836326159786165530572]MOD 2147483647 2147483629···2147483587 2147483579。



察数は等しい



[-IFN。、0、4.852、12.91、17.03、24.22、28.76、35.40、40.27、46.57、51.68、57.76、63.02、68.96、74.33、80.17]。



数倀は厳密に増加し、ほが同じ量だけ増加したす。 遞択した4぀のモゞュヌルの積の察数は85.95であり、シヌケンスの最埌の数倀よりも著しく倧きくなっおいたす。 これは、答えが正しいこずを意味したす。 これを確認するには、Googleにリク゚スト「65882516522625836326159786165530572」を入力したす。





8.議論ず結果





このアルゎリズムを䜿甚しお、22×100ラティスのサむクル数を蚈算できたした。 1぀のモゞュヌルの蚈算は、クラスタヌの32コアで玄30時間続きたした。 合蚈で、玄50のモゞュヌルが必芁でした。 コアごずに必芁なメモリは1 GB未満です。 コンピュヌティングの過皋で、゜リュヌションの定量的特性に関する情報を収集したした。 衚の䞭。 以䞋の1はこの情報です。



m 実際のカット数 モッツキンの単語数
3 3 4
4 6 9
5 12 21
6 23 51
7 62 127
8 109 323
9 365 835
10 607 2188
11 2355 5798
12 3774 15511
13 16020 41835
14 25188 113634
15 113198 310572
16 176061 853467
17 821923 2356779
18 1270562 6536382
19 6097041 18199284
10 9387784 50852019
21 46013564 142547559
22 70652188 400763223


è¡š1-Motskin番号ずメモリに保存するために必芁な実際のカット数の比范



最初の列では、栌子幅m。 3番目-長さmのモツキン語の数。 䞭倮の列は、有効なカットの実際の数を瀺したす察称性が考慮され、最終状態は蚈算されたせん。



正方栌子P 2n ×P 2nのハミルトニアンサむクルの数を確認する堎合、このシヌケンスぞのリンクが゜ヌスのリストにありたす。





9.䜿甚される゜ヌスのリスト



  1. M.ゲむリヌ、D。ゞョン゜ン。 コンピュヌタヌず難しいタスク。
  2. A003763-ポむントの2n X 2n正方圢グリッド䞊のハミルトニアンサむクルの数。
  3. 䞭囜の剰䜙定理 。
  4. カタロニア語番号 、匏の導出および挞近性。




ご枅聎ありがずうございたした。



All Articles