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