A星

一、搜索區化爲二維數組。

節點被標記爲可通過和不可通過。路徑找到,就從一個節點向另一個。依次循環,直到目的地。

二、方法:從點A開始,檢查相鄰節點,向外擴展
    1、從A開始,把它作爲待處理點存入“開啓列表”
    2、尋找起點周圍所有可通過的節點,也把它們加入開啓列表。定義A爲“父方格”。
    3、從開啓列表中刪除點A,加入“關閉列表”,關閉列表保存不需要再次檢查的節點。
    4、選擇開啓列表中的臨近節點。F=G+H,其中含義爲:
       1)G=A沿着產生的路徑移動到指定節點的耗費
       2)H=從那個節點移動到B的預估移動耗費,稱爲“啓發式”,是個估計值
   5、路徑是通過反覆遍歷開啓列表中並選擇最小F值生成。
       1)G值,令水平或垂直移動耗費爲10,對角線方向耗費爲14(即10根號2)
       2)H值,曼哈頓法。10*(x2-x1+y2-y1).
   6、選擇F最小的節點。並:
       1)把此節點從開啓列表中刪除,加到關閉列表中,作爲新的父節點。
       2)檢查所有相鄰節點,跳過已在關閉列表中的,把可通過的加入開啓列表中。
       3)若某個相鄰節點已在開啓列表中,再次檢查路徑。即若用新路徑到達,G值是否更低。

          若不是,繼續;若是,改此節點爲父節點,重新計算F值和G值。

   7、確定路徑:從目的節點開始,走曾經都父節點的路徑。

三、思路大致如下: 

首先有一張地圖x*y的地圖,爲了方便,我們讓每個點都用一個數字(10*x+y)來表示的話,也就是每個點唯一的屬性。

1、定義一個包含點的信息的結構體,包含每個點的G值,F值,x,y座標,它的父節點的x,y座標。並定義此結構體型變量的數組,以存儲路徑。因爲每個結構替裏都包含了節點和它的父節點,因此我們可以用遞歸來輸出路徑。

2、定義一個鏈表,主要儲存開啓列表,關閉列表中的點的信息。之所以是鏈表,是爲了對F值進行動態排列,每增加一個F值,我們都可以按一定順序加入列表中。這樣以來,每次的查找都會很方便。

3、此外,我們還需要設計一個將某點插入鏈表的函數,因爲我們要很頻繁的變換點的歸屬表。

4、點的歸屬表的判斷

5、更新表的F值,因爲我們要不斷做出比較,路徑節點不斷移動,於是隨着G值的改變,F值也會隨之改變。

6、判斷方向的可行性

7、求出可行方向的點座標,即下面經常講到的“新點”。

8、最後寫A星主程序

開啓列表=關閉列表=NULL——創建開啓列表,head節點就是路徑的起點,也就是第一個父節點

循環:把父節點從開啓列表中刪除——判斷是否到達終點——是,break,跳出while

                                                  ——否——從右,下,左,上四個方向判斷哪個方向可通過——得到一個可通過方向——計算一個新節點——判斷在哪個列表中,可以用flag來標記

                                              ——都不在,則加入開啓列表

                                              ——在開啓列表,比較他們的F值,更新

                                              ——在關閉列表,比較他們的F值,更新,轉移到開啓列表

——將父節點加入到關閉列表中——判斷開啓列表是否爲空——否,則將剛剛的新節點又作爲父節點賦值給起點座標——回到循環開頭

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章