題目連線
問題引入:在進行bfs搜尋的過程中,只能說明起始狀態距離該狀態的代價最小,但是在未來的搜尋中,該狀態到目標狀態的可能會花費更高的代價,導致最優解的搜尋量增大。
為了提高搜尋效率,可以讓那些代價大的方案盡可能的在後面進行搜尋,此時就需要引入a*演算法。
做法:設計乙個估值函式f(state),估值函式必須滿足,在未來的搜尋過程中,估值不能大於未來的實際價值,估算出當前距離目標狀態的代價,使估值越小的狀態,盡可能的在前面搜尋。
實現方法:利用優先佇列儲存,值為當前狀態的代價+估計的代價 即:d[state] + f(state)
估值函式的實現:可以將估值函式設計為:當前狀態的所有數字的位置與目標狀態的曼哈頓距離之和
//求曼哈頓距離的函式
intf
(string s)
return res;
}
ac**:
#include
#include
#include
#include
#include
using
namespace std;
typedef pair<
int,string> pis;
const
int n =9;
//定義小跟堆
priority_queue
,greater
> q;
string anss =
"12345678x"
;//目標狀態
//求曼哈頓距離的函式
intf
(string s)
return res;
}//當前狀態的具體步數
map ma;
string bfs
(string s));
ma[s]=""
;//第一次放入隊列為空
int xx=
;//表示上下左右,udlr
int yy=
; string dir =
"udlr"
;while
(!q.
empty()
)for
(int i =
0;i<
4;i++))
;}}return
" ";
}int
main()
//先求逆序對的數量,逆序對的數量為奇數則無解
int cnt =0;
for(i =
0;i1;i++)}
}// cout(cnt%2==
1)cout<<
"unsolvable"
;else
return0;
}
三種距離 A 演算法解八數碼問題
曼哈頓距離 計程車距離 走網格線的矩形路線 歐氏距離 以空間為基準的兩點之間最短距離 切比雪夫距離 維度為3及以上,例,出物理距離外,還要加上財力等權值。明氏距離 明科夫斯基距離 維度為1時,等價與曼哈頓距離 為2時,等價與歐式距離 3及以上,等價於切比雪夫距離 漢明距離 在資訊理論中,兩個等長字串...
poj 1077 Eight A 解八數碼問題
題意 經典的八數碼問題。分析 搜尋演算法的區別是如何重排open表,關鍵是如何編碼狀態和定義狀態的值。對搜尋過程中任意狀態s,a 演算法以g s h s 重排open表,也就是說g s h s 是排列open中狀態的依據,其中g s 是初始狀態到s的消耗,h s 是s到目標狀態的估計。我重排open...
八數碼問題的A 演算法求解
a 演算法是啟發式搜素演算法中較為出名和高效的演算法之一,其關鍵是對於啟發式函式的實際,啟發式函式h x 需要盡可能的接近實際的h x h x 下面是人工智慧八數碼問題使用a 演算法求解的原始碼放在部落格上記錄一下。程式使用放錯位置的棋子的個數作為啟發式函式。include include incl...