a*演算法在人工智慧中是一種典型的啟發式搜尋演算法有點繁瑣,但也看得過去啟發中的估價是用估價函式表示的:
h(n)=f(n)+g(n)
其中f(n)是節點n的估價函式
g(n)表示實際狀態空間中從初始節點到n節點的實際代價
h(n)是從n到目標節點最佳路徑的估計代價。
另外定義h'(n)為n到目標節點最佳路徑的實際值。
如果h'(n)≥h(n)則如果存在從初始狀態走到目標狀態的最小代價的解
那麼用該估價函式搜尋的演算法就叫a*演算法。
的核心在於上面所講到的估價函式
他是幹什麼用的呢
就是我們在搜尋的過程中,保證更優的先蒐用的
還是有些繁瑣對不對,嗯,我也不大會講啊(沒事我會加油)
嘿,認真看下面,我可認真了的啊。。。
如果乙個題目要求我們求前k個代價最小的解(只是乙個典型,不是所有題目都這樣)
假設我們現在有乙個狀態在
已經要記錄到答案裡面的代價是(我喜歡用這個)
我們發現如果爆搜的話狀態會是亂的對不對,肯定會使搜尋搜到太多
而如果直接把狀態按照排序的話不能保證答案就會正確(當然,不然就去貪心去)
所以我們引進乙個估價函式狀態
當然要求一般是可以預處理出乙個狀態到答案狀態的最優解
回到前面講到的當前狀態
如果我們把與並列的所有狀態按排序呢?
既不影響答案的正確性,又可以減少壞狀態的轉移
(因為題目要求是k個最優狀態,而這樣待決策狀態會有序且跑完k個就可以結束,所以會變快)
好吧,還有點矇對不對,那我們看例題
[洛谷p2901 usaco08mar]牛慢跑cow jogging
好像其他很多都有,但是是許可權。。。
要求我們求出從起點n到終點1的最短k條路徑的長度
(只能從編號大的點往編號小的點走&邊有邊權)
預處理估價函式先跑一遍反向邊的預處理出每個點到1的最短路作為估價函式
直接跑(這裡用實現)從n號點開始,用堆來代替佇列(實現上面所講的排序)
這時候先到1節點的肯定答案更優(也就是路徑更短)
原因很簡單吧:估價函式保證答案合法,而排序之後答案有序
搜到k個到達1節點的路徑就可以結束,快的飛起。。。
好不容易寫一次注釋
#include#define lst long long
#define ldb double
#define n 1050
#define m 10050
#define qw ljl[i].to
using namespace std;
const lst inf=1e15;
int read()
while( isdigit(ch))s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
}int n,m,k,done;
bool in[n];
lst dis[n];
queueq;
int hd[n],cnt;
struct edgeljl[m<<1];
void add(int p,int q,int o),hd[p]=cnt;}
void spfa()
}}//h[i]=g[i]+f[i]---->ans[i]=d+dis[i]
struct node
};priority_queueh;
void a_star_bfs()
); while(!h.empty())
for(int i=hd[now];i;i=ljl[i].nxt)
if(qw暫時就將這麼多吧
主要是看到網上沒有寫的那麼通俗的搜尋
就想自己總結一下(其實也不通俗。。。)
撤撤撤溜了溜了*_*
A A star 搜尋總結
標籤 演算法 搜尋 閱讀體驗 a 演算法在人工智慧中是一種典型的啟發式搜尋演算法 啟發中的估價是用估價函式表示的 h n f n g n 其中f n 是節點n的估價函式 g n 表示實際狀態空間中從初始節點到n節點的實際代價 h n 是從n到目標節點最佳路徑的估計代價。另外定義h n 為n到目標節點...
第K短路(A (astar)演算法)
給定一張n個點 編號1,2 n m條邊的有向圖,求從起點s到終點t的第k短路的長度,路徑允許重複經過點或邊。注意 每條最短路中至少要包含一條邊。輸入格式 第一行包含兩個整數n和m。接下來m行,每行包含三個整數a,b和l,表示點a與點b之間存在有向邊,且邊長為l。最後一行包含三個整數s,t和k,分別表...
Google搜尋總結
1,basic operators 使用詳解 http www.googletutor.com google manual web search adding basic operators 2,advanced operators 使用詳解 http www.googletutor.com goo...