├── README.md ├── improved.m ├── improved_main.m ├── modify.m ├── standard.m └── standard_main.m /README.md: -------------------------------------------------------------------------------- 1 | * 改进蚁群算法matlab源码 2 | * 该代码基于论文《多启发因素改进蚁群算法的路径规划》(计算机工程与应用)设计,算法核心详见该论文 3 | * 蚁群算法路径规划的整体研究详见硕士论文《多因素蚁群算法的移动机器人路径规划研究》(长沙理工大学) 4 | -------------------------------------------------------------------------------- /improved.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eric20123101/Improved-path-planning-for-ant-colony-algorithm/1618a3459151ec03290068553f7ceddc037ce8a0/improved.m -------------------------------------------------------------------------------- /improved_main.m: -------------------------------------------------------------------------------- 1 | %% Improved path planning for ant colony algorithm 2 | 3 | % author : Eric_lee 4 | 5 | % e-mail : 282228095@qq.com 6 | 7 | % date : 2019/4/22 8 | 9 | %% 构建栅格地图 10 | clear;clc 11 | G=rand(30)>0.8; % G 地形图为01矩阵,如果为1,表示障碍物 12 | save('D:\MATLAB\R2016b\work\AGV\map.mat','G');%将生成的随机地图以mat格式保存到本地,便于和标准算法在同一个地图下进行对比,这个路径可以改为自己电脑的路径 13 | %load map30.mat 14 | h=rot90(abs(peaks(30))); 15 | global MM 16 | global Dir 17 | global Lgrid 18 | %Lgrid = input('请输入栅格粒径:'); 19 | Lgrid = 1; 20 | MM=size(G,1); %MM为矩阵维数 21 | figure(1); 22 | for i=1:MM 23 | for j=1:MM 24 | x1=(j-1)*Lgrid;y1=(MM-i)*Lgrid; 25 | 26 | x2=j*Lgrid;y2=(MM-i)*Lgrid; 27 | x3=j*Lgrid;y3=(MM-i+1)*Lgrid; 28 | x4=(j-1)*Lgrid;y4=(MM-i+1)*Lgrid; 29 | f=(max(max(h))-h(i,j))/max(max(h)); 30 | if G(i,j)==1 31 | fill([x1,x2,x3,x4],[y1,y2,y3,y4],[0.2,0.2,0.2]); hold on %栅格为1,填充为黑色 32 | else 33 | fill([x1,x2,x3,x4],[y1,y2,y3,y4],[f,1,f]); hold on %栅格为0,填充为白色 34 | end 35 | end 36 | end 37 | axis([0,MM*Lgrid,0,MM*Lgrid]) 38 | grid on 39 | %% 初始化地图信息 40 | %{ 41 | Xinitial = input('请输入初始点的X坐标:'); 42 | Yinitial = input('请输入初始点的Y坐标:'); 43 | %} 44 | Xinitial = 0.6; 45 | Yinitial = 0.2; 46 | [initial,ij_initial]= modify(Xinitial,Yinitial); 47 | if max(ij_initial)>MM||G(ij_initial(1),ij_initial(2))==1 48 | error('初始点不能设在障碍物上或超出范围'); 49 | end 50 | %{ 51 | Xdestination = input('请输入目标点的X坐标:'); 52 | Ydestination = input('请输入目标点的Y坐标:'); 53 | %} 54 | Xdestination = 29.4; 55 | Ydestination = 29.3; 56 | [destination,ij_destination]= modify(Xdestination,Ydestination); 57 | if max(ij_destination)>MM||G(ij_destination(1),ij_destination(2))==1 58 | error('目标点不能设在障碍物上或超出范围'); 59 | end 60 | %% 计算距离启发矩阵dis 61 | dis = zeros(MM,MM); 62 | for i=1:MM 63 | for j=1:MM 64 | x = (j-0.5)*Lgrid; 65 | y = (MM-i+0.5)*Lgrid; 66 | dis(i,j) = sqrt(sum(([x y]-destination).^2)); 67 | end 68 | end 69 | %% 计算距离转移矩阵D 70 | D=zeros(MM^2,8); %行号表示栅格标号,列号表示邻接的8个方向的栅格号 71 | Dir = [-MM-1,-1,MM-1,MM,MM+1,1,1-MM,-MM]; 72 | for i = 1:MM^2 %8方向转移距离矩阵初步构建 73 | Dirn = Dir+i; 74 | if G(i)==1 75 | D(i,:)=inf; 76 | continue 77 | end 78 | for j = 1:8 79 | if Dirn(j)<=0||Dirn(j)>MM^2 %出界的情况,暂且为0 80 | continue 81 | end 82 | if G(Dirn(j))==1 83 | D(i,j) = inf; 84 | elseif mod(j,2)==0 %偶数方向为上下左右方向 85 | D(i,j) = 1; 86 | elseif j==1 %左上方向的情况,保证路线不会擦障碍物边沿走过 87 | if (G(Dirn(2))+G(Dirn(8))==0) 88 | D(i,j) = 1.4; 89 | else 90 | D(i,j) = inf; 91 | end 92 | elseif (Dirn(j-1)<=0||Dirn(j-1)>MM^2)||(Dirn(j+1)<=0||Dirn(j+1)>MM^2)%排除掉垂直方向的栅格出界的情况 93 | continue 94 | elseif G(Dirn(j-1))+G(Dirn(j+1))==0 %其余三个斜方向 95 | D(i,j) = 1.4; 96 | else 97 | D(i,j) = inf; 98 | end 99 | end 100 | 101 | end 102 | %% 创造边界 103 | num = 1:MM^2; 104 | obs_up = find(mod(num,MM)==1); 105 | obs_up = obs_up(2:end-1); 106 | D(obs_up,[1,2,3])=inf; 107 | obs_down = find(mod(num,MM)==0); 108 | obs_down = obs_down(2:end-1); 109 | D(obs_down,[5,6,7])=inf; 110 | D(2:MM-1,[1,7,8]) = inf; 111 | D(MM^2-MM+2:MM^2-1,[3,4,5])=inf; 112 | D(1,[1,2,3,7,8])=inf; 113 | D(MM,[1,5,6,7,8])=inf; 114 | D(MM^2-MM+1,[1,2,3,4,5])=inf; 115 | D(MM^2,[3,4,5,6,7])=inf; 116 | %% 参数初始化 117 | tic 118 | NC_max=30; m=50; Rho=0.3; Q=100; Omega=10; Mu=1; u=10; Tau_min=10; Tau_max=40; Rho_min=0.2; 119 | %% 绘制找到的最优路径 120 | [R_best,F_best,L_best,T_best,S_best,S_ave,Shortest_Route,Shortest_Length]=improved(D,initial,destination,dis,h,NC_max,m,Rho,Omega,Mu,Q,u,Tau_min,Tau_max,Rho_min); %函数调用 121 | %绘制找到的最优路径 122 | j = ceil(Shortest_Route/MM); 123 | i = mod(Shortest_Route,MM); 124 | i(i==0) = MM; 125 | x = (j-0.5)*Lgrid; 126 | y = (MM-i+0.5)*Lgrid; 127 | x = [initial(1) x destination(1)]; 128 | y = [initial(2) y destination(2)]; 129 | figure(1); 130 | plot(x,y,'-r'); 131 | xlabel('x'); ylabel('y'); title('最佳路径'); 132 | grid on 133 | hold on 134 | toc %计算运行时间 135 | %% 绘制收敛曲线 136 | figure(2); iter=1:length(L_best); 137 | plot(iter,L_best,'-r','LineWidth',1) 138 | xlabel('迭代次数'); ylabel('各代最佳路线的长度'); 139 | axis([0,NC_max,25,90]); 140 | grid on;hold on 141 | figure(3); iter=1:length(L_best); 142 | plot(iter,F_best*100,'-r','LineWidth',1) 143 | xlabel('迭代次数'); ylabel('各代最佳路线的高度均方差*100'); 144 | axis([0,NC_max,0,30]); 145 | grid on;hold on 146 | figure(4); iter=1:length(L_best); 147 | plot(iter,T_best,'-r','LineWidth',1) 148 | xlabel('迭代次数'); ylabel('各代最佳路线的转弯次数'); 149 | axis([0,NC_max,5,50]); 150 | grid on;hold on 151 | figure(5); iter=1:length(L_best); 152 | plot(iter,S_best,'r',iter,S_ave,'b'); 153 | xlabel('迭代次数');ylabel('各代最佳路线的综合指标及平均综合指标'); 154 | title('收敛性分析曲线') 155 | axis([0,NC_max,70,200]); 156 | grid on;hold on 157 | toc 158 | 159 | 160 | -------------------------------------------------------------------------------- /modify.m: -------------------------------------------------------------------------------- 1 | function [xy ij] = modify( x,y) 2 | global MM 3 | global Lgrid 4 | xy =[ fix(x/Lgrid)*Lgrid+Lgrid/2,fix(y/Lgrid)*Lgrid+Lgrid/2]; 5 | ij = [MM+0.5-xy(2)/Lgrid,xy(1)/Lgrid+0.5]; 6 | end 7 | 8 | -------------------------------------------------------------------------------- /standard.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eric20123101/Improved-path-planning-for-ant-colony-algorithm/1618a3459151ec03290068553f7ceddc037ce8a0/standard.m -------------------------------------------------------------------------------- /standard_main.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eric20123101/Improved-path-planning-for-ant-colony-algorithm/1618a3459151ec03290068553f7ceddc037ce8a0/standard_main.m --------------------------------------------------------------------------------