a*尋路演算法的兩個集合和乙個公式:
[openlist] [closelist]
f = g + h
假如遊戲是由 7x5 的小方格組成的,每一步只能向上下左右移動一格,且不能穿越障礙。
openlist 儲存可到達的格仔,closelist 儲存已到達的格仔。
公式 f= g+h,則是對格仔價值的評估。
g 代表從起點走到當前格的成本,也就是走了多少步,要考慮障礙。
h 代表從當前格走到目標格的距離,也就是不考慮障礙的情況下,離目標還有多遠。
f 則是對g和h的綜合評估。顯然我們應該盡量選擇步數更少,離目標更近的格仔。所以f越小越好。
import math
the_map = [
[0,0,0,0,0,0,0],
[0,1,1,1,1,1,0],
[0,1,0,1,0,0,0],
[0,1,0,1,0,1,0],
[0,0,0,1,0,1,0]];
map_row = 5
map_col= 7
class
node
(object):
def__init__
(self, _mine, _begin, _end):
super(node, self).__init__()
self.m_own = _mine;
self.m_g = 0;
self.m_h = abs( _end[1] - _mine[1] ) + abs( _end[0] - _mine[0] )
self.m_f = self.m_g + self.m_h
self.m_begin = _begin;
self.m_end = _end;
self.m_tag = str( _mine )
self.m_neighbors =
self.m_parent = none
defset_gvalue
(self, g):
self.m_g = g;
defget_gvalue
(self):
return self.m_g;
gvalue = property( get_gvalue, set_gvalue )
defset_parent
(self, parent):
self.m_parent = parent;
defget_parent
(self):
return self.m_parent;
parent = property( get_parent, set_parent )
defget_tag
(self):
return self.m_tag
defget_fvalue
(self):
return self.m_f
defget_position
(self):
return self.m_own
defget_neighbors
(self):
nei = [[0,1],[0,-1],[1,0],[-1,0]]
for item in nei:
x = item[0] + self.m_own[0]
y = item[1] + self.m_own[1]
if (x >= 0
and x < map_row) and (y >= 0
and y < map_col):
if the_map[x][y] == 0:
return self.m_neighbors;
deffindminnode
( _list ):
_min = _list[0]
for x in _list:
if x.get_fvalue() < _min.get_fvalue():
_min = x
return _min
defiscontains
( _list, _node ):
for item in _list:
if item.get_tag() == _node.get_tag():
return
true;
return
false
defastarsearch
( _begin, _end ):
openlist =
closelist =
#把起點加入open list
begin_node = node( _begin, _begin, _end )
begin_node.gvalue = 0;
#主迴圈,每一輪檢查乙個當前方格節點
while len(openlist) > 0:
#在openlist中查詢f值最小的節點作為當前方格節點
_min = findminnode( openlist )
#當前方格節點從openlist中移除,進入closelist,代表這個格仔已到達並檢查過了。
openlist.remove( _min )
#找到當前格上下左右所有可到達的格仔,看它們是否在openlist和closelist中,如果不在,加入openlist,計算出相應的g、h、f值,並把當前格仔作為它們的「父節點」
neighbors = _min.get_neighbors()
for item in neighbors:
ifnot iscontains( openlist, item ) and
not iscontains( closelist, item ):
item.parent = _min
item.gvalue = _min.gvalue + 1
#如果終點在openlist中,直接返回終點格仔
for x in openlist:
if x.get_tag() == str(_end):
return x;
#openlist用盡,仍然找不到終點,說明終點不可到達,返回空
return
none
dst = astarsearch( (2,2),(3,4) )
path = [dst.get_tag()]
while dst.parent:
dst = dst.parent
path.insert( 0, dst.get_tag() )
print( path )
迷宮尋路(A星尋路演算法)
題目 假設我們有乙個7 5大小的迷宮,如下圖所示,綠色格仔表示起點,紅色的格仔表示終點,中間的3個深灰色格仔表示障礙物。請找到一條從起點到終點最短的路徑。解題思路 需要引入兩個集合和乙個公式,如下 具體步驟 把起點放入openlist 檢查openlist中是否有值,如果沒有則無法到達終點,結束尋路...
A 尋路演算法
問題 由於遊戲中尋路出了個小問題 玩家尋路到乙個死角後在那邊不停的來回跑,就是無法越過障礙物,就研究了下a 尋路演算法以解決這個問題 研究了幾天,自己寫了個demo這裡給出總結 原理 a 演算法給出的是權值最優的路徑而不是最短路徑 權值有f g h來表示 啟發式函式如下 f p g p h p h值...
A 尋路演算法
a 演算法是靜態環境下求最短路徑的不二之選,由於是啟發式搜尋,比dijkstra 深搜廣搜要快的多啦。a 也算是我第一次接觸的移動機械人演算法,csdn上的科普文章也不少,但我作為乙個機械的小白,實現出來還是小有成就感滴。今天抽空和大家分享一下原始碼,開發環境win7 64 opengl vs201...