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