這是一個真正靠譜的尋路算法


絕對沒有其他看起來高大上 給別人講都將不明白的理論。管你 人工智能 啥的 ,還有一百度一大篇的a*算法 ,其實大部分文章的理論都是講不通的 或者沒有講清楚 更別說代碼。做事刨根問底的牛脾氣又上來了。
 
兩周前 偶然原因接觸到了尋路算法 於是百度 找到了a* 。講來將去大概意思就是持續性的找離目標近的節點 並且走過的節點不能重復走。反正百度搜a*算法 一搜一大片。在很簡單的障礙的情況下是沒問題 :
 
但是拐個彎就不行了,不是找最近的么,我讓你一直找最近的。 直接迂在里面出不來了:
 
期間我曾經想過為什么不讓旁邊的葉子節點繼續開枝散葉 繼續尋找呢。當時就覺得這種方式是可行的。因為起點跟終點我們始終在同一個能夠聯通的領域嘛 我就像水一樣不斷的蔓延不斷的蔓延到你那去。始終是能到達的。這可能就是網上說的所謂的廣度搜索。節點 又繼續節點 當時就想到遞歸嘛,沒想到粗糙的用遞歸 把我自己給繞進去了 。本身是一個樹狀結構。哪些節點遍歷了 哪些沒有遍歷 容易形成交叉 或者死循環 。最終要形成一個線性的遍歷流程 。 程序要有一個嚴密的理論基礎 ,如果達不到這一點隨便怎么倒騰始終會崩潰的。就在這個問題上我遇到了瓶頸,始終不能解決 ,因為自己太菜了 處理不好這種數據結構。在最近兩天看數據結構二叉樹那一部分的時候 看到了 那種嚴密的遍歷和組織二叉樹 數據的方式  於是我覺得有方法了。
 
換作人的思維 如果我們想 接近一個目標 我們該怎么做, 廢話 走直路咯 ,當然是怎么近怎么走 。對咯 那么我們應該在下一步上下左右的。所有坐標中 選擇 離目標最近的那個,這個已經在第一個圖a*算法中就說明了。遇到阻擋了怎么辦呢 ,開枝散葉 讓接近出口的節點繼續蔓延,這里有一個細節 就是接着繼續找的時候要以距離近的節點優先。 就是這樣根本沒啥復雜的理論。我們要想辦法用程序語言 組織一個“樹”來解決這些問題 ,並且不能讓他們產生交叉 和循環遍歷的邏輯錯誤。
 
nice 就是這樣 這就是我想要的結果 。還差最后一步。
既然已經觸及到最終目標了 那么剩下的 自然就是用“順藤摸瓜”的方式找回去的路徑。最后一個節點依次找他的父節點  直至找到起點為止  來形成一個唯一的路徑。
 
 
哇咔咔 不由得佩服我自己。這是屬於我的領域 我將以我的上帝之眼 和我的靈魂感知觸及世界的所有能觸及的領域  你是逃不掉的 。哇哈哈哈哈,是不是好好玩。 最后一看 我ca 竟然自動就是最優路徑 。 我本來還想繼續處理這個問題的。自然界就是這么神奇 ,微妙的關系里存在着一種平衡 ,就像我說的hsl顏色處理的那篇博文一樣 。你看 他選擇最佳直線路徑的時候 如果遇到了阻擋 自動就迂回在里面了 並且事先把這個坑填滿了  最終達到壞死  ,然后讓外面的路徑直接越過坑的外延 到達了目標 。 有時候想想 既是科學 又是一種平衡的哲學 自然界 造物主就是這么的神奇。 源碼
其實這種廣度搜索方式 只能說在這種迷宮搜索的環境下用的比較好 ,因為就像森林樣 通路比較少空間狹窄 正適合這種場景。 而對於比較空曠的環境 目標比較明顯  如果應用這種算法就要浪費一些效率 應該直擊目標的方式  也就是深度搜索 會比較好。還有就是對於數據結構處理 天生就決定了 要用到一些指針 和繞來繞去的思維。c#寫程序是要簡單一些 但對於這種數據結構的處理 比如 十字鏈表啊 二叉樹啊 圖啊 這些 確實要弱一些 所以一般的數據結構的書都是c描述的。但是只要你深入理解了某個東西的原理精髓后 用c#也是一樣可以寫出來的 語言只是工具。諾 這就有大師用c#寫出了數據結構的書: 
http://www.cnblogs.com/abatei/archive/2008/10/12/1309615.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM