ハミルトニアン パス問題のわずかに修正されたバージョンを解こうとしています。開始点と終了点が与えられ、解が存在するかどうかを判断する代わりに、解の数(0 の場合もある) を見つけたいという点で変更されています。
グラフは 2D 配列として与えられ、ノードは配列の要素です。また、移動できるのは水平または垂直のみで、斜めには移動できません。言うまでもなく、1 つの都市から 2 つの都市に移動することはできません。そのためには、1 つの都市を 2 回訪問する必要があります。
各ノードで 4 つ (エッジ上のノードの場合は 3 つまたは 2 つ) の可能な移動をすべて試行し、ソリューションの数をカウントするブルート フォース ソリューションを作成しました (これは、ゴールに到達し、他のすべてのノードも見たときです)。適度なサイズの入力(たとえば、7x7配列など)で途方もない時間実行されました。
目標がわかっているので双方向検索を使用することも考えましたが、フリンジを満たしたいだけでなく、すべてのノードが訪問されたことを確認したいので、これはあまり役に立ちませんでした。さらに、すべてのノードが 2 つのフリンジ間で使い果たされると、結合できないような形で終了する可能性があります。
力ずくの解決策しか残されていないように感じます。問題自体は NP 完全であることはわかっていますが、ブルート フォースに対する改善点があるかどうか疑問に思っています。誰かが何か他のことを提案できますか?
- 編集 -
双方向検索を使用しても実際には役に立たないと言いましたが、そう考えた理由を明らかにしたいと思います。左上と右下のノードがそれぞれ開始点と目標点である 2x3 グラフを考えてみましょう。双方向検索のフリンジをスタートから右に移動させ、ゴールから左に移動させます。2 回の移動の後、すべてのノードが訪問されますが、1 つのノードから一方向にしか移動できないため、フリンジに参加する方法はありません。ただし、David が以下の回答で指摘したように、いくつかの変更を加えてアルゴリズムを機能させることは可能かもしれません。