什么是A*(Astar)算法?(简单叙述)
生活随笔
收集整理的這篇文章主要介紹了
什么是A*(Astar)算法?(简单叙述)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
簡介
A*算法的原理與思想
A*算法處理與搜索
實例(引用見文末)
?
簡介
A*算法(啟發式搜索)的首要條件是在靜態路網中,相對于廣度優先遍歷(BFS)求最短路徑的最有效算法(BFS缺點是效率低耗時久,而A*更高效)。
| A* | BFS |
| 高效率耗時短 | 低效率耗時久 |
A*算法,A*(A-Star)算法是一種靜態路網中求解最短路徑最有效的直接搜索方法,也是解決許多搜索問題的有效算法。算法中的距離估算值與實際值越接近,最終搜索速度越快。
寬度優先搜索算法(又稱廣度優先搜索,簡稱BFS)是最簡便的圖的搜索算法之一,這一算法也是很多重要的圖的算法的原型。
A*算法的原理與思想
運用了一個很重要的式子:f(n)=g(n)+h(n)
起點至終點的x軸與y軸距離之和即為曼哈頓距離。
如圖黃色線與紅色線的長度即為曼哈頓距離的值。
A*算法結合了貪心算法(深度優先)與Dijkatra算法(廣度優先),優先計算代價更低的方向。
A*算法處理與搜索
實例(引用見文末)
如圖淺綠色點到草綠色點。
clear; clc; clf; figure(1); map =[ 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 .3 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 .7 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ]; pcolor(map) colormap summer [row,col] = size(map); [start_px,start_py] = find(map == .3); [end_px,end_py] = find(map == .7);close = struct([]); closelen = 0; open = struct([]); openlen = 0;%% 將起點添加到open列表 open(1).row = start_px; open(1).col = start_py; open(1).g = 0; open(1).h = abs(end_py - start_py) + abs(end_px - start_px); openlen = openlen + 1; %% 四種運動格式 sport = [0,1;0,-1;-1,0;1,0]; backNum = 0; prev = []; while openlen > 0%% 獲取代價最小的值for i = 1:openlenf(i,:) = [i,open(i).g + open(i).h]; endf1 = sortrows(f,2);current = open(f1(1));choose = 0;chooseArr = [];%% 回溯將走過的點標記出來if current.row == end_px && current.col == end_pyi = 1;while(i<=size(prev,1))if prev(i,3) == current.row && prev(i,4) == current.colchoose = choose +1;chooseArr(choose,1) = prev(i,1);chooseArr(choose,2) = prev(i,2);current.row = prev(i,1);current.col = prev(i,2);i = 1;elsei = i + 1;endend for j = 1: size(chooseArr,1)map(chooseArr(j,1),chooseArr(j,2)) = 0.5;endfigure(2);pcolor(map);colormap winter;return; endcloselen = closelen + 1;close(closelen).row = open(f1(1)).row;close(closelen).col = open(f1(1)).col;close(closelen).g = open(f1(1)).g;close(closelen).h = open(f1(1)).h; open(f1(1)) = [];openlen = openlen -1; for i = 1:4dimNormal = all([current.row,current.col]+sport(i,:)>0) ...&& current.row+sport(i,1)<=row && current.col+sport(i,2)<=col;neighbor.row = current.row + sport(i,1);neighbor.col = current.col + sport(i,2);neighbor.g = abs(start_px - neighbor.row) + abs(start_py - neighbor.col);neighbor.h = abs(end_px - neighbor.row) + abs(end_py - neighbor.col);if dimNormalinCloseFlag = 0; if closelen ==0elsefor j = 1:closelenif close(j).row == neighbor.row && close(j).col ==neighbor.colinCloseFlag = 1;break;endendendif inCloseFlagcontinue;endtemp_g = current.g + abs(current.row - neighbor.row) + abs(current.col - neighbor.col);inOpenFlag = 0;for j =1:openlenif open(j).row == neighbor.row && open(j).col ==neighbor.colinOpenFlag = 1;break;endend if ~inOpenFlag && map(neighbor.row,neighbor.col) ~= 1openlen = openlen + 1;open(openlen).row = neighbor.row;open(openlen).col = neighbor.col;open(openlen).g = abs(start_px - neighbor.row) + abs(start_py - neighbor.col);open(openlen).h = abs(end_px - neighbor.row) + abs(end_py - neighbor.col); elseif temp_g >= neighbor.gcontinue;endbackNum = backNum +1;prev(backNum,:) = [current.row ,current.col,neighbor.row ,neighbor.col];neighbor.g = temp_g; elsecontinue;endend end? ?結果為
參考與引用http://www.gamedev.net/reference/articles/article2003.asp
? ? ? ? ? ? ? ? ?https://b23.tv/I3GLzp
? ? ? ? ? ? ? ? ?https://blog.csdn.net/lmq_zzz/article/details/88999480
總結
以上是生活随笔為你收集整理的什么是A*(Astar)算法?(简单叙述)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常见几种编码模式
- 下一篇: MATLAB 图像处理之图片区域显示