A 演算法 解經典八數碼問題

2021-10-05 12:09:35 字數 1501 閱讀 8555

題目連線

問題引入:在進行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...