a-star アルゴリズムを利用し、最短経路を探索するプログラムです。
csvファイルからマップを読み込みます。 ファイル名やスタート地点、ゴール地点はプログラム実行時にコマンドラインから対話的に設定します。
新たにマップを作成し、読み込ませることも可能です。
Python3.6での動作を確認しています。
.
├── README.md
├── a_star.py # AStarクラスの実装
├── maze.py # メインプログラム
├── node.py # Nodeクラスの実装
├── status.py # Statusクラスの実装
├── map.csv # デフォルトで読みこまれるマップデータ
├── world01.csv # (1, 1)、(6, 5)をそれぞれスタートとゴールに設定した際、複数経路存在する
└── world02.csv # (1, 1)、(6, 5)をそれぞれスタートとゴールに設定した際、経路が一つしかない
$ git clone https://github.com/Takahiro55555/a-star-maze.git
$ cd a-star-maze
指示に従って入力してください
[??]
が一つのタイル(床)で、任意の座標が割り当てられています。
基本的に初期マップは以下の2種類のタイルで構成されています。
タイル | 説明 |
---|---|
[||] |
壁、障害物 |
[ ] |
移動可能なタイル(移動コスト:1) |
また座標を入力する際、壁を無視します。 左上の座標が(1, 1)で、横がX軸、縦がY軸です。
以下の例では、スタートを左上の(1, 1)、ゴールを右下の(3, 3)に設定しています。
障害物をスタートやゴールに設定しないでください。予期せぬ動作を引き起こします。
$ python3 maze.py
# 読み込むファイル名を入力してください(何も入力しない場合はmap.csvの読み込みを試みます)
file_name: map.csv
size: [8, 8]
[||][||][||][||][||][||][||][||][||][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][||][||][||][||][||][||][||][||][||]
# スタートの位置を空白区切りで入力してください(X, Yの順)
1 1
# ゴールの位置を空白区切りで入力してください(X, Yの順)
3 3
# 使用するヒューリスティクス関数を以下の番号から指定してください
# 0: calc_euclidean_distance
# 1: calc_manhattan_distance
# 2: all_0
1
[以下略]
以下の実行結果は、スタート地点の座標を(1, 1)、ゴール地点の座標を(3, 3)に設定したものです。
これにより、各ステップごとの探索の様子を確認することができます。
表示されている各データに関しては以下の表を参考にしてください。
ラベル名 | 説明 |
---|---|
heuristics_name | ヒューリスティクス関数名(ソースコード中の関数名と一致) |
start | スタート地点の座標 |
goal | ゴール地点の座標 |
round | 探索回数(注目ノードが変更される度に更新される) |
open_nodes_cost | 現在オープンとなっているノードのコスト(実コスト + 予測コスト)を昇順に並べたもの |
result | 探索の成否(成功時:success、失敗時:failed) |
route | スタートからゴールまでの最短経路をタイルの(探索失敗時も表示される) |
表示されているマップの見方に関しては以下の表を参考にしてください。
タイル | 説明 |
---|---|
[||] |
壁、障害物 |
[ ] |
移動可能なタイル(移動コスト:1) |
{SS} |
スタート地点 |
{GG} |
ゴール地点 |
[@@] |
スタート地点から注目ノードまでの最短経路を表す |
[??] |
OPEN状態のノードを表し、?? の部分はそのノードのコスト(小数点以下切捨) |
[XX] |
CLOSED状態のノードを表す |
以下実行例
heuristics_name: calc_manhattan_distance
start: [1, 1]
goal: [3, 3]
round: 1
open_nodes_cost: [4, 4]
[||][||][||][||][||][||][||][||][||][||]
[||]{SS}[ 4][ ][ ][ ][ ][ ][ ][||]
[||][ 4][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ]{GG}[ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][||][||][||][||][||][||][||][||][||]
round: 2
open_nodes_cost: [4, 4, 4]
[||][||][||][||][||][||][||][||][||][||]
[||]{SS}[@@][ 4][ ][ ][ ][ ][ ][||]
[||][ 4][ 4][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ]{GG}[ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][||][||][||][||][||][||][||][||][||]
round: 3
open_nodes_cost: [4, 4, 4, 6]
[||][||][||][||][||][||][||][||][||][||]
[||]{SS}[@@][@@][ 6][ ][ ][ ][ ][||]
[||][ 4][ 4][ 4][ ][ ][ ][ ][ ][||]
[||][ ][ ]{GG}[ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][||][||][||][||][||][||][||][||][||]
round: 4
open_nodes_cost: [4, 4, 6, 6, 6]
[||][||][||][||][||][||][||][||][||][||]
[||]{SS}[@@][@@][ 6][ ][ ][ ][ ][||]
[||][ 4][ 6][@@][ 6][ ][ ][ ][ ][||]
[||][ ][ ]{GG}[ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][||][||][||][||][||][||][||][||][||]
round: 5
open_nodes_cost: [4, 6, 6, 6, 6, 6, 6]
[||][||][||][||][||][||][||][||][||][||]
[||]{SS}[@@][@@][ 6][ ][ ][ ][ ][||]
[||][ 4][ 6][@@][ 6][ ][ ][ ][ ][||]
[||][ ][ 6]{GG}[ 6][ ][ ][ ][ ][||]
[||][ ][ ][ 6][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][ ][ ][ ][ ][ ][ ][ ][ ][||]
[||][||][||][||][||][||][||][||][||][||]
result: success
route: [1, 1], [2, 1], [3, 1], [3, 2], [3, 3],