練習了將近乙個月的搜尋演算法了,也有了一些小小的感悟。
搜尋演算法的兩個關鍵問題:
(1):如何找到整個解空間。
(2):如何剪枝。
我的感悟是關於解空間的。問題的解往往需要經過一系列操作之後才能得到,而在這一系列的操作中,每一步的操作都會得到乙個狀態,當最終這個狀態與目標狀態相同時,此時也就是得到了結果,所以在搜尋的過程中,著重需要處理的就是
操作和狀態。只有考慮了所有可能的操作,才會得到所有可能的狀態。下面舉例說明。
以nyoj的21題《三個水杯》為例(這道題的題目及解題報告在本部落格中,讀著可先閱讀題目),問題所包含的所有操作如下圖:
每一步都有6種操作方法,那是不是按照這6種操作方法進行搜尋,就可以得到結果了呢?先來看看下面這組測試資料:
6 3 1
4 1 1
按照6中操作方法所得的搜尋樹如下圖:
如圖中紅色箭頭所示的搜尋路徑a→b→a……,a→c→a……,如果按照深度優先進行搜尋(當然,這道題最好使用寬度優先搜尋,這裡只是為了說明問題),這裡出現了死迴圈。那是不是只要避免出現這種搜尋路徑,就能避免出現死迴圈呢?遺憾的是出現死迴圈的路徑還可以是更複雜一些的,所以很難通過對操作進行限制來解決出現重複狀態。
既然因為同乙個狀態在搜尋樹中重複出現,導致搜尋的無窮盡。容易想到在狀態上做文章,也就是將搜尋中出現的狀態儲存下來,當得到新的狀態時,判斷該狀態是否出現過,出現過則捨棄,如下圖:
通過這個例子,發現當考慮了所有的操作時,還要對操作所得狀態進行判斷,是否已出現過,來避免重複搜尋。這道題我糾結了好久,就是因為我想通過限制操作來避免出現重複狀態,而出現重複狀態的情況有很多,很難考慮全面。其實判斷狀態是否重複我之前也都做過,就是在搜尋迷宮的過程中,操作就是移動的方向,而狀態就是位置,為了避免重複搜尋就在地圖上做標記,當時這樣做的時候覺得順理成章,不過在這題裡,卻並沒有能直接這樣做。
總結下,在搜尋整個解空間時,首先是考慮所有的
操作,然後通過儲存已出現
狀態,來防止重複搜尋。如果很容易通過對操作進行限制來防止狀態的重複出現,或是儲存狀態所需的記憶體空間過大的話,那就不宜儲存狀態。
本人菜鳥,有高見者請賜教!
搜尋演算法的感悟 解空間
練習了將近乙個月的搜尋演算法了,也有了一些小小的感悟。搜尋演算法的兩個關鍵問題 1 如何找到整個解空間。2 如何剪枝。我的感悟是關於解空間的。問題的解往往需要經過一系列操作之後才能得到,而在這一系列的操作中,每一步的操作都會得到乙個狀態,當最終這個狀態與目標狀態相同時,此時也就是得到了結果,所以在搜...
搜尋演算法的感悟 解空間
練習了將近乙個月的搜尋演算法了,也有了一些小小的感悟。搜尋演算法的兩個關鍵問題 1 如何找到整個解空間。2 如何剪枝。我的感悟是關於解空間的。問題的解往往需要經過一系列操作之後才能得到,而在這一系列的操作中,每一步的操作都會的到乙個狀態,當最終這個狀態與目標狀態相同時,此時也就是得到了結果,所以在搜...
A 搜尋演算法
啟發式搜尋演算法 要理解 a 搜尋演算法,還得從啟發式搜尋演算法開始談起。所謂啟發式搜尋,就在於當前搜尋結點往下選擇下一步結點時,可以通過乙個啟發函式 來進行選擇,選擇代價最少的結點作為下一步搜尋結點而跳轉其上 遇到有乙個以上代價最 少的結點,不妨選距離當前搜尋點最近一次展開的搜尋點進行下一步搜尋 ...