日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

什么是A*(Astar)算法?(简单叙述)

發(fā)布時(shí)間:2023/12/14 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是A*(Astar)算法?(简单叙述) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

簡介

A*算法的原理與思想

A*算法處理與搜索

實(shí)例(引用見文末)


?

簡介

A*算法(啟發(fā)式搜索)的首要條件是在靜態(tài)路網(wǎng)中,相對(duì)于廣度優(yōu)先遍歷(BFS)求最短路徑的最有效算法(BFS缺點(diǎn)是效率低耗時(shí)久,而A*更高效)。

A*BFS
高效率耗時(shí)短低效率耗時(shí)久

A*算法,A*(A-Star)算法是一種靜態(tài)路網(wǎng)中求解最短路徑最有效的直接搜索方法,也是解決許多搜索問題的有效算法。算法中的距離估算值與實(shí)際值越接近,最終搜索速度越快。

寬度優(yōu)先搜索算法(又稱廣度優(yōu)先搜索,簡稱BFS)是最簡便的圖的搜索算法之一,這一算法也是很多重要的圖的算法的原型。

A*算法的原理與思想

運(yùn)用了一個(gè)很重要的式子:f(n)=g(n)+h(n)

起點(diǎn)至終點(diǎn)的x軸與y軸距離之和即為曼哈頓距離。

如圖黃色線與紅色線的長度即為曼哈頓距離的值。

A*算法結(jié)合了貪心算法(深度優(yōu)先)與Dijkatra算法(廣度優(yōu)先),優(yōu)先計(jì)算代價(jià)更低的方向。

A*算法處理與搜索

  • 將整個(gè)地圖網(wǎng)格化,可以理解為化為一個(gè)個(gè)像素點(diǎn),即柵格法,將每一個(gè)像素點(diǎn)作為一個(gè)節(jié)點(diǎn)。
  • 給每一個(gè)節(jié)點(diǎn)定義一個(gè)屬性:①可通過②不可通過。如圖中黑色格可通行,藍(lán)色格不可通行。
  • 定義一個(gè)列表集合openlist和closelist,給每一個(gè)節(jié)點(diǎn)都可有一個(gè)狀態(tài)openlist或closelist,分別屬于兩個(gè)集合。(屬性為不可通過的節(jié)點(diǎn)默認(rèn)為closelist狀態(tài),該節(jié)點(diǎn)就屬于closelist集合)
  • openlist為待考察節(jié)點(diǎn),closelist為已考察節(jié)點(diǎn)。先以初位置節(jié)點(diǎn)A為父節(jié)點(diǎn),其狀態(tài)為closelist,以其為中心的九宮格的其余八個(gè)節(jié)點(diǎn)為子節(jié)點(diǎn),都附加狀態(tài)openlist。
  • 定義橫縱移動(dòng)的代價(jià)為10,斜向移動(dòng)大家為14.每個(gè)方格左上角為f(n),左下角為g(n),右下角為h(n)
  • 選擇f(n)值最小的節(jié)點(diǎn)B。
  • 檢查B周圍的方格,首先考察g(n),其他?4?個(gè)相鄰的方格均在?open list?中,我們需要檢查經(jīng)由這個(gè)方格到達(dá)那里的路徑是否更好,使用g(n) 值來判定。
  • 讓我們看看B上面的方格。它現(xiàn)在的?g(n) 值為?14?。如果我們經(jīng)由當(dāng)前方格到達(dá)那里,?g(n)值將會(huì)為?20(其中?10?為到達(dá)當(dāng)前方格的?g(n) 值,此外還要加上從當(dāng)前方格縱向移動(dòng)到上面方格的?g(n) 值?10)?。顯然?20?比?14?大,因此這不是最優(yōu)的路徑。如果你看圖你就會(huì)明白。直接從起點(diǎn)沿對(duì)角線移動(dòng)到那個(gè)方格比先橫向移動(dòng)再縱向移動(dòng)要好。
  • 而如果有更小的g(n)值再考察h(n),按照曼哈頓距離計(jì)算估計(jì)代價(jià),再計(jì)算出f(n)=g(n)+h(n)的值。
  • 以B子節(jié)點(diǎn)為新的父節(jié)點(diǎn),其余子節(jié)點(diǎn)放入closelist,選擇周圍f(n)最小的節(jié)點(diǎn),發(fā)現(xiàn)上下兩格都是54,我們選擇下方的格子C。
  • 以此類推,分別計(jì)算出剩余openlist的節(jié)點(diǎn)的f(n)值,挑選最小的代價(jià)節(jié)點(diǎn)一刀closelist中。
  • 從openlist中選擇f(n)最小的節(jié)點(diǎn)放入closelist中并將它視作新的父節(jié)點(diǎn),按照以上步驟類推,不斷的重復(fù),一直到搜索到終點(diǎn)節(jié)點(diǎn),完成路徑搜索,結(jié)束算法。
  • ?要注意,例如以C為父節(jié)點(diǎn)后,C的右下方為墻的下方,而C不能通過對(duì)角線到墻的下方,故忽略墻的周圍格子的對(duì)角線通行。
  • 實(shí)例(引用見文末)

    如圖淺綠色點(diǎn)到草綠色點(diǎn)。

    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;%% 將起點(diǎn)添加到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; %% 四種運(yùn)動(dòng)格式 sport = [0,1;0,-1;-1,0;1,0]; backNum = 0; prev = []; while openlen > 0%% 獲取代價(jià)最小的值for i = 1:openlenf(i,:) = [i,open(i).g + open(i).h]; endf1 = sortrows(f,2);current = open(f1(1));choose = 0;chooseArr = [];%% 回溯將走過的點(diǎn)標(biāo)記出來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

    ? ?結(jié)果為

    參考與引用http://www.gamedev.net/reference/articles/article2003.asp

    ? ? ? ? ? ? ? ? ?https://b23.tv/I3GLzp

    ? ? ? ? ? ? ? ? ?https://blog.csdn.net/lmq_zzz/article/details/88999480

    總結(jié)

    以上是生活随笔為你收集整理的什么是A*(Astar)算法?(简单叙述)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。