長方形グリッドのハミルトニアンパスの数を見つけるための効果的なヒューリスティックは何ですか?


8

私が最近遭遇した特定のプログラミング問題は、次のような長方形のグリッドでハミルトニアンパスを見つけることに帰着します。

A  0  0  0

0  0  0  0

0  0  C  D

それらを見つけるために適用できる効果的なヒューリスティックは何ですか?特に、途中でパスをトリム/破棄するテクニックは?

編集:明確にするために、要素が水平および垂直に接続されているが、斜めには接続されていない場合、エッジが形成されます。この問題は、0とマークされた要素を使用してパスを形成できることも示していますが、0以外の要素は回避する必要がある「障害物」です。

A-0-0-0
      |
0-0-0-0
|
0-0-C D

たとえば、1つのパスにすることができます。別の可能性があります、

A 0-0-0
| |   |
0 0 0-0
| | |
0-0 C D

2
あなたの例のエッジはどれですか?
Alexandru

1
チャンスあたりのこれは、Quoraの求人ページから来ましたか? quora.com/challenges
majelbstoat

回答:


3

列挙せずに数える簡単な方法はわかりません。バックトラッキング付きの徹底的な深さ優先検索で、すべてのハミルトニアンパスに簡単にアクセスできます。実際に少しごまかして、Nが右から始まるハミルトニアンパスの数である場合、ハミルトニアンパスの総数は2N(グリッドの場合は対称性のため)であることがわかります。これは完全に拡張するわけではありません(一部の頂点ではすべてのパスが同じ数のサイクルにつながるわけではありませんが、同様の引数でハミルトニアンパスの数の上限を簡単に設定できます(その一部を正確に解くことができるというボーナスがあります)。対称性の議論であなたの限界を改善するために。これは私が選択する戦略です。

しかし、これを望まない場合は、いくつかの一般的なヒューリスティック:

  • | E |のようにハミルトニアンパスの数の上限を簡単に設定することもできます。| V | -1(ここで、| E |はエッジの数、| V |はグラフの頂点の数)を選択します。これは、スパースグラフの場合、| V |よりもはるかに優れています。(グラフが完全であると仮定する単純な境界)。

  • この境界を改善する簡単な方法は、既知の悪い組み合わせをトリミングすることで、同じ頂点からのエッジを2回考慮しないことです。したがって、prod_v(deg_v-1)のようなものが得られます(サイクルを複数回カウントしているので、ハミルトニアンパスの数の上限を超えているはずです)。


1
これはメモ化を伴う一種の動的プログラミングに改善できないのでしょうか?
アンドラス・サラモン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.