A 尋路演算法

2021-08-10 03:53:00 字數 3272 閱讀 5989

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...