C A A Star演算法簡介

2021-08-03 10:44:39 字數 3961 閱讀 6751

演算法一直維護兩個表: open和close

公式表示為: f(n)=g(n)+h(n),

其中 f(n) 是從初始狀態經由狀態n到目標狀態的代價估計,

g(n) 是在狀態空間中從初始狀態到狀態n的實際代價,

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

通俗一點講:

g(n)代表你從起始點到下一點的實際距離(制定到下一點的距離的規則)

h(n)是自己設計的函式,可以是到目的地大致的距離

可將迴圈過程封裝成函式:

[cpp]view plain

copy

print?

while (isnotend())   

舉個栗子:

對於以下圖:5行15列

000000000000000

0000000x0000000

00s0000x0000

e00

0000000x0000000

00000000

0000000

其中x為牆壁,s為起點,e為終點,建立合適的模型,呼叫a star演算法,找到一條s到e的最短路徑。

取直走g值為10,斜走g值為14

這裡h值設定為無視障礙到達終點所需的 步數*10

我們看開始的幾步:

000000000000000

0000000x0000000 00

s0000x0000e00

0000000x0000000

000000000000000

灰色的點g=10,h=9*10 ,其f值最小,加入close

000000000000000

0000

000x0000000 00

s0000x0000e00

0000000x0000000

000000000000000

灰色的點g=10+10,h=8*10 ,其f值最小,加入close

000000000000000

0000

000x0000000 00

s0000x0000e00

00000

00x0000000

000000000000000

灰色的點g=10+10+10,h=7*10 ,其f值最小,加入close

000000000000000

0000

000x0000000 00

s000

0x0000e00

00000

00x0000000

000000000000000

灰色的點g=10+10+10+10,h=6*10 ,其f值最小,加入close

以此迴圈,直到e在open中,此時只需要沿著父節點往回走就可以到達起點了,這條路就是當前情況下最優的解

結果:000000000000000

0000000x0000000 00

s000

0x0000e

000000000x0

000000

00000000

0000000

c++實現:

[cpp]view plain

copy

print?

#include#include#include#includeusing namespace std;

char square[5][15] = ;  

class point   

pair parentposi;  

pair posi;  

char v;//value

int f;  

int g;  

int h;  

int updatef()   

int updateh()   

if (y < 0)   

h = x + y;  

return h;  

}  void setposi(pair x)   

void setparentposi(pair x)   

void setg(int g)   

void seth(int h)   

point &operator = (point &s)   

};  

vector open;  

vector close;  

point squ[5][15] = ;  

bool isinopenlist(pair s)   

}  return

false;  

}  bool isincloselist(pair s)   

}  return

false;  

}  void putreachableintoopen(point min) ;  

for (int i = 0;i < 8;i++)   

}  if (direc[i][0] * direc[i][1] != 0)   

}  else   

continue;  

}  //既不在關閉也不在開啟列表中而且可到達 就將其加入開啟列表

if ((!isinopenlist(make_pair(x, y))) && (!isincloselist(make_pair(x,y)))&&x >= 0 && x < 5 && square[x][y] != 'x')   

else   

//cout << "(" << squ[x][y].posi.first << "," << squ[x][y].posi.second << ")" << endl;

}  x = x - direc[i][0];  

y = y - direc[i][1];  

}  //cout << "------------------------" << "(" << x << "," << y << "):" << "------------------------" << endl;

}  void find_deleteminfromopen_addtoclose()   

}  close.push_back(min_);  

std::vector::iterator it=open.begin()+tempi;  

open.erase(it);  

//cout << "close:           (" << min_.posi.first << "," << min_.posi.second << ")" << endl;

//cout << "closesize()=" << close.size() << endl;

//cout << "opensize()=" << open.size() << endl;

}  bool isnotend()   

}  return

true;  

}  void findpath(pair begin,pairend)   

}  std::vector::iterator it = open.begin()+tempi;//刪除起點

while (isnotend())   

}  void print_path()   

}//初始化point.posi

findpath(make_pair(2,2),make_pair(2,12));  

point temp = squ[2][12];  

vectorpoint_out;  

while (temp.posi!=squ[2][2].posi)   

point_out.push_back(squ[2][2].posi);  

while (point_out.size() != 0)   

}  void print()   

cout << endl;  

}  }  

int main()  

RSA演算法簡介

rsa演算法簡介 1 簡介 當前最著名 應用最廣泛的公鑰系統rsa是在1978年,由美國麻省理工學院 mit 的rivest shamir和adleman在題為 獲得數字簽名和公開鑰密碼系統的方法 的 中提出的。它是乙個基於數論的非對稱 公開鑰 密碼體制,是一種分組密碼體制。其名稱來自於三個發明者的...

演算法分析(簡介)

演算法分析即指對乙個演算法所需要的資源進行 記憶體,通訊頻寬或計算機硬體等資源偶爾是我們主要關心的,乙個演算法所需要的資源越多,該演算法的複雜性越高,反之,所需要的資源越少,該演算法的複雜性越低,在計算機的資源中,最重要的是時間和空間 即儲存器 資源,因此演算法複雜性有時間複雜性和空間複雜性之分,不...

RSA演算法簡介

rsa演算法是 r rirest asllalnlr和l adleman於1977年在美國麻省理工學院開發,於1978年首次公布,其演算法如下 a 選擇兩質數p q。b 計算n p q。c 計算n的尤拉函式 n p 1 q 1 d 選擇整數e,使e與 n 互質,且1 利用rsa加密,首先需將明文數位...