資源簡介
1. 實驗目的
1) 掌握搜索算法的基本設計思想與方法,
2) 掌握A*算法的設計思想與方法,
3) 熟練使用高級編程語言實現搜索算法,
4) 利用實驗測試給出的搜索算法的正確性。
1. 實驗問題
尋路問題。以圖1為例,輸入一個方格表示的地圖,要求用A*算法找到并輸出從起點(在方格中標示字母S)到終點(在方格中標示字母T)的代價最小的路
徑。有如下條件及要求:
1) 每一步都落在方格中,而不是橫豎線的交叉點。
2) 灰色格子表示障礙,無法通行。
3) 在每個格子處,若無障礙,下一步可以達到八個相鄰的格子,并且只可以到達無障礙的相鄰格子。其中,向上、下、左、右四個方向移動的代價為1,向四
個斜角方向移動的代價為 √2。
4) 在一些特殊格子上行走要花費額外的地形代價。比如,黃色格子代表沙
漠,經過它的代價為4;藍色格子代表溪流,經過它的代價為2;白色格子為普通地形,經過它的代價為0。
5) 經過一條路徑總的代價為移動代價 地形代價。其中移動代價是路徑上所做的所有移動的代價的總和;地形代價為路徑上除起點外所有格子的地形代價的總和。
代碼片段和文件信息
import?numpy?as?np
import?matplotlib.pyplot?as?plt
import?numpy?as?np;?np.random.seed(0)
import?seaborn?as?sns;?sns.set()
import?matplotlib.pyplot?as?plt
from?matplotlib.colors?import?ListedColormap
import?numpy?as?np
import?matplotlib.pyplot?as?plt
import?numpy?as?np;
np.random.seed(0)
import?seaborn?as?sns;
sns.set()
import?matplotlib.pyplot?as?plt
from?matplotlib.colors?import?ListedColormap
#?%%
#?地形
#?通路
road?=?0
#?沙漠
caravan?=?4
#?路障
barrier?=?1
#?河流
river?=?2
#?起始點,終止點
st_end?=?3
#?path
path1?=?5
path2?=?6
#?直線距離
d?=?1
#?斜線距離
k?=?1.414
def?check_pass(terrain):
????if?terrain?==?road?or?terrain?==?caravan?or?terrain?==?river:
????????return?True
????else:
????????return?False
class?Node:
????def?__init__(self?x?y):
????????self.x?=?x
????????self.y?=?y
????????self.F?=?.0
????????self.G?=?.0
????????self.H?=?.0
????????self.parent?=?None
def?least_f(open):
????res?=?open[0]
????for?node?in?open:
????????if?node.F?????????????res?=?node
????return?res
def?get_surrounds(node?area_map?close):
????res?=?[]
????for?i?in?range(-1?2):
????????for?j?in?range(-1?2):
????????????if?i?==?0?and?j?==?0:
????????????????continue
????????????x?=?node.x?+?i
????????????y?=?node.y?+?j
????????????#?超出邊界
????????????if?x?0?or?y?0?or?\
????????????????????len(area_map)?<=?x?or?len(area_map[0])?<=?y:
????????????????continue
????????????????#?判斷是否可行
????????????if?not?check_pass(area_map[x][y]):
????????????????continue
????????????#?未訪問過
????????????node_tmp?=?Node(x?y)
????????????flag?=?is_in_list(node_tmp?close)
????????????if?flag?is?None:
????????????????res.append(node_tmp)
????return?res
#?Calc?G
def?calc_g(start?surround?area_map):
????extra_g?=?d?if?((abs(surround.y?-?start.y)?+?abs(surround.x?-?start.x))?==?1)?else?k
????extra_g?+=?area_map[surround.x][surround.y]??#?額外的地形代價
????parent_g?=?0?if?surround.parent?is?None?else?surround.parent.G??#?當前點的父節點的起始點到父節點的代價
????surround.G?=?parent_g?+?extra_g??#?當前步+之前的步
def?is_in_list(surround1?close):
????for?c?in?close:
????????if?surround1.x?==?c.x?and?surround1.y?==?c.y:
????????????return?c
????return?None
def?calc_h(surround?close?m_tmp):??#?計算當前點到終點的距離
#?def?calc_h(surround?end):??#?計算當前點到終點的距離
????#?h_diagonal?=?min(abs(surround.x?-?end.x)?abs(surround.y?-?end.y))
????#?h_straight?=?abs(surround.x?-?end.x)?+?abs(surround.y?-?end.y)
????#?surround.H?=?k?*?h_diagonal?+?d?*?(h_straight?-?2?*?h_diagonal)
????min_h?=?99999
????surroundPoints?=?get_surrounds(surround?m_tmp?close)
????for?target?in?surroundPoints:
????????if?is_in_list(target?close)?is?not?None:
????????????if?(abs(target.x?-?surround.x)?+?abs(target.y?-?surround.y))?==?1:
????????????????if?(d?+?m_tmp[surround.x][surround.y])?????????????????????min_h?=?d?+?m_tmp[surround.x][surround.y]
????????????else:
????????????????if?k?+?m_tmp[surround.x][surround.y]
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????10263??2020-12-02?16:07??a_star_bidirection.py
?????文件????????9389??2020-12-04?09:17??a_star_single.py
- 上一篇:pycharm破解腳本
- 下一篇:國信量化策略框架.docx
評論
共有 條評論