學習隨筆 IDAStar演算法

2021-09-01 16:13:21 字數 1540 閱讀 8867

**:

黑色和紅色是正文...其他顏色我的個人理解

ida*演算法是a*演算法和迭代加深演算法的結合。//實際上並沒有感覺出來...境界不夠...感覺ida*就是利用啟發函式給出剪枝條件

迭代加深演算法是在dfs搜尋演算法的基礎上逐步加深搜尋的深度,它避免了廣度優先搜尋占用搜尋空間太大的缺點,也減少了深度優先搜尋的盲目性。

//實際上由於不需要儲存結點,不需要判重複,也不需要根據 h值對結點排序,確實占用空間小,但是個人感覺還是在盲目的深搜...毫無方向性可言...只不過給出了上界,超出就會剪枝....

(矛盾於

如果沒有找到解,則加大閾值maxh,再重複上述搜尋,直到找到乙個解。在保證h值的計算滿足a*演算法的要求下,可以證明找到的這個解一定是最優解)

而在a*演算法中,我們通過使用合理的估價函式,然後在獲得的子節點中選擇fcost最小的節點進行擴充套件,以此完成搜尋最優解的目的。但是a*演算法中,需要維護關閉列表和開放列表,需要對擴充套件出來的節點進行檢測,忽略已經進入到關閉列表中的節點(也就是所謂的「已經檢測過的節點」),另外也要檢測是否與待擴充套件的節點重複,如果重複進行相應的更新操作。所以a*演算法主要的代價花在了狀態檢測和選擇代價最小節點的排序上,這個過程中占用的記憶體是比較大的,一般為了提高效率都是使用hash進行重複狀態檢測。

綜合了a*演算法的人工智慧性和回溯法對空間的消耗較少的優點,在一些規模很大的搜尋問題中會起意想不到的效果。它的具體名稱是 iterative deepening a*, 2023年由korf提出。該演算法的最初目的是為了利用深度搜尋的優勢解決廣度a*的空間問題,其代價是會產生重複搜尋。歸納一下,ida*的基本思路是:首先將初始狀態結點的h值設為閾值maxh,然後進行深度優先搜尋,搜尋過程中忽略所有h值大於maxh的結點;如果沒有找到解,則加大閾值maxh,再重複上述搜尋,直到找到乙個解。在保證h值的計算滿足a*演算法的要求下,可以證明找到的這個解一定是最優解。在程式實現上,ida* 要比 a* 方便,因為不需要儲存結點,不需要判重複,也不需要根據 h值對結點排序,占用空間小。 而這裡在ida*演算法中也使用合適的估價函式,來評估與目標狀態的距離。

在一般的問題中是這樣使用ida*演算法的,當前局面的估價函式值+當前的搜尋深度 > 預定義的最大搜尋深度時,就進行剪枝。這個估計函式的選取沒有統一的標準,找到合適的該函式並不容易,但是可以大致按照這個原則:在一定範圍內加大各個狀態啟發函式值的差別。

最近看八數碼問題有點小感觸.....

思路基礎:

bfs+hash 

雙向bfs+hash+逆序數對判斷

a* + 逆序數對判斷+曼哈頓距離

ida*+逆序數對判斷+曼哈頓距離

雖然思想上a*更加漂亮,每一次的探索具有強烈的目的性,但是空間上可能是無法接受的,空間開銷巨大

還是要吐槽ida* 演算法的思想.....(馬克也許是我對於此演算法的理解不夠過於深刻)雖然空間開銷小,但是思想很爛....完全就是乙個剪枝的思想.....因為不能保證在maxh閥值內一定找到最優解(通常下能找到),也就是說剪枝可能會剪掉原來正確的情況.....一旦maxh擴大,其深搜的重複性是災難的.....之前探索的所有過程都要重新~重新進行....並且在其規模上擴大.....要死的節奏

演算法(Java隨筆) 窮舉演算法

窮舉演算法的基本思想就是從所有可能的情況中搜尋正確的答案,使用迴圈語句和條件判斷語句逐步驗證每一種可能的正確性,從而得到正確的答案。窮舉法是一種針對於密碼的破譯方法。這種方法很像數學上的 完全歸納法 並在密碼破譯方面得到了廣泛的應用。簡單來說就是將密碼進行逐個推算直到找出真正的密碼為止。比如乙個四位...

PHP MYSQL 學習隨筆

1 安裝apache 2.2.14 和 php 5.2.12 之後,重新啟動apache,啟動失敗。查了一些資料,基本上給出的建議是禁掉extension。我就裝了乙個extesion mysqli。修改php.ini 注釋掉這一行,果然生效。php mysqli extension php mys...

C 學習隨筆

過載 通過函式過載實現類的多型特性,其特徵 1 同一作用域內 同一類中 2 相同的函式名。3 引數與返回型別不同 僅返回型別不同,不是過載函式。4 virtual關鍵字不影響。覆蓋 通過函式覆蓋實現類的繼承特性,其特徵 1 不同作用域 非同一類中 2 函式名 引數都相同。3 基類中的函式須有virt...