私はヒューリスティックな情報検索を使ってPythonの8パズルを解くプログラムに取り組んでいます。私たちが使うはずのヒューリスティックは、マンハッタンの距離です。だから、のようなボード用:8つのパズルのマンハッタン距離を計算する
State Goal Different Goal
7 2 4 1 2 3 1 2 3
5 6 8 4 4 5 6
8 3 1 7 6 5 7 8
マンハッタン距離が4 + 0 + 3 + 3 + 1 + 0 + 2 + 1 = 14
視覚的になり、特定の数がどのように多くのスペースを離れて数えるのは簡単ですが、Pythonで、私はリストとしてボードを表現しています上のボードは[7, 2, 4, 5, 0, 6, 8, 3, 1]
、目標の状態は[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
となります。私はmodを使ってこれを動作させようとしているが、うまく動作していないようだ。私の先生はmodを使用すると、これを行う方法を理解するのに役立つと言いました。私が見たいくつかの例は、abs(x_val - x_goal) + abs(y_val - y_goal)
の2次元配列を使用しましたが、リストを使用しているので、これを実装する方法がわかりません。私が今までに得たコードは次のとおりです。
distance = 0
xVal = 0
yVal = 0
for i in range(len(self.layoutList)):
pos = self.layoutList.index(i)
if pos i == 0 or pos i == 1 or pos i == 2:
xVal = pos
yVal = 0
if pos i == 3 or pos i == 4 or pos i == 5:
xVal = pos - 3
yVal = 1
if pos i == 6 or pos i == 7 or pos i == 8:
xVal = pos - 6
yVal = 2
これは、各タイルのx、y値を生成します。したがって、上記の状態は[7, 2, 4, 5, 0, 6, 8, 3, 1]
となり、(0, 0)
は7、(2, 0)
は4となります。これは、goalstateがx、y座標を取得するのと同じ方法で実装します。それから、私はx-valの絶対値とx_goalとそれ以外のものをとります。しかし、2つのforループを使用して両方のリストを反復するのではなく、リストからこれを直接実行する方が、より効率的な方法がありますか?各番号のManhatten距離にわたって加算
私はあなたのリスト 'board'を使用していることがわかり、これは目標状態の値をチェックしますか?私はここで言及された目標状態を見ません。 – GenericUser01
@ GenericUser01質問に記載されている標準外の目標状態が表示されません。あなたは本当にそれをサポートしなければなりませんか? –
8つのパズルの異なるバージョンには異なる目標状態が存在するため、サポートする必要があります。いくつかの8個のパズルのゴール状態は '[1,2,3,8,0,4,7,6,5] 'で、中央にスペースを入れた1〜8の数字です。 – GenericUser01