簡單穩定能取得最優解的尋路演算法

2021-05-23 11:48:59 字數 1229 閱讀 6624

現有的尋路演算法有許多, a* 尋路, 隨機尋路, 廣度優先的遍歷演算法,還有遺傳演算法尋路, 以上的演算法在網上介紹很多, 在這裡不詳細介紹了。 a* 是比較有名的尋路演算法, 簡單,高效, 但缺點也很明顯, 不穩定,且得到的解不是最優解, 特別是在路徑複雜的情況下,a* 得到的路徑與最優解的路徑相差很大。  廣度優先的遍歷演算法資源開銷極其巨大, 把所有的路找出來並比較一遍,開銷是難以想象的。

在遊戲開發的過程中, 如何取得高效且最優的路徑是相當重要的。 經過琢磨, 思路如下: 假設有乙個擁有無限複製能力的機械人, 開始尋找目標點, 每前進一步做乙個標記(標識該路已經被經過),如果遇到分叉路口,就複製自身, 丁字路口就複製2個,十字路口就複製3個,已經被經過的路不再重複經過,  無路可走(遇到障礙或者前面的路都已經被其他機械人經過)時, 原地銷毀; 有路走時,一直走,遇到路口就複製,如此重複, 直到找到目標點。

由於每個機械人都是複製品, 移動能力是相等的, 所以最先找到目標點的機械人所經過的路徑肯定是最優解!

**建模如下:

測試所用的圖形渲染如下:

測試窗體**:

如果想看一下尋路的步驟,可以去掉窗體中的注釋, 一步一步觀察尋路的過程。

測試結果:

上面採用的演算法,可以算是廣度遍歷尋路演算法的乙個變種, 不再重複走已經走過的路徑, 並且不需要做很多搜尋和開銷, 通過競爭的方式來取得最優解。  

在遊戲中, 可能路徑不會那麼簡單, 有些路比較難走,象沼澤、沙漠, 經過的路需要耗費的移動點數很多,  有些路比較好走, 象已經開闢的馬路,不太需要耗費移動點數,  這樣的情況下, 我們需要對該演算法進行一些改變。

首先, 我們建立一張帶耗費移動力權值的地圖表, 0 不可走, >=1 為需要耗費的移動力權值

原理如下: 假設有乙個擁有無限複製能力的機械人, 開始尋找目標點, 每前進一步做乙個標記(標識該路已經被經過),如果遇到分叉路口,就複製自身, 丁字路口就複製2個,十字路口就複製3個,已經被經過的路不再重複經過,  無路可走(遇到障礙或者前面的路都已經被其他機械人經過)時, 原地銷毀; 有路走時,一直走,每個座標點耗費的時間為地圖表對應的權值,遇到路口就複製,如此重複, 直到找到目標點, 優先找到目標的機械人的路徑為最佳路徑。

對 snode 類進行改造,

///

/// 尋路結點

///

public class node

對 wayfinder 也進行改造:

圖形渲染觀察類:

窗體**:

效果如下:

HDU 1435 簡單穩定婚姻問題

題意 problem description network 公司的boss 說現在他們公司建立的訊號發射站和接收站經常出現訊號傳送接收不穩定的問題,訊號的穩定度被定義為發射點到接收點的距離,距離越大,越不穩定,所以發射點跟接收點在可能的情況下應越近越好.boss給8600的任務就是 建立乙個匹配表...

一定能影響你的簡單十句話

雖然類似的文章也看過不少,但是覺得這篇確實不錯!第一句 如果我們之間有1000步的距離 你只要跨出第1步 我就會朝你的方向走其餘的999步 第二句 通常願意留下來跟你爭吵的人 才是真正愛你的人 第三句 付出真心 才會得到真心 卻也可能傷得徹底 保持距離 就能保護自己 卻也注定永遠寂寞 第四句 有時候...

穩定高併發高效能程式設計原則簡單總結

穩定性是第一前提,如系統崩潰恢復容災備份這些,主要是一些資料保護的機制,還有就是程式引數的校驗 異常的處理 事務的回滾 程式邊界的設計 合理的邊界劃分可以避免服務的連鎖崩潰 對賬機制等,這些都是日常生活中常用的一些手段在計算機領域的體現,更詳細的設計就不深入的分析了。通過多年來對作業系統的研究,以及...