ここ数日、私は修士課程の勉強を控えて、この (一見単純な) パズルに集中してきました。
この 10*10 のグリッドは、100 の利用可能な場所の正方形を構成します。目的は、コーナーから開始し、いくつかの単純な「トラバース ルール」に従ってすべての場所をトラバースし、100 番に到達することです (または、プログラマーの場合は 99 番で、代わりに 0 から始めます :)
トラバースのルールは次のとおり
です。 1. 縦軸と横軸に沿って
2 つのスペースをホップします。 2. 対角線に沿って 1 つのスペースをホップし
ます。 3. 各マスは 1 回だけ訪れることができます。
よりよく視覚化するために、有効なトラバースの例 (8 番目のステップまで) を次に示し
ます。
手動で、私は退屈からこのパズルに取り組んできました。何年もの間、私は時々手で解こうと試みてきましたが、96 を超えることはありませんでした。簡単に聞こえますか? 自分で試してみてください:)
したがって、この問題を解決するために、Python で短い (約 100 行のコード) プログラムを開発しました。私はこの言語の初心者です。何ができるか見てみたいと思っていました。
プログラムは、徹底的な試行錯誤解決法を適用するだけです。言い換えれば、力ずくの深さ優先検索です。
ここから私の質問が発生します。残念ながら、プログラムは問題を解決できません。これは、状態空間が非常に大きいため、解決策が見つからない限り検索が終了しないためです。問題なく 98 まで (そしてそれを出力) することができますが、それでも完全な解決策ではありません。
プログラムは、これまでにカバーした検索ツリーの長さも出力します。数分で、たとえば 65 番目の要素からのトラバース リストが、1 つのパスについて最後までカバーされます。この数は、指数関数的に増加する期間で減少します。私はかなり長い間コードを実行してきましたが、50 バリアを超えることはできませんでしたが、今では確信しています。
この単純なアプローチは、私が永久に実行しない限り十分ではないようです。では、コードをより高速かつ効率的に改善して、解決策を導き出すにはどうすればよいでしょうか?
基本的に、次の方法に関するアイデアを楽しみにしています。
- この問題に固有のドメイン知識を取得して活用する
疲労を克服するためにプログラミングのテクニック/トリックを適用する
..そして、最終的に実質的な解決策を実現します。
前もって感謝します。
リビジョン
所属するドメインに問題を関連付けてくれた Dave Webb に感謝します。
これは、同じマスを再訪せずにチェス盤の周りでナイトを動かすことに関するナイツ ツアー問題に非常に似ています。基本的には同じ問題ですが、「トラバース ルール」が異なります。