📄 shiyan1.m
字号:
tic
%初始化
m=10;
nc=1;
Alpha=1;
Beta=1;
rho=0.7;
Q=1;
n=20;
c=18.6;
Delta_tau=0;
xf=2;
x0=-1;
nc_max=20;
M=zeros(1,m);
p=zeros(m,n); %产生一个概率矩阵
Tau=ones(1,n); %信息素矩阵
H=zeros(1,nc_max); %存放每次迭代搜索到的最大值
%%%-------------------------------------------------------------------
while (nc<=nc_max) %迭代次数的控制
%将m只蚂蚁随机放在n个城市
Tabu=[];
Randpos=[];
for i=1:(ceil(m/n))
Randpos=[Randpos,randperm(n)];
end
Tabu(:,1)=(Randpos(1,1:m))'; %产生1列m行矩阵,代表每只蚂蚁所在的初始区域
Eta=zeros(n,n); %产生初始期望值矩阵(产生一个函数)
%产生随机数矩阵
r0=rand(m,n);
%产生可能的初始位置矩阵
A0=zeros(m,n);
f0=zeros(m,n);
% 蚂蚁按概率函数选择下一个区域
for k=1:m
for j=1:n
A0(k,j)=x0+(xf-x0)/n*((j-1)+r0(k,j));
f0(k,j)=A0(k,j)+10*sin(5*A0(k,j))+7*cos(4*A0(k,j));
end
end
F=max(f0);
for i=1:n
for j=1:n
if(i==j)
Eta(i,j)=0;
else Eta(i,j)=F(j)-F(i);
end
end
end
%%--------------------------------------------------------------------
for k=1:m %蚂蚁循环
%计算概率转移公式
for j=1:n
I=Tabu(k,length(Tabu(k,:)));
if (Eta(I,j)<=0)
p(k,j)=0;
else p(k,j)=(Tau(j)^Alpha)*(Eta(I,j)^Beta);
end
end
J=zeros(1,n);
y=f0(k,I);
a=0;
%------------------------------------------
while (abs(y-c)>=0.01&a<=100)
I=Tabu(k,length(Tabu(k,:)));
for j=1:n
J(j)=p(k,j);
end
if (max(J)==0)
j=I;
elseif p(k,j)==max(J)
j;
end
u=j;
%产生随机数矩阵
r=rand(m,n);
A=zeros(m,n);
f=zeros(m,n);
for w=1:m %每只蚂蚁即将到达的位置
for j=1:n
A(w,j)=x0+(xf-x0)/n*(j-1+r(w,j));
f(w,j)=A(w,j)+10*sin(5*A(w,j))+7*cos(4*A(w,j));;
end
end
if f(k,u)>y;
y=f(k,u);
end
F=max(f);
Eta=zeros(n,n);
for i=1:n
for j=1:n
if ( i==j)
Eta(i,j)=0;
else Eta(i,j)=F(j)-F(i);
end
end
end
for w=1:m %计算蚂蚁向其它各个区域转移的概率
for j=1:n
if (Eta(u,j)<=0)
p(w,j)=0;
else p(w,j)=(Tau(j)^Alpha)*(Eta(u,j)^Beta);
end
end
end
Tabu(k,1)=u; %将第k只蚂蚁当前搜索到的位置放在Tabu表中
a=a+1;
end
%----------------------------------
M(1,k)=y;
L=f-f0;
%更新信息素
if (L(k,u)>0) %更新当前区域
Delta_Tau=Q*L(k,u);
else
Delta_Tau=0;
end
Tau(u)=rho*Tau(u)+Delta_Tau;
end
%%---------------------------------------------------------------------
%f0=f; %将当前蚂蚁所在的位置作为可能的初始位置
H(1,nc)=max(M);
nc=nc+1;
end
%%%----------------------------------------------------------------------
H
best_val=max(H)
shijian=toc;
%% 画图
%%------------
%% nc 迭代次数
%% H 每次的最优解
%%=========================================================================
subplot(1,2,1)
%绘制函数图象
x=0:pi/100:10;
y=x+10*sin(5*x)+7*cos(4*x);
plot(x,y)
title('迷恋网络学生问题图'); %加图形标题
subplot(1,2,2)
plot(H,'bp-')
title('波动图'); %加图形标题
xlabel('迭代次数'); %加X轴说明
ylabel('H的值'); %加Y轴说明
%axis([0,nc_max,3.8490,3.8504])
hold on
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -