routon(resources)

时间:2023-04-22 浏览:33 分类:网络
根据蚁群算法的机器人途径规划matlab程序代码完成

阐明: 根据蚁群算法的机器人途径规划。运用网格离散化的办法对带有障碍物的环境建模routon,运用邻接矩阵存储该环境,使得问题转化为蚁群算法寻觅最短途径。

%% ---------------------------------------------------------------% 输入参数列表% G 地势图为01矩阵,假如为1表明障碍物% Tau 初始信息素矩阵% K 迭代次数% M 蚂蚁个数% S 起始点% E 中止点% Alpha 表征信息素重要程度的参数% Beta 表征启发式因子重要程度的参数% Rho 信息素蒸腾系数% Q 信息素添加强度系数%% 输出参数列表% ROUTES 每一代的每一只蚂蚁的匍匐道路% PL 每一代的每一只蚂蚁的匍匐道路长度% Tau 输出动态修正过的信息素%% --------------------变量初始化----------------------------------function m_main()ticG=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 1 1 0 0 0 1 1 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 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;0 1 1 1 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0;0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 1 1 1 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 1 1 1 0 1 1 1 1 0;0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0;0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0;0 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 1 1 0;0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 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 0 0 0 0 0 0 0 0 0;]; %使用矩阵来表明栅格MM=size(G1); % G 地势图为01矩阵,假如为1表明障碍物 回来矩阵G的行数(有几行)Tau=ones(MM*MMMM*MM);% Tau 初始信息素矩阵,在这里设置一切方位初始信息素都相同(400*400矩阵)Tau=8.*Tau;K=100; % K 迭代次数M=50; % M 蚂蚁个数S=1 ; % S 起始点E=MM*MM; % E 中止点Alpha=1; % Alpha 表征信息素重要程度的参数Beta=7; % Beta 表征启发式因子重要程度的参数Rho=0.3; % Rho 信息素蒸腾系数Q=1; % Q 信息素添加强度系数minkl=inf;mink=0;minl=0;D=G2D(G);N=size(D1);%N表明问题的规划a=1;%小方格象素的边长Ex=a*(mod(EMM)-0.5);%中止点横坐标mod求余函数if Ex==-0.5Ex=MM-0.5;endEy=a*(MM+0.5-ceil(E/MM));%中止点纵坐标cell回来大于或许等于指定表达式的最小整数Eta=zeros(N);%启发式信息,取为至目标点的直线间隔的倒数%下面结构启发式信息矩阵for i=1:Nix=a*(mod(iMM)-0.5);if ix==-0.5ix=MM-0.5;endiy=a*(MM+0.5-ceil(i/MM));if i~=E %不等于Eta(i)=1/((ix-Ex)^2+(iy-Ey)^2)^0.5;elseEta(i)=100;endendROUTES=cell(KM);%用细胞结构存储每一代的每一只蚂蚁的匍匐道路里边的元素可所以恣意类型的变量(特点变量,用户自己创立的变量),而不必是一致的类型PL=zeros(KM);%用矩阵存储每一代的每一只蚂蚁的匍匐道路长度%% -----------发动K轮蚂蚁寻食活动,每轮派出M只蚂蚁--------------------for k=1:Kfor m=1:M%% 第一步:状况初始化W=S;%当时节点初始化为起始点Path=S;%匍匐道路初始化PLkm=0;%匍匐道路长度初始化TABUkm=ones(N);%忌讳表初始化TABUkm(S)=0;%已经在初始点了,因而要扫除DD=D;%邻接矩阵初始化%% 第二步:下一步能够前往的节点DW=DD(W:);DW1=find(DW);for j=1:length(DW1)if TABUkm(DW1(j))==0DW(DW1(j))=0;endendLJD=find(DW);Len_LJD=length(LJD);%可选节点的个数%% 寻食中止条件:蚂蚁未遇到食物或许堕入死胡同while W~=E&&Len_LJD>=1%% 第三步:转轮赌法挑选下一步怎么走PP=zeros(Len_LJD);for i=1:Len_LJDPP(i)=(Tau(WLJD(i))^Alpha)*((Eta(LJD(i)))^Beta);endsumpp=sum(PP); %不太了解routon???PP=PP/sumpp;%树立概率散布Pcum(1)=PP(1);for i=2:Len_LJDPcum(i)=Pcum(i-1)+PP(i);endSelect=find(Pcum>=rand);to_visit=LJD(Select(1));%% 第四步:状况更新和记载Path=[Pathto_visit];%途径添加PLkm=PLkm+DD(Wto_visit);%途径长度添加W=to_visit;%蚂蚁移到下一个节点for kk=1:Nif TABUkm(kk)==0DD(Wkk)=0;DD(kkW)=0;endendTABUkm(W)=0;%已访问过的节点从忌讳表中删去DW=DD(W:);DW1=find(DW);for j=1:length(DW1)if TABUkm(DW1(j))==0DW(j)=0;endendLJD=find(DW);Len_LJD=length(LJD);%可选节点的个数end%% 第五步:记下每一代每一只蚂蚁的寻食道路和道路长度ROUTES{km}=Path;if Path(end)==EPL(km)=PLkm;if PLkm<minklmink=k;minl=m;minkl=PLkm;endelsePL(km)=0;endend%% 第六步:更新信息素Delta_Tau=zeros(NN);%更新量初始化for m=1:Mif PL(km)ROUT=ROUTES{km};TS=length(ROUT)-1;%跳数PL_km=PL(km);for s=1:TSx=ROUT(s);y=ROUT(s+1);Delta_Tau(xy)=Delta_Tau(xy)+Q/PL_km;Delta_Tau(yx)=Delta_Tau(yx)+Q/PL_km;endendendTau=(1-Rho).*Tau+Delta_Tau;%信息素蒸发一部分,新添加一部分end%% ---------------------------绘图--------------------------------plotif=1;%是否绘图的操控参数if plotif==1toc%绘收敛曲线minPL=zeros(K);for i=1:KPLK=PL(i:);Nonzero=find(PLK);PLKPLK=PLK(Nonzero);minPL(i)=min(PLKPLK);endfigure(1)plot(minPL);hold ongrid ontitle('收敛曲线');xlabel('迭代次数');ylabel('途径长度');%绘匍匐图figure(2)axis([0MM0MM])for i=1:MMfor j=1:MMif G(ij)==1x1=j-1;y1=MM-i;x2=j;y2=MM-i;x3=j;y3=MM-i+1;x4=j-1;y4=MM-i+1;fill([x1x2x3x4][y1y2y3y4][0.20.20.2]);hold onelsex1=j-1;y1=MM-i;x2=j;y2=MM-i;x3=j;y3=MM-i+1;x4=j-1;y4=MM-i+1;fill([x1x2x3x4][y1y2y3y4][111]);hold onendendendhold onROUT=ROUTES{minkminl};LENROUT=length(ROUT);Rx=ROUT;Ry=ROUT;for ii=1:LENROUTRx(ii)=a*(mod(ROUT(ii)MM)-0.5);if Rx(ii)==-0.5Rx(ii)=MM-0.5;endRy(ii)=a*(MM+0.5-ceil(ROUT(ii)/MM));endplot(RxRy)endplotif2=0;%绘各代蚂蚁匍匐图if plotif2==1figure(3)axis([0MM0MM])for i=1:MMfor j=1:MMif G(ij)==1x1=j-1;y1=MM-i;x2=j;y2=MM-i;x3=j;y3=MM-i+1;x4=j-1;y4=MM-i+1;fill([x1x2x3x4][y1y2y3y4][0.20.20.2]);hold onelsex1=j-1;y1=MM-i;x2=j;y2=MM-i;x3=j;y3=MM-i+1;x4=j-1;y4=MM-i+1;fill([x1x2x3x4][y1y2y3y4][111]);hold onendendendfor k=1:KPLK=PL(k:);minPLK=min(PLK);pos=find(PLK==minPLK);m=pos(1);ROUT=ROUTES{km};LENROUT=length(ROUT);Rx=ROUT;Ry=ROUT;for ii=1:LENROUTRx(ii)=a*(mod(ROUT(ii)MM)-0.5);if Rx(ii)==-0.5Rx(ii)=MM-0.5;endRy(ii)=a*(MM+0.5-ceil(ROUT(ii)/MM));endplot(RxRy)hold onendendtocfunction D=G2D(G)l=size(G1);D=zeros(l*ll*l);for i=1:lfor j=1:lif G(ij)==0for m=1:lfor n=1:lif G(mn)==0im=abs(i-m);jn=abs(j-n);if im+jn==1||(im==1&&jn==1)D((i-1)*l+j(m-1)*l+n)=(im+jn)^0.5;endendendendendendend

发表评论