[プロジェクト] matlab GUID検索アルゴリズムに基づく最短経路の解決[Matlabソースコード634期間を含む]

1.はじめに

「D *アルゴリズム」という名前は、「部分的に既知の環境のための最適で効率的な経路計画」でAnthonyStentzによって最初に導入されたDynamicAStarに由来しています。これはヒューリスティックなパス検索アルゴリズムであり、周囲の環境が不明なシーンや周囲の環境が動的に変化するシーンに適しています。

1アルゴリズムの紹介アルゴリズムA
と同様に、D-starは、優先度キュー(OpenList)を維持することにより、シーン内のパスノードを検索します。違いは、Dが開始点から検索を開始するのではなく、ターゲットポイントから検索を開始することです。最初に、ロボットの現在の位置にあるノードがキューからデキューされるまで、ターゲットポイントをオープンリストに配置することによって検索が開始されます(もちろん、途中のノードの状態に動的な変化がある場合は、再度検出する必要があるため、動的パスファインディングアルゴリズムです)。

2.1記号の表現
このセクションでは、主に、論文で使用されているいくつかの記号とその意味を紹介します。
このペーパーでは、マップ内のパスポイントは州によって表され、各州には次の情報が含まれています。

バックポインター:前の状態へのポインター。ポイントされた状態は現在の状態の親です。現在の状態は、状態へのポインターの子孫と呼ばれます。ターゲットの状態にはバックポインターがありません。(パス検索が完了した後、ロボットが配置されている状態を介してバックポインターを介して段階的にターゲットの目標状態に移動できます。目標状態は将来Gで示されます)、b(X)= Yは意味しますXの親がYであること。

タグ:状態の現在の状態を示します。状態には、新規、オープン、およびクローズの3つがあります。新規は、状態がオープンリストに配置されたことがないことを示し、オープンは、状態がオープンリストにあることを示し、クローズは、状態がオープンリストにあることを示します。はオープンリストに含まれなくなりました。

H(X):コスト関数の見積もり。現在の状態からGまでのコスト見積もりを表します。

K(X):キー機能、この値は優先キューOpenlistでの並べ替えの基礎です。K値が最小の状態がキューの先頭にあります。OpenListの状態Xの場合、K(X)はXはオープンリストに配置されます。XGに対する最小コストH(X)は、次のように簡単に理解できます。K(X)は、オープンリストの状態Xを2つの異なる状態に分割します.1つの状態はRaise(K(X)<H(X)の場合)であり、パスコストの増加を伝えるために使用されます(たとえば、特定の2つの間)コストの増加により、関連ノードからターゲットへのパスコストがそれに応じて増加します);他の状態はLower(K(X)<H(X)の場合)であり、パスコスト(たとえば、2つのポイント間のコストの削減、または新しいノードがオープンリストに追加されると、それに応じてターゲットへの関連ノードのパスコストが削減される場合があります)。
kmin:オープンリスト上のすべての状態の最小K値を表します。
C(X、Y):XとYの間のパスコストを表します。
オープンリストは、K値に従って小さいものから大きいものへとソートされた優先キューです。

1.2アルゴリズムの説明
検索の鍵は、状態の転送プロセス、つまりGからロボットの位置への検索プロセスです。この転送プロセスは、現在のOpenListからK値が最小の状態を継続的に取り出すことによって実現されます。 、状態がオープンリストから削除されるたびに、コストが隣接する状態に渡されます。これらの隣接する状態はオープンリストに配置され、ロボットの状態が閉じられるか、オープンリストが空になるまでサイクルを継続します( Gのパスには存在しません)。

アルゴリズムの主なアルゴリズムは、Process-StateとModify-Costの2つの関数です。前者は、目標Gへの最適なパスを計算するために使用され、後者は、2つの状態間でコストC(X、Y)を変更するために使用されます。影響を受けます影響を受ける状態はオープンリストに配置されます。

アルゴリズムのメインフローでは、最初に、すべての状態のt(タグ)がNewに設定され、H(G)が0に設定され、GがOpenListに配置され、Process-State関数が次のようになるまで継続的に実行されます。ロボットは状態Xにあり、オープンリストから逸脱し、ロボットの現在の状態を介してバックポインターによってターゲットGを指すことができます。移動中に新たに検出された障害物が見つかると、Modify-Cost関数がすぐに呼び出され、パスコストがC(°)で修正され、影響を受けた状態がオープンリストにリセットされます。Yは、ロボットが障害物を見つけた状態を表します。kmin≥H(Y)になるまでProcess-Stateを継続的に呼び出すことにより、パスコストの変更がYに伝播したことを意味します。この時点で、新しいパスの構築が完了します。
ここに画像の説明を挿入
上の図で、L1-L3は、K値が最も低いXがオープンリストから削除されることを示しています。Xが低い場合、そのパスコストが最適です。

L8〜L13では、Xのすべての隣接状態がテストされ、パスコストを低くできるかどうかが確認されます。隣接状態のNewには初期パスコスト値が割り当てられ、コスト変更はXを指す各隣接状態Yに伝播されます。 (新しいコストが元のコストよりも大きいか小さいかに関係なく)つまり、Xをポイントしている限り、Xのパスコストが変化すると、それに応じてパスコストも変化する必要があります。Xのパスコストが大きすぎて、YがX以外の状態を介してターゲットに到達でき、パスコストが小さい場合があります。これは、L8-13では処理されませんが、後続のプロセスに配置されます。状態関数では、Yが処理されると、そのバックポインターは、パスコストが最小の状態を指します。Xの隣接する状態の状態がNewの場合、隣接する状態のバックポインターはXを指す必要があります。パスコストが変更されたすべての状態は、処理のためにオープンリストに配置されるため、変更は隣接する状態に伝播されます。
上記の説明では、XはLower状態であり、XはRaise状態です。

XがRaiseの場合、そのパスコストHは最適ではない可能性があります。L4-L7では、Xのパスコストは、すでに最適なコストになっている(つまり、h(Y)≤koldである隣接状態のノードによって最適化されます。 )より短いパスがある場合は、Xのバックポインターをその隣接ノードにポイントします。L15〜L18では、コストの変更は、状態がNewである隣接状態に伝播されます。XがXの隣接状態を指さないバックポインターのパスコストを最小化できる場合、つまり、Xを通るYとターゲットGの間の距離は短くなりますが、現時点ではYのバックポインターはXを指しません。 。この場合、Xをリセットできます。Yを最適化するためにオープンリストに入れます。L23-25では、Xが最も理想的ではない閉じた隣接状態Yを介してパスコストを削減できる場合、Yは再びオープンリストに配置されます。
ここに画像の説明を挿入
modify-costで、C(X、Y)を更新し、Xをオープンリストに戻します。Xがプロセス状態を介して伝播されると、Yのコストが計算されます(h(Y)= h(X)+ c(X))。 、Y)。

2アルゴリズムのまとめ
A-starアルゴリズムと比較して、D-starの主な機能は、目標位置から開始位置までのパスを検索することです。オブジェクトが開始位置から目標位置に移動すると、新しい障害物はパスで見つかりました。、ターゲットの場所から新しい障害物までの範囲のパスノードの場合、新しい障害物はターゲットへのパスに影響を与えません。新しい障害物は、オブジェクトの場所から障害物の間の範囲内のノードまでのパスにのみ影響します。このとき、新しい障害物の周囲のノードを処理のためにオープンリストに追加してから、オブジェクトの場所に伝播することで、計算のオーバーヘッドを最小限に抑えることができます。個人的には、パス検索のプロセスは実際にはダイクストラのアルゴリズムに似ていると感じています。Aスターアルゴリズムでは、f(n)= g(n)+ h(n)、h(n)はDスターに反映されません。パス検索A-starの方向性、つまりターゲットに向かって検索する感覚はありません。この種の検索は、開始位置が検索に含まれるまで、ターゲット位置から周囲へのより発散的な検索です。範囲、ダイクストラアルゴリズムに似ています。

第二に、ソースコード

function varargout = A_GUI(varargin)
% A_GUI MATLAB code for A_GUI.fig
%      A_GUI, by itself, creates a new A_GUI or raises the existing
%      singleton*.
%
%      H = A_GUI returns the handle to a new A_GUI or the handle to
%      the existing singleton*.
%
%      A_GUI('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in A_GUI.M with the given input arguments.
%
%      A_GUI('Property','Value',...) creates a new A_GUI or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before A_GUI_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to A_GUI_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help A_GUI

% Last Modified by GUIDE v2.5 21-Oct-2018 17:10:48

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @A_GUI_OpeningFcn, ...
                   'gui_OutputFcn',  @A_GUI_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{
    
    1})
    gui_State.gui_Callback = str2func(varargin{
    
    1});
end

if nargout
    [varargout{
    
    1:nargout}] = gui_mainfcn(gui_State, varargin{
    
    :});
else
    gui_mainfcn(gui_State, varargin{
    
    :});
end
% End initialization code - DO NOT EDIT


% --- Executes just before A_GUI is made visible.
function A_GUI_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to A_GUI (see VARARGIN)

% Choose default command line output for A_GUI
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes A_GUI wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = A_GUI_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{
    
    1} = handles.output;


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% set up color map for display 生成彩色地图 
global cmap;
global map;
global n_r;
global n_c;
global state;

cmap = [1 1 1; ...% 1 -白色-无障碍
        0 0 0; ...% 2 -黑色-有障碍
        0 0.8 0; ...% 3 -绿色-已搜索
        0 0.4 0; ...% 4 -粉色-正在搜索
        0 1 1; ...% 5 -浅蓝色-起始点
        1 1 0; ...% 6 -黄色-目标点
        0 0 1];   % 7 -蓝色-最终路径
colormap(cmap); 
%生成随机地图
map = zeros(n_r,n_c);
randmap = rand(n_r,n_c);
for i = 2:(sub2ind(size(randmap),n_r,n_c)-1)
    if (randmap(i) >= 0.75)
        map(i) = 2;
    end
end

map(1, 1) = 5; % start_coords 起点坐标
map(n_r, n_c) = 6; % dest_coords 终点坐标
image(1.5,1.5,map); 
grid on; 
axis image; 
set(handles.text5,'string','随机地图生成完毕');


% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

%搜索最佳路径
global n_r;
global n_c;
global cmap;
global map;
global state;

nrows = n_r; 
ncols = n_c; 
start_node = sub2ind(size(map), 1, 1); 
%sub2ind()函数将矩阵中的某个元素的线性序号计算出来
%线性索引号例子:2*2矩阵[1 3;中,1是第一个,5是第二个
%                       5 7]3是第三个,7是第四个
%(matlab是列优先,不是我们通常习惯的行优先)
dest_node = sub2ind(size(map), n_r, n_c); 
% Initialize distance array 初始化距离数组
distanceFromStart = Inf(nrows,ncols); 
distanceFromStart(start_node) = 0 ;
% For each grid cell this array holds the index of its parent 对于每个网格单元,该数组都保存其父单元的索引
parent = zeros(nrows,ncols); 
 % Main Loop 
while true 
  % Draw current map 
  map(start_node) = 5; 
  map(dest_node) = 6; 
  image(1.5, 1.5, map); 
  grid on; %网格
  axis image; %显示坐标
  drawnow; %刷新屏幕
  % Find the node with the minimum distance 找到距离最短的节点
  [min_dist, current] = min(distanceFromStart(:));
  if ((current == dest_node) || isinf(min_dist)) %TF = isinf(A)  返回一个和A尺寸一样的数组, 如果A中某个元素是inf  (无穷), 则对应TF中元素是1, 否则TF中对应元素是0break; 
  end; 
  %搜索中心的索引坐标:current,
  %搜索中心与起始点的路程:min_dist
  % 这两个值后面会用。
 
  map(current) = 3; 
  distanceFromStart(current) = Inf; 
  [i, j] = ind2sub(size(distanceFromStart), current); %索引号变为坐标
  neighbor = [i-1,j; 
              i+1,j; 
              i,j+1; 
              i,j-1]; 
    outRangetest = (neighbor(:,1)<1) + (neighbor(:,1)>nrows)+(neighbor(:,2)<1) + (neighbor(:,2)>ncols); 
    locate = find(outRangetest>0);  %返回outRangetest中大于0的元素的相对应的线性索引值。
    neighbor(locate,:)=[]; 
    neighborIndex = sub2ind(size(map),neighbor(:,1),neighbor(:,2));
for i=1:length(neighborIndex) 
 if (map(neighborIndex(i))~=2) && (map(neighborIndex(i))~=3 && map(neighborIndex(i))~= 5) 
     map(neighborIndex(i)) = 4; 
   if (distanceFromStart(neighborIndex(i))>= min_dist + 1 )     
       distanceFromStart(neighborIndex(i)) = min_dist+1;
         parent(neighborIndex(i)) = current;   
        % pause(0.02); 
   end 
  end 
 end 
 end

3、実行中の結果

ここに画像の説明を挿入

四、備考

QQ 1564658423を追加するために、コードを完成させるか、記述してください

おすすめ

転載: blog.csdn.net/TIQCmatlab/article/details/115254252