2016-11-22 11 views
1

私は8つのパズルのマンハッタン距離でAスターアルゴリズムを実装しています。 BからAへ行くような工程の数が同じになりませんBに行くから、いくつかのケースでパスの発見:AからBまでの距離がAからBまでではない

1 2 3 
8 0 4 
7 6 5 

[ソリューションは、らせん状である]

私はそれがないので、これがあると思います同じコストを持っているので、同じノードを展開していないオープンリストで同じ状態を選択しないでください。両方がマンハッタン距離を使用して同じ値を持つ

7 6 4 
1 0 8 
2 3 5 



(A -> B) 

7 6 4 
1 8 0 
2 3 5 

(B -> A) 

7 6 4 
1 3 8 
2 0 5 

から

。 すべてのパスを同じ値で調べる必要がありますか? または、ヒューリスティックに何らかのタイブレーカーを設定する必要がありますか?

はここに多くの時間、私は最終的に問題を発見し、何のために、 を私の「解決」機能の多くの異なる方法を再書き込みを無駄にした後、コード

def solve(self): 
    cost = 0 
    priority = 0 
    self.parents[str(self.start)] = (None, 0, 0) 
    open = p.pr() #priority queue 
    open.add(0, self.start, cost) 
    while open: 
     current = open.get() 
     if current == self.goal: 
     return self.print_solution(current) 
     parent = self.parents[str(current)] 
     cost = self.parents[str(current)][2] + 1 
     for new_state in self.get_next_states(current): 
     if str(new_state[0]) not in self.parents or cost < self.parents[str(new_state[0])][2]: 
      priority = self.f(new_state) + cost 
      open.add(priority, new_state[0], cost) 
      self.parents[str(new_state[0])] = (current, priority, cost) 
+0

を行うことを教えます だから、未踏の状態が...あった 2日:もし最後は「4場合とPOS> N」にするために使用します私はあなたの例では 'A - > B'と 'B - > A 'の意味を理解しています。あなたはあなたが表示する "From"ポジションへのゴールからの検索を実行していますか?他の図はどのようにこれらの検索に関連していますか?明らかにあなたのA *コードに間違ったことはありませんが、完全に自己完結型ではないので、微妙なバグがあるかどうかを実際には調べることはできません。ヒューリスティックの関係は、それがまだ許容されていれば問題ではありません(https://en.wikipedia.org/wiki/Admissible_heuristic)。複数のソリューションがある場合は、いずれかが見つかりますが、すべて同じ長さになります。 – Blckknght

+0

@Blckknght、はい、そうです。ゴールから "から"の位置に私は示した。 マンハッタンの距離が許せば、結びつきを管理する方法を見つける必要はなく、私のコードに何か問題がありますか? コードを消去し、プロジェクトのgithubリンクを投稿します。 – Sequoya

+0

私はマンハッタン距離の代わりにf = 0で試しましたが、現状== self.goalの場合は を取り除こうとしました。self.print_solution(現時点) をすべての解決策を得るために返します。 どちらも変更されません。 私はこの問題が、おそらくself.parentの質問に載っている機能にあると信じています。 完全なコードは次のとおりです。https://github.com/Sequoya42/automatic-waddle – Sequoya

答えて

1

の関連する部分です。

def get_next_states(self, mtx, direction): 
    n = self.n 
    pos = mtx.index(0) 
    if direction != 1 and pos < self.length and (pos + 1) % n: 
     yield (self.swap(pos, pos + 1, mtx),pos, 3) 
    if direction != 2 and pos < self.length - self.n: 
     yield (self.swap(pos, pos + n, mtx),pos, 4) 
    if direction != 3 and pos > 0 and pos % n: 
    yield (self.swap(pos, pos - 1, mtx),pos, 1) 
    if direction != 4 and pos > n - 1: 
    yield (self.swap(pos, pos - n, mtx),pos, 2) 

これはこの機能に含まれていました。 「-1」

のためにそれは私が「より多くのユニットテスト

関連する問題