A A star 搜尋總結

2021-08-28 16:46:05 字數 2247 閱讀 8953

標籤:演算法——搜尋

閱讀體驗:

\(a^*\)演算法在人工智慧中是一種典型的啟發式搜尋演算法

啟發中的估價是用估價函式表示的:

h(n)=f(n)+g(n)

其中f(n)是節點n的估價函式

g(n)表示實際狀態空間中從初始節點到n節點的實際代價

h(n)是從n到目標節點最佳路徑的估計代價。

另外定義h'(n)為n到目標節點最佳路徑的實際值。

如果h'(n)≥h(n)則如果存在從初始狀態走到目標狀態的最小代價的解

那麼用該估價函式搜尋的演算法就叫\(a^*\)演算法。

有點繁瑣,但也看得過去

\(a^*\)的核心在於上面所講到的估價函式

他是幹什麼用的呢

就是我們在搜尋的過程中,保證更優的先蒐用的

還是有些繁瑣對不對,嗯,我也不大會講啊(沒事我會加油)

嘿,認真看下面,我可認真了的啊。。。

如果乙個題目要求我們求前k個代價最小的解(只是乙個典型,不是所有題目都這樣)

假設我們現在有乙個狀態在\(now\)

已經要記錄到答案裡面的代價是\(d\)(我喜歡用這個)

我們發現如果爆搜的話狀態會是亂的對不對,肯定會使搜尋搜到太多

而如果直接把狀態按照\(d\)排序的話不能保證答案就會正確(當然,不然就去貪心去)

所以我們引進乙個估價函式\(g[狀態]\)

當然要求一般是可以預處理出乙個狀態到答案狀態的最優解

回到前面講到的當前狀態\(now\)

如果我們把與\(now\)並列的所有狀態按\(d+g[now]\)排序呢?

既不影響答案的正確性,又可以減少壞狀態的轉移

(因為題目要求是k個最優狀態,而這樣待決策狀態會有序且跑完k個就可以結束,所以會變快)

好吧,還有點矇對不對,那我們看例題

洛谷p2901 [usaco08mar]牛慢跑cow jogging

好像其他很多\(oj\)都有,但是\(bzoj\)是許可權。。。

要求我們求出從起點n到終點1的最短k條路徑的長度

(只能從編號大的點往編號小的點走&邊有邊權)

預處理估價函式

先跑一遍反向邊的\(spfa\)預處理出每個點到1的最短路作為估價函式

直接跑\(a^*\)(這裡用\(bfs\)實現)

從n號點開始\(bfs\),用堆來代替佇列(實現上面所講的排序)

這時候先到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 (A star)搜尋總結

a 演算法在人工智慧中是一種典型的啟發式搜尋演算法 啟發中的估價是用估價函式表示的 h n f n g n 其中f n 是節點n的估價函式 g n 表示實際狀態空間中從初始節點到n節點的實際代價 h n 是從n到目標節點最佳路徑的估計代價。另外定義h n 為n到目標節點最佳路徑的實際值。如果h 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...