1. 程式人生 > >【學習隨筆】IDAStar演算法

【學習隨筆】IDAStar演算法

轉自:https://blog.csdn.net/urecvbnkuhbh_54245df/article/details/5856756

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

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

迭代加深演算法是在dfs搜尋演算法的基礎上逐步加深搜尋的深度,它避免了廣度優先搜尋佔用搜尋空間太大的缺點,也減少了深度優先搜尋的盲目性。//實際上由於不需要儲存結點,不需要判重複,也不需要根據 H值對結點排序,確實佔用空間小,但是個人感覺還是在盲目的深搜...毫無方向性可言...只不過給出了上界,超出就會剪枝....

感覺他的探索範圍類似一個圓,剪枝範圍內探索一遍它主要是在遞迴搜尋函式的開頭判斷當前搜尋的深度是否大於預定義的最大搜索深度,如果大於,就退出這一層的搜尋,如果不大於,就繼續進行搜尋。//這句話充分說明了IDA*演算法思想核心就是剪枝這樣最終獲得的解必然是最優解。//這句話有待探究和下文矛盾,在閥值範圍內是否一定能找出最優解是個問題(矛盾於如果沒有找到解,則加大閾值maxH,再重複上述搜尋,直到找到一個解。在保證H值的計算滿足A*演算法的要求下,可以證明找到的這個解一定是最優解

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

綜合了A*演算法的人工智慧性和回溯法對空間的消耗較少的優點,在一些規模很大的搜尋問題中會起意想不到的效果。它的具體名稱是 Iterative Deepening A*, 1985年由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擴大,其深搜的重複性是災難的.....之前探索的所有過程都要重新~重新進行....並且在其規模上擴大.....要死的節奏