關於A 演算法的一些研究

2021-07-22 21:05:03 字數 2350 閱讀 4319

公式:f = g + h 代價計算,尋路代價最小的就是我們要找的

g 表示從起點 a 移動到網格上指定方格的移動耗費 (可沿斜方向移動).

h 表示從指定的方格移動到終點 b 的預計耗費 (h 有很多計算方法, 這裡我們設定只可以上下左右移動)

下面拿個例子說明一下

原文參考

假如從a尋路到b

尋路步驟

1. 從起點a開始, 把它作為待處理的方格存入乙個」開啟列表」(openlist), 開啟列表就是乙個等待檢查方格的列表.

2. 尋找起點a周圍可以到達的方格, 將它們放入」開啟列表」, 並設定它們的」父方格「為a.

3. 從」開啟列表」中刪除起點 a, 並將起點 a 加入」關閉列表」, 「關閉列表」(closelist)中存放的都是不需要再次檢查的方格

接下來我們就可以構建乙個迴圈 去尋找消耗最小的點了 , a為起點我們發現c的代價是最小的 f = g+h = 40 ,第二輪迴圈開始前我們需要從開啟列表中(f由低到高排序)openlist.shift()出乙個作為當前結點, 為了構建迴圈,我們在第一輪結束的時候從開啟列表中拿出第乙個node作為當前結點 ,這樣的迴圈就可以寫成下面這樣

偽**:

curnode = startnode;

while(curnode!= endnode)

//找到最有乙個節點後,構建路徑

_path = new

array();

var node : node = endnode;

_path.push(node);

while(node != startnode)

這裡一定要明確一點:我們構建的路徑是從node.parent構建的鍊錶中獲得的,而不是closelist中的

你會發現,node.parent鍊錶構建的路徑要不closelist代價更小,也就是我們找的最優路徑。

當curnode從綠色的格仔移動到c時,接下來要檢測c周圍的8個格仔了,右邊三個藍色的是障礙物,在上面的while迴圈中的第一步裡,要進行條件過濾

1.障礙物不加入openlist(右邊藍色格仔)

2.在closelist的不需要檢測的也不需要加入openlist(左邊綠色的格仔)

對之前在開啟列表的格仔 要重新計算g值 ,h值是不變的,所以為了比較f=g+h,算一下g值就好了

注意: d之前的g = 14,如果從c點過來計算出來的g0 = (c點的g = 10) + 10 = 20; g0>g ,代價明顯要付出的更多了,所以對於d點的parent我們不能更新為c,還是綠色的格仔a,這樣下乙個最優點就是d了,這裡要理解好

下面我列出尋路的** 和最終效果

「` public function search() : boolean

var cost : number = _straightcost;

if(!((node.x == test.x) || (node.y == test.y)))

var g : number = node.g + cost * test.costmultiplier;

var h : number = _heuristic(test);

var f : number = g + h;

if(isopen(test) || isclosed(test)) //如果新的值還沒有原來的小,我們就什麼也不做,parent還是之前那個,肯定是最小的f,這裡是關鍵,也是不好理解的地方,

} else if(clearance >_square-1) else}}

_closed.push(node);

if(_open.length == 0)

_open.sorton("f", array.numeric);

node = _open.shift() as node;

}buildpath();

return true;

}

效果2

關於樹分塊演算法的一些研究

正統的分塊方法應該是如 王室聯邦 一題的分塊方法。樹塊具體定義如下 1 除根節點所在塊以外,每一塊內深度最小的結點的父親相同。這個父親被稱之為該塊的塊頂,其中特別的根節點也是塊頂。2 每一塊內非深度最小的結點的父親一定與其處於同一塊中。3 b 每塊大小 3b。b是你定義的乙個常數 b就是決定塊大小和...

關於mirai的一些研究

關於mirai的一些研究 配置好對應的go開發環境,即可進行編譯,生成了主要的檔案 badbot為殭屍節點的可執行檔案,cnc為主控端的可執行檔案,其它一些為輔助工具。如下圖所示編譯主控端源 go語句編寫 生成可執行檔案cnc,執行cnc,在本地開啟了23和101的埠監聽 主控端的 主要由go語言編...

關於mirai的一些研究

關於mirai的一些研究 配置好對應的go開發環境,即可進行編譯,生成了主要的檔案 badbot為殭屍節點的可執行檔案,cnc為主控端的可執行檔案,其它一些為輔助工具。如下圖所示編譯主控端源 go語句編寫 生成可執行檔案cnc,執行cnc,在本地開啟了23和101的埠監聽 主控端的 主要由go語言編...