深搜 IDA 演算法 POJ2286

2021-05-26 22:04:43 字數 1404 閱讀 8789

#寫得真是太好了

而ida*演算法具有如下的特點:(

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

而這裡在ida*演算法中也使用合適的估價函式,來評估與目標狀態的距離。

在一般的問題中是這樣使用ida*演算法的,當前局面的估價函式值+當前的搜尋深度 > 預定義的最大搜尋深度時,就進行剪枝。

這個估計函式的選取沒有統一的標準,找到合適的該函式並不容易,但是可以大致按照這個原則:在一定範圍內加大各個狀態啟發函式值的差別。

**:/*

* poj2286 the rotation game

* 解題思路:使用迭代加深的深度搜尋演算法,這裡非常要注意還是剪枝的問題

* 只有較好的針對題目環境的剪枝,才能提高搜尋效率

*/#include

#include

#include

using namespace std;

//使用陣列表示遊戲局面

int map[25],countarray[25];

//搜尋深度 , 最終的局面中心數字

int depth,res;

char outpath[100];

//判斷是否到達了目標局面

bool isok(const int* state)

return true ;

}//統計局面的中心區域含有相同數字的最大數量

int countmaxsamenumber(const int* state)

void changestate(int *state,int a1,int a2,int a3,int a4,int a5,int a6,int a7)

//迭代加深搜尋

//state:當前局面 currdepth :當前所處的搜尋深度 predir:當前搜尋選擇的旋轉的方向

bool dfssearch( int* state ,int currdepth , int predir)

if( dfssearch(tmp , currdepth+1 , i))

return true ;

}return false ;

}int main()

cout<}}

POJ 2286 IDA 搜尋(迭代加深搜尋演算法)

ida 搜尋又成為迭代加深搜尋,感覺迭代加深這個稱謂就基本概括了這種搜尋算沒的核心。首先所以討論一下什麼迭代加深搜尋,深度優先搜尋乙個局面可以搜尋很多很多層,這種情況很可能時間啊複雜度很大 怎麼辦呢?聰明的人們想到了限制限制了搜尋深度,正是所謂的迭代加深搜尋,就是在深度無上限的情況下,先預估乙個深度...

廣搜與深搜演算法

bfs 廣度優先搜尋 從起點開始,檢視與其相鄰並且滿足題中條件的周圍的所有點 第一層點 然後再以他們為 起點 再去檢視與他們相鄰的第二層的點,一層一層的遍歷,直到找到目標。廣搜一般用於尋找最小路徑等型別題目,因為是層層尋找,所以尋找到的目標一定是最好的解,其大概過程如同一滴水滴到水池產生的水波。但是...

深搜演算法筆記

沒錯高產的我又來了 1.初始狀態,從頂點1開始 2.依次訪問過頂點1,2,3後,終止於頂點3 3.從頂點3回溯到頂點2,繼續訪問頂點5,並且終止於頂點5 4.從頂點5回溯到頂點2,並且終止於頂點2 5.從頂點2回溯到頂點1,並終止於頂點1 6.從頂點4開始訪問,並終止於頂點4 所謂深搜 也叫回溯法 ...