看完以下概述,即可明白何為A星算法。
關于什么是A星算法,上網一查便知。在此只簡要記錄一些有關A星算法的要點
一:f、g、h值
f值:即:算法的估價值。是指對某一點的估價值。例如:要想從起點 S 到達終點 D,則中間可能會經過n個點,假如其中經過點:X ,則f(X),就是對點x的計算所得的估價值。當然,對于估價值,是越小越好。
g值: 即:從起點 S 到達點 X 實際所花的代價值。例如:以格子數為計量單位。則g值表示,從S到X所經過的格子數,即為實際所花費的代價值
h值: 即:從點 X 到達終點 D 可能要花費的值。也就是所謂的估計值,猜測值。這個值根據不同的應用,實現策略,將會有不同的結果。當然值越小是越好的。理由是:f(X) = g(X) + h(X) 。因為g(X)值是固定的,已知的。所以要想f(X)值越小,則只能h(X)的值越小。
二:節點與地圖位置點
地圖位置點不言而喻,是指地圖上的某個具體點,因此,只要地圖的劃分方法確定,則地圖位置點必然確定。
節點是A星算法中所需要依賴的數據信息存儲相關的點。與地圖位置點不同。節點中所存儲的數據信息是靈活多變的。同時,同一個節點,可能對應于不同的地圖位置點。一般情況下,節點中會存儲地圖位置點信息、當前節點的f、g、h值等等。
!!!note: 在A星算法中,節點只分為兩類。一類是:待考察的節點。一類是:已考察的節點。
已考察節點是指:當所有與節點X相關連的節點的f、g、h值均已被賦值并且這些節點均已被添加到open表中時,則節點X就是已經被考察過了。
三:open表與closed表
open表中所存儲的元素,全部都是需要進一步進行考察的節點。
closed表中所存儲的元素,全部都是已經被考察過了的節點。
四:A星算法的實現步驟
1) 令 P = 起始節點
2) 把 f, g, h 值賦給 P
3) 將 P 添加到 Open 表中。此時 P 是 Open 表中唯一的節點。
4) 令 B = Open 表中的最佳節點。(提示:所謂最佳節點是指:該節點的 f 值最小)
(1) 如果 B 是目標節點,則退出。此時已找到一條路徑。
(2) 如果 Open 表為空,則退出。此時沒有找到路徑。
5) 令 C 等于一個與 B 相連的有效節點。
(1) 把 f, g, h 的值賦給 C。
(2) 檢查 C 是在 Open 表里,還是在Closed表里。
2.1: 若在 Closed 表里,則檢查新路徑是否比原先更好,若是則采用新路徑。
2.2: 否則把 C 添加到 Open 表里.
(3) 對所有 B 的子孫節點重復步驟 5).
6) 重復步驟 4).
關于什么是A星算法,上網一查便知。在此只簡要記錄一些有關A星算法的要點
一:f、g、h值
f值:即:算法的估價值。是指對某一點的估價值。例如:要想從起點 S 到達終點 D,則中間可能會經過n個點,假如其中經過點:X ,則f(X),就是對點x的計算所得的估價值。當然,對于估價值,是越小越好。
g值: 即:從起點 S 到達點 X 實際所花的代價值。例如:以格子數為計量單位。則g值表示,從S到X所經過的格子數,即為實際所花費的代價值
h值: 即:從點 X 到達終點 D 可能要花費的值。也就是所謂的估計值,猜測值。這個值根據不同的應用,實現策略,將會有不同的結果。當然值越小是越好的。理由是:f(X) = g(X) + h(X) 。因為g(X)值是固定的,已知的。所以要想f(X)值越小,則只能h(X)的值越小。
二:節點與地圖位置點
地圖位置點不言而喻,是指地圖上的某個具體點,因此,只要地圖的劃分方法確定,則地圖位置點必然確定。
節點是A星算法中所需要依賴的數據信息存儲相關的點。與地圖位置點不同。節點中所存儲的數據信息是靈活多變的。同時,同一個節點,可能對應于不同的地圖位置點。一般情況下,節點中會存儲地圖位置點信息、當前節點的f、g、h值等等。
!!!note: 在A星算法中,節點只分為兩類。一類是:待考察的節點。一類是:已考察的節點。
已考察節點是指:當所有與節點X相關連的節點的f、g、h值均已被賦值并且這些節點均已被添加到open表中時,則節點X就是已經被考察過了。
三:open表與closed表
open表中所存儲的元素,全部都是需要進一步進行考察的節點。
closed表中所存儲的元素,全部都是已經被考察過了的節點。
四:A星算法的實現步驟
1) 令 P = 起始節點
2) 把 f, g, h 值賦給 P
3) 將 P 添加到 Open 表中。此時 P 是 Open 表中唯一的節點。
4) 令 B = Open 表中的最佳節點。(提示:所謂最佳節點是指:該節點的 f 值最小)
(1) 如果 B 是目標節點,則退出。此時已找到一條路徑。
(2) 如果 Open 表為空,則退出。此時沒有找到路徑。
5) 令 C 等于一個與 B 相連的有效節點。
(1) 把 f, g, h 的值賦給 C。
(2) 檢查 C 是在 Open 表里,還是在Closed表里。
2.1: 若在 Closed 表里,則檢查新路徑是否比原先更好,若是則采用新路徑。
2.2: 否則把 C 添加到 Open 表里.
(3) 對所有 B 的子孫節點重復步驟 5).
6) 重復步驟 4).