在此把這個算法稱作B* 尋路算法(Branch Star 分支尋路算法,且與A*對應(yīng)),本算法適用于游戲中怪物的自動尋路,其效率遠(yuǎn)遠(yuǎn)超過A*算法,經(jīng)過測試,效率是普通A*算法的幾十上百倍。
通過引入該算法,一定程度上解決了游戲服務(wù)器端無法進(jìn)行常規(guī)尋路的效率問題,除非服務(wù)器端有獨(dú)立的AI處理線程,否則在服務(wù)器端無法允許可能消耗大量時間的尋路搜索,即使是業(yè)界普遍公認(rèn)的最佳的A*,所以普遍的折中做法是服務(wù)器端只做近距離的尋路,或通過導(dǎo)航站點(diǎn)縮短A*的范圍。
算法原理
本算法啟發(fā)于自然界中真實動物的尋路過程,并加以改善以解決各種阻擋問題。
前置定義:
1、探索節(jié)點(diǎn):
為了敘述方便,我們定義在尋路過程中向前探索的節(jié)點(diǎn)(地圖格子)稱為探索節(jié)點(diǎn),起始探索節(jié)點(diǎn)即為原點(diǎn)。(探索節(jié)點(diǎn)可以對應(yīng)為A*中的開放節(jié)點(diǎn))
2、自由的探索節(jié)點(diǎn):
探索節(jié)點(diǎn)朝著目標(biāo)前進(jìn),如果前方不是阻擋,探索節(jié)點(diǎn)可以繼續(xù)向前進(jìn)入下一個地圖格子,這種探索節(jié)點(diǎn)我們稱為自由探索節(jié)點(diǎn);
3、繞爬的探索節(jié)點(diǎn):
探索節(jié)點(diǎn)朝著目標(biāo)前進(jìn),如果前方是阻擋,探索節(jié)點(diǎn)將試圖繞過阻擋,繞行中的探索節(jié)點(diǎn)我們成為繞爬的探索節(jié)點(diǎn);
算法過程
1、起始,探索節(jié)點(diǎn)為自由節(jié)點(diǎn),從原點(diǎn)出發(fā),向目標(biāo)前進(jìn);
2、自由節(jié)點(diǎn)前進(jìn)過程中判斷前面是否為障礙,
a、不是障礙,向目標(biāo)前進(jìn)一步,仍為自由節(jié)點(diǎn);
b、是障礙,以前方障礙為界,分出左右兩個分支,分別試圖繞過障礙,這兩個分支節(jié)點(diǎn)即成為兩個繞爬的探索節(jié)點(diǎn);
3、繞爬的探索節(jié)點(diǎn)繞過障礙后,又成為自由節(jié)點(diǎn),回到2);
4、探索節(jié)點(diǎn)前進(jìn)后,判斷當(dāng)前地圖格子是否為目標(biāo)格子,如果是則尋路成功,根據(jù)尋路過程構(gòu)造完整路徑;
5、尋路過程中,如果探索節(jié)點(diǎn)沒有了,則尋路結(jié)束,表明沒有目標(biāo)格子不可達(dá);
演示如下:



B*與A*算法的性能比較
尋路次數(shù)比較(5秒鐘尋路次數(shù))

B*與A*性能比較實例
1、 無障礙情況
此種情況,根據(jù)以上測試數(shù)據(jù),B*算法效率是普通A*的44倍(左為A*,右為B*)

2、線形障礙
此種情況,根據(jù)以上測試數(shù)據(jù),B*算法效率是普通A*的28倍(左為A*,右為B*)

3、環(huán)形障礙
此種情況,根據(jù)以上測試數(shù)據(jù),B*算法效率是普通A*的132倍(左為A*,右為B*)
4、封閉障礙(目標(biāo)不可達(dá))
此種情況,根據(jù)以上測試數(shù)據(jù),B*算法效率是普通A*的581倍(左為A*,右為B*)

衍生算法
通過以上封閉障礙,可以看出,這個方法在判斷地圖上的兩個點(diǎn)是否可達(dá)上,也是非常高效的,在不可達(dá)情況下,時間復(fù)雜度與封閉障礙的周長相當(dāng),而不是整個地圖的面積。


