資源簡介
A*算法是從起始點開始向目標點搜索,而雙向A*是在A*的基礎上由起始點和目標點同時搜索,當一方檢測到另一方的已檢查節點時,搜索結束,在搜索時間效率上,雙向A*更快。

代碼片段和文件信息
function?bidirectional_ASTAR
clc;
clear;
%%?初始化界面
n?=?11;???%?field?size?n?x?n?tiles??20*20的界面
%wallpercent?=?0.3;??%?this?percent?of?field?is?walls???15%的界面作為阻礙物(墻)
cmap?=?[1?1?1;?...%??1?-?white?-?空地
????????0?0?0;?...%?2?-?black?-?障礙?
????????1?0?0;?...%?3?-?red?-?已搜索過的地方
????????0?0?1;?...%?4?-?blue?-?下次搜索備選中心?
????????0?1?0;?...%?5?-?green?-?起始點
????????1?1?0;...%?6?-?yellow?-??到目?標點的路徑?
???????1?0?1];%?7?-?-??目標點?
colormap(cmap);?
field?=?ones(n);
startposind?=10;???%sub2ind用來將行列坐標轉換為線性坐標,這里是必要的,因為如果把startposind設置成[xy]的形式,訪問field([xy])的時候
goalposind?=12;????%它并不是訪問x行y列元素,而是訪問線性坐標為x和y的兩個元素
%?field(ceil(n^2.*rand(floor(n*n*wallpercent)1)?))?=?Inf;
field(1:5?7)?=?2;
field(81:3)?=?2;?
field(2:53:5)=2;
???field(810)=2;
%?startposind?=?sub2ind([nn]ceil(n.*rand)ceil(n.*rand));???%sub2ind用來將行列坐標轉換為線性坐標,這里是必要的,因為如果把startposind設置成[xy]的形式,訪問field([xy])的時候
%goalposind?=?sub2ind([nn]ceil(n.*rand)ceil(n.*rand));????%它并不是訪問x行y列元素,而是訪問線性坐標為x和y的兩個元素
field(startposind?)=5;
field(goalposind?)=7;
costchart?=?NaN*ones(n);??????%costchart用來存儲各個點的實際代價,NaN代表不是數據(不明確的操作)
costchart(startposind)?=?0;?????%起點的實際代價
fieldpointers?=?zeros(n);
fieldpointers1?=?zeros(n);
????global?setOpenCosts;
????global?setOpenCosts1;
????global?setOpen;
????global?setOpen1;
????global?setOpenHeuristics;
????global?setOpenHeuristics1;
setOpen?=?(startposind);?setOpenCosts?=?(0);?setOpenHeuristics?=?(Inf);
setClosed?=?[];?setClosedCosts?=?[];%初始化起點的open表和close表
setOpen1?=?(goalposind);?setOpenCosts1?=?(0);?setOpenHeuristics1?=?(Inf);
setClosed1?=?[];?setClosedCosts1?=?[];%初始化目標點的open表和close表
[goalpos(1)?goalpos(2)]?=?ind2sub([n?n]goalposind);???????%獲得目標點的行列坐標
[startpos(1)?startpos(2)]?=?ind2sub([n?n]startposind);
uicontrol(‘style‘‘pushbutton‘‘String‘‘RE-DO‘?‘FontSize‘12?...
?????????‘Position‘?[10?10?60?40]?‘Callback‘‘bidirectional_ASTAR‘);
tic
while?true?%ismember(AB)返回與A同大小的矩陣,其中元素1表示A中相應位置的元素在B中也出現,0則是沒有出現
???field(startposind?)=5;
???field(goalposind?)=7;
???image(1.51.5field);?
????grid?on;?
????axis?image;?
????set(gca‘gridline‘‘-‘‘gridcolor‘‘r‘‘linewidth‘2);
????set(gca‘xtick‘1:1:12‘ytick‘1:1:12);
????drawnow;
??if(max(ismember(setOpensetOpen1)))
???????break;
???end;??
???
????[~?ii]?=?min(setOpenCosts?+?setOpenHeuristics);???%從OPEN表中選擇花費最低的點tempii是其下標(也就是標號索引)
????[~?ii1]?=?min(setOpenCosts1?+?setOpenHeuristics1);
????field(setOpen(ii))=3;
????field(setOpen1(ii1))=6;
????[currentpos(1)?currentpos(2)]?=?ind2sub([n?n]setOpen(ii));
????[currentpos1(1)?currentpos1(2)]?=?ind2sub([n?n]setOpen1(ii1));%獲得以起點擴展的當前點的行列坐標,注意currentpos(1)是行坐標,currentpos(2)是列坐標
????%%?獲得當前點的鄰居
????[posindsposinds1costcost1heuristicheuristic1]=get_neighbors(niiii1currentpos(1)currentpos(2)currentpos1(1)currentpos1(2)goalpos(1)goalpos(2)startpos(1)startpos(2));
????
?????setClosed?=?[setClosed;?setOpen(ii)];?????%將temp插入CLOSE表中
?????setClosedCosts?=?[setClosedCosts;?setOpenCost
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????14485??2019-04-30?15:44??bidirectional_ASTAR.m
評論
共有 條評論