公式: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語言編...