function D=G2D(G) %邻接矩阵就是每个栅格之间的距离
[m,n]=size(G); %返回矩阵G的尺寸 并将行返回到m中,列返回到n中
N=m*n; %元素个数
D=zeros(N,N); %生成一个n*n的0矩阵
for Dx=1:N
for Dy=Dx:N
x1=ceil(Dx/n);%返回不小于x的最小整数值
y1=mod(Dx,n); %Dx对n取余
if y1==0
y1=n;
end
x2=ceil(Dy/n);
y2=mod(Dy,n);
if y2==0
y2=n;
end
if Dx==Dy
D(Dx,Dy)=inf;
elseif (G(x1,y1)==1) || (G(x2,y2)==1);
D(Dx,Dy)=inf;
else
if (mod(Dx,n) ==1)
if(Dx==1)
if (Dy-Dx==1) || (Dy-Dx==n)
D(Dx,Dy)=1;
elseif (Dy-Dx==n+1)
D(Dx,Dy)=sqrt(2);
else
D(Dx,Dy)=inf;
end
elseif(Dx==N-n+1)
if (Dy-Dx==1) || (Dx-Dy==n)
D(Dx,Dy)=1;
elseif (Dx-Dy==n-1)
D(Dx,Dy)=sqrt(2);
else
D(Dx,Dy)=inf;
end
else
if (Dy-Dx==1) || (Dy-Dx==n) || (Dx-Dy==n)
D(Dx,Dy)=1;
elseif (Dx-Dy==n-1) || (Dy-Dx==n+1)
D(Dx,Dy)=sqrt(2);
else
D(Dx,Dy)=inf;
end
end
elseif mod(Dx,n) ==0
if(Dx==n)
if (Dx-Dy==1) || (Dy-Dx==n)
D(Dx,Dy)=1;
elseif (Dy-Dx==n-1)
D(Dx,Dy)=sqrt(2);
else
D(Dx,Dy)=inf;
end
elseif(Dx==N)
if (Dx-Dy==1) || (Dy-Dx==n)
D(Dx,Dy)=1;
elseif (Dy-Dx==n+1)
D(Dx,Dy)=sqrt(2);
else
D(Dx,Dy)=inf;
end
else
if (Dx-Dy==1) || (Dy-Dx==n) || (Dx-Dy==n)
D(Dx,Dy)=1;
elseif (Dy-Dx==n-1) || (Dx-Dy==n+1)
D(Dx,Dy)=sqrt(2);
else
D(Dx,Dy)=inf;
end
end
else
if (Dx-Dy==1) || (Dy-Dx==1) || (Dy-Dx==n) || (Dx-Dy==n)
D(Dx,Dy)=1;
elseif (Dx-Dy==n+1) || (Dy-Dx==n+1) || (Dy-Dx==n-1) || (Dx-Dy==n-1)
D(Dx,Dy)=sqrt(2);
else
D(Dx,Dy)=inf;
end
end
end
end
end
for i=1:N
for j=i:N
if(i~=j)
D(j,i)=D(i,j);
end
end
end
传入0/1矩阵形式的栅格地图(如下图中的[1 0 0;0 0 0;0 0 0]矩阵<右图,黑色为障碍物1>),将其转换为如下图所示的邻接矩阵,1表示障碍物,不可达;0表示没有被占据,可以通过。则1号与所有元素都不可达为inf,并且将自身与自身也设为不可达:
其在蚁群算法路径规划中的应用可参考https://blog.csdn.net/KantsWang/article/details/83753515
代码均为他人代码,只作学习参考之用。