基于matlab的蚁群算法理解
2017-05-02 08:00
274 查看
%TSP 的蚁群算法
%%z是2*n的矩阵即为城市的坐标的点
function Itsp=AOC(z)
%保留每次迭代的最优解
% 以max(t^a*b^(-b))为依据找最优路径,与保留的最优路径比较
x=z(:,1);
y=z(:,2);
n=30 ;%城市数目
c=100;
q=10^(+6);
NC=100;
r=0.9;%表示轨迹持久性
a=1.5;%表示轨迹相对重要性
b=2;%能见度相对重要行
m=50;%表示蚂蚁数量
for i=1:n
for j=1:n
dij(i,j)=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2);%计算i到j城市的距离
end
end
for i=1:n
dij(i,i)=0.01;%另本身城市到本身城市的距离是一个很小的值。
end
min10=10^5;
t=ones(n)*c;%产生n*n全c的矩阵;
for nc=1:NC
tabu=ones(m,n);%禁忌表,一行表示一蚂蚁,一列表示一个城市
tabu(:,1)=0; %把第一列赋值为0;一第一行为例说明就是,第一个蚂蚁目前所在的
%位置是tabu(0,0)它的下一个城市就不能是当前城市
path=ones(m,n);%path 记录了每一个蚂蚁没走一步的城市位置。
for k=1:m
for step=1:n-1
%信息素的更新过程。
ta=t.^a;
tb=dij.^(-b);
td=ta.*tb;
pd=tabu(k,:).*td(path(k,step),:);
pk=pd/sum(pd); %概率计算可能为0
rk=rand;%随机生成0-1的数,在没有信息的情况下蚂蚁选择的路线都是随机的。
spk=0;
j=1;
while j<=n
if rk<spk+pk(j)%满足条件跳出循环执行tabu(k,j)=0。表示蚂蚁已经进到下一个城市。
break;
else
spk=spk+pk(j);%因为对于一个蚂蚁来说,rk是固定的这式子能够保证if条件的执行,即能够跳到下一城市。
j=j+1;
end
end
tabu(k,j)=0;
path(k,step+1)=j;%表示第k个蚂蚁的下一个城市为j。
end
end
dt=zeros(n);%生成n*n全0矩阵;
for i=1:m
Itsp(i) =ca_tsp(n,path(i,:),dij);%计算第i个蚂蚁选择所有城市后的全部距离。
for k=1:n-1
dt(path(i,k),path(i,k+1))= dt(path(i,k),path(i,k+1))+q/Itsp(i);
dt(path(i,k+1),path(i,k))= dt(path(i,k),path(i,k+1));
end
dt(path(i,n),path(i,1))= dt(path(i,n),path(i,1));
dt(path(i,1),path(i,n))= dt(path(i,n),path(i,k+1));
end
[min1,i]=min(Itsp);%计算所有蚂蚁循环后的最短路.min1存的是最小值,i存的第几个蚂蚁。
if min1<min10
min10=min1;
c0=path(i,:);%c0记录的是一次所有蚂蚁循环后最优的路线。
end
t=r*t+dt;
end
%%
k=1;
while k<=n
x1(k)=x(c0(k));
y1(k)=y(c0(k));
k=k+1;
end
x1(n+1)=x1(1);
y1(n+1)=y1(1);
%绘制图形·
figure(1),
plot(x,y,'o--');
grid on
figure(2)
line(x1,y1,'color','r','linewidth',2);
hold on
plot(x,y,'o--');
hold on
[x1',y1']
min10 %最优解的路程距离
end
function Itsp=ca_tsp(n,c,dij)%dij相当于指针吧,把该dij(i,j)=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2)方法传进。
i=1;
Itsp=dij(c(n),c(1));%计算城市n到城市1的距离
while i<n
Itsp=Itsp+dij(c(i),c(i+1)); %距离叠加。
i=i+1;
end
end
%%z是2*n的矩阵即为城市的坐标的点
function Itsp=AOC(z)
%保留每次迭代的最优解
% 以max(t^a*b^(-b))为依据找最优路径,与保留的最优路径比较
x=z(:,1);
y=z(:,2);
n=30 ;%城市数目
c=100;
q=10^(+6);
NC=100;
r=0.9;%表示轨迹持久性
a=1.5;%表示轨迹相对重要性
b=2;%能见度相对重要行
m=50;%表示蚂蚁数量
for i=1:n
for j=1:n
dij(i,j)=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2);%计算i到j城市的距离
end
end
for i=1:n
dij(i,i)=0.01;%另本身城市到本身城市的距离是一个很小的值。
end
min10=10^5;
t=ones(n)*c;%产生n*n全c的矩阵;
for nc=1:NC
tabu=ones(m,n);%禁忌表,一行表示一蚂蚁,一列表示一个城市
tabu(:,1)=0; %把第一列赋值为0;一第一行为例说明就是,第一个蚂蚁目前所在的
%位置是tabu(0,0)它的下一个城市就不能是当前城市
path=ones(m,n);%path 记录了每一个蚂蚁没走一步的城市位置。
for k=1:m
for step=1:n-1
%信息素的更新过程。
ta=t.^a;
tb=dij.^(-b);
td=ta.*tb;
pd=tabu(k,:).*td(path(k,step),:);
pk=pd/sum(pd); %概率计算可能为0
rk=rand;%随机生成0-1的数,在没有信息的情况下蚂蚁选择的路线都是随机的。
spk=0;
j=1;
while j<=n
if rk<spk+pk(j)%满足条件跳出循环执行tabu(k,j)=0。表示蚂蚁已经进到下一个城市。
break;
else
spk=spk+pk(j);%因为对于一个蚂蚁来说,rk是固定的这式子能够保证if条件的执行,即能够跳到下一城市。
j=j+1;
end
end
tabu(k,j)=0;
path(k,step+1)=j;%表示第k个蚂蚁的下一个城市为j。
end
end
dt=zeros(n);%生成n*n全0矩阵;
for i=1:m
Itsp(i) =ca_tsp(n,path(i,:),dij);%计算第i个蚂蚁选择所有城市后的全部距离。
for k=1:n-1
dt(path(i,k),path(i,k+1))= dt(path(i,k),path(i,k+1))+q/Itsp(i);
dt(path(i,k+1),path(i,k))= dt(path(i,k),path(i,k+1));
end
dt(path(i,n),path(i,1))= dt(path(i,n),path(i,1));
dt(path(i,1),path(i,n))= dt(path(i,n),path(i,k+1));
end
[min1,i]=min(Itsp);%计算所有蚂蚁循环后的最短路.min1存的是最小值,i存的第几个蚂蚁。
if min1<min10
min10=min1;
c0=path(i,:);%c0记录的是一次所有蚂蚁循环后最优的路线。
end
t=r*t+dt;
end
%%
k=1;
while k<=n
x1(k)=x(c0(k));
y1(k)=y(c0(k));
k=k+1;
end
x1(n+1)=x1(1);
y1(n+1)=y1(1);
%绘制图形·
figure(1),
plot(x,y,'o--');
grid on
figure(2)
line(x1,y1,'color','r','linewidth',2);
hold on
plot(x,y,'o--');
hold on
[x1',y1']
min10 %最优解的路程距离
end
function Itsp=ca_tsp(n,c,dij)%dij相当于指针吧,把该dij(i,j)=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2)方法传进。
i=1;
Itsp=dij(c(n),c(1));%计算城市n到城市1的距离
while i<n
Itsp=Itsp+dij(c(i),c(i+1)); %距离叠加。
i=i+1;
end
end
相关文章推荐
- 基于matlab程序对PID控制算法的理解
- C++与matlab混合编程基于主成份分析算法的数值分析(二)
- 基于HSV色彩空间变换的阴影检测算法——MATLAB实现
- 我所认识的PCA算法的princomp函数与经历 (基于matlab)
- 我所认识的PCA算法的princomp函数与经历 (基于matlab)
- 基于MATLAB的djikstra算法实现
- 基于DCT变换的信息隐藏(数字水印)嵌入算法的设计(Matlab)
- C++,视觉交互,算法,vs2012,matlab2014a,opencv,Android,come on!20141010-理解c++
- PCA降维算法总结以及matlab实现PCA(个人的一点理解)
- 在不知道算法原理的情况下,如何阅读理解算法的matlab程序
- FPGA机器学习之蚁群算法 matlab程序
- 基于灰度投影的电子稳像算法研究 (matlab代码)毕业设计
- 基于肤色和眼睛定位的人脸检测算法——MATLAB实现【转】
- C++与matlab混合编程基于主成份分析算法的数值分析
- PCA降维算法总结以及matlab实现PCA(个人的一点理解)
- 基于肤色和眼睛定位的人脸检测算法——MATLAB实现
- 初学者:对于FOWGA算法的理解以及将其和蚁群算法相结合的预测
- 基于Matlab的MMSE的语音增强算法的研究
- NSGA-II算法理解及matlab代码详解(二)
- 基于粒子滤波的目标跟踪基本算法(Matlab)