Astar的自我學習

2021-07-11 17:26:52 字數 1740 閱讀 4270

優先佇列就是乙個被賦予了優先順序的佇列,按照過載函式進行最大值或最小值優先。在出隊和提取隊首元素時都是按照優先順序來操作,優先順序最大的元素將進行操作。

#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 生成並且考察過的點,存在兩種點。一種是當前選擇的路徑,是最終想要的結果。另一種是考察但沒...