優先佇列就是乙個被賦予了優先順序的佇列,按照過載函式進行最大值或最小值優先。在出隊和提取隊首元素時都是按照優先順序來操作,優先順序最大的元素將進行操作。
#include
#include
#include
#include
using
namespace
std;
struct node
a[10];
struct cmp
};priority_queue vector
,cmp> q;//優先佇列的定義
int main()
while(!q.empty())
}
這個只是乙個優先佇列的示範,如果執行這個程式將會隨機生成100以內的數入隊,在出隊時的順序按照每個元素的x的大小進行。而在astar演算法中的優先順序將以f的大小進行。
這種搜尋演算法又被稱為啟發式搜尋,其中的啟發的估價函式可以這樣表示 f(n) = g(n) + h(n)
g是起點到當前位置的消耗,h是當前位置到終點的消耗。
此演算法中有乙個開啟佇列和乙個結束佇列,在我的程式中我用bool陣列進行判斷,在乙個節點已經進行過操作那麼這個節點就應該在結束佇列裡,並且把它從開啟佇列中刪去。並且我的估計函式十分的簡單(也因為是測試題目中沒有權值)僅僅是計算起點和終點到這個點的步數而已,但也能體現出演算法的思想。
來乙個簡單的題目:
輸入n,m。是行和列,地圖中1表示障礙,0表示可以通過。在這之後輸入起點和終點的橫,縱座標,輸出起點到終點的最短路徑。
**如下(有不足之處請見諒):
#include
#include
#include
#include
#include
using namespace std
;int map[105][105];
//結構體定義
struct v
vis[105][105];
struct g
dad[105][105];
//過載函式
struct cmp
};priority_queue ,cmp> open;
bool close[105][105],open_check[105][105];
g s;
g e;
int n,m;
int f[4][2]=,,,};
//估價函式
void valuation(int x,int y,int x1,int y2)
//回溯列印路徑
void print(int x,int y)
print(dad[x][y].x,dad[x][y].y);
printf("(%d,%d)\n",x,y);
}//astar演算法
void astar(int x,int y)
for(int i=0
;i<4;i++)
else
news.f=vis[news.x][news.y].f
; news.g=vis[news.x][news.y].g
; news.h=vis[news.x][news.y].h
; if(!open_check[news.x][news.y])//不在開啟佇列就入隊}}
}int main()
AStar學習筆記
a a star 演算法是一種靜態路網中求解最短路最有效的方法。公式表示為 f n g n h n 其中f n 是節點n從初始點到目標點的估價函式,g n 是在狀態空間中從初始節點到n節點的實際代價,h n 是從n到目標節點最佳路徑的估計代價。保證找到最短路徑 最優解的 條件,關鍵在於估價函式h n...
astar 集合的交與並
時間限制 1000ms 記憶體限制 65536kb 描述 對於乙個閉區間集合 k 1,ai aj 我們定義其權值 w a1 a2 ak a1 a2 ak 其中 x 表示x區間的長度 如果x為空集 x 0。當然,如果這些閉區間沒有交集則權值為0。給定n個各不相同的閉區間,請你從中找出若干個 至少2個 ...
基於c 的A star演算法
資料 一 基礎原理 1 從起點開始,向周圍八個方向擴充套件。測試新擴充套件的點的路徑代價,路徑代價由已走的路徑和距離終點的期望加和而成。這個路徑代價是選擇路徑的標準。2 有兩個表open close。close 生成並且考察過的點,存在兩種點。一種是當前選擇的路徑,是最終想要的結果。另一種是考察但沒...