質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

668閲覧

pythonを利用したA*アルゴリズムの作成

python55

総合スコア3

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/11/04 04:17

編集2020/11/04 04:33

前提・実現したいこと

閲覧いただきありがとうございます。

現在、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('通ることができません')

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

全部は読んでいませんが、こことか設計意図と挙動が異なっている原因じゃないでしょうか。

python3

1wall="H" and "B" 2print(wall) # -> B

投稿2020/11/04 04:39

jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

python55

2020/11/04 05:16

ご返答ありがとうございます。少し、原因が分かった気がします。自分でもう一度考えてみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問