前提・実現したいこと
閲覧いただきありがとうございます。
現在、pythonを用いてA*アルゴリズムを作成しています。
その中で、通ることができる道と通ることができない道というものを設定しているのですが、本来は「通ることができません」と出力してほしい場面で、そのように出力することができません。
説明が悪く申し訳ございませんが、ご教授いただければ幸いです。
発生している問題・エラーメッセージ
本来は「通ることができません」と出力してほしい場面で、
下の画像のように通ることができない道を突き破って出力されてしまいます。
該当のソースコード
python
1import heapq 2import itertools 3 4def astar(init_pos, goal): 5 # 探索した座標を格納する経路リスト 6 passed_list = [init_pos] 7 # 初期スコア 8 init_score = distance(passed_list) + heuristic(init_pos) 9 # 探索済み座標と、その座標に辿り着いた経路のスコアを格納 10 checked = {init_pos: init_score} 11 # 経路リストとそのスコアを格納する探索ヒープ 12 searching_heap = [] 13 # 探索ヒープに経路リストを格納 14 heapq.heappush(searching_heap, (init_score, passed_list)) 15 # 探索不可能になるまで 16 while len(searching_heap) > 0: 17 # 現在までに探索した経路の中から、スコアが最小になる 18 # ときのスコアと経路リストを取得 19 score, passed_list = heapq.heappop(searching_heap) 20 # 最後に探索した座標 21 last_passed_pos = passed_list[-1] 22 # 最後に探索した座標が目的地なら探索ヒープを返す 23 if last_passed_pos == goal: 24 return passed_list 25 # 最後に探索した座標の八方を探索 26 for pos in nexts(last_passed_pos): 27 # 経路リストに探索中の座標を追加した一時リストを作成 28 new_passed_list = passed_list + [pos] 29 # 一時リストのスコアを計算 30 pos_score = distance(new_passed_list) + heuristic(pos) 31 # 探索中の座標が、他の経路で探索済みかどうかチェック 32 # 探索済みの場合、前回のスコアと今回のスコアを比較 33 # 今回のスコアのほうが大きい場合、次の方角の座標の探索へ 34 if pos in checked and checked[pos] <= pos_score: 35 continue 36 # 今回のスコアのほうが小さい場合、チェック済みリストに格納 37 # 探索ヒープにスコアと経路リストを格納 38 checked[pos] = pos_score 39 heapq.heappush(searching_heap, (pos_score, new_passed_list)) 40 41 return [] 42 43if __name__ == "__main__": 44 dungeon = [ 45 'HHHHHHHHHH', 46 'HSB G', 47 'HHHHHHHHHH', 48 ] 49 50 def find_ch(ch): 51 for i, l in enumerate(dungeon): 52 53 for j, c in enumerate(l): 54 55 if c == ch: 56 return (i, j) 57 # スタート 58 init = find_ch("S") 59 # ゴール 60 goal = find_ch("G") 61 62 63 def nexts(pos): 64 ''' 探索中の座標から八方の座標を計算するジェネレーター''' 65 wall="H" and "B" 66 67 for a, b in itertools.product([' + 1', ' - 1', ''], repeat=2): 68 69 if a or b: 70 71 if dungeon[eval('pos[0]' + a)][eval('pos[1]' + b)] != wall: 72 yield (eval('pos[0]' + a), eval('pos[1]' + b)) 73 74 def heuristic(pos): 75 ''' 探索中の座標からゴールまでの最短距離のスコア ''' 76 return ((pos[0] - goal[0]) ** 2 + (pos[1] - goal[1]) ** 2) ** 0.5 77 78 def distance(path): 79 ''' スタートから探索中の座標までの距離のスコア ''' 80 return len(path) 81 82 def render_path(path): 83 ''' 結果の出力 ''' 84 buf = [[ch for ch in l] for l in dungeon] 85 86 for pos in path[1:-1]: 87 buf[pos[0]][pos[1]] = "*" 88 89 buf[path[0][0]][path[0][1]] = "s" 90 buf[path[-1][0]][path[-1][1]] = "g" 91 return ["".join(l) for l in buf] 92 93 path = astar(init, goal) 94 95 if len(path) > 0: 96 print("\n".join(render_path(path))) 97 98 else: 99 print('通ることができません')
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/04 05:16