这个是我自己编写的连续蚁群算法求解问题的代码 在变量的个数2个以内的话,能够找到较好的最优解。但是在变量个数增加的情况下,却不能够很快找到最优解 反而陷入了局部最优。我才用了全局信息素更新以及局部信息素更新的规则 对其做了一下改变。并设置了一个上限count 当最优解10次均相同时,我变跳出局部 采用新产生一个变量组 从而跳出循环 ,显然是有效果的 ,但是效果不是很明显。下一步我会继续对我的代码和算法进行深入的了解 并作出代码修改,希望能有所提高!!!!!!!!下面附上该代码
clc
clear all;
% global N
%----------------------- initialization of variable-----------------------%
N = 100;%等分区间的数量
N_ants=50;%蚂蚁的数目
N_vars = 3;%变量数量
Times=20;%迭代的次数
Q = 10000;%信息量强度
Rou=0.5;%信息量残留因子
det = 10;%最优解为中心 上下浮动的程度范围一般为[1,6]
for i = 1:N_vars
Lower(i) = -5.12;
Upper(i) = 5.12;
end
for j = 1:N_vars
h(j) = (Upper(j)-Lower(j))/N;%划分后区间的大小
end%j
x_best = Upper;
fx_best = F1(x_best);%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
x(1,N_vars) = 0;
P(N,N_vars) = 0;
tao_sum(N_vars) = 0;
tao(1:N,1:N_vars) =1/N;
count=1;%计数
%-------------------------------------------------------------------------%
%% 算法开始
for iter=1:Times %迭代次数
P(N,N_vars) = 0;
tao_sum(N_vars) = 0;
tao(1:N,1:N_vars) =1/N;
for i = 1:N_ants%遍历每只蚂蚁
%% 将变量区间进行划分网格
pos = ceil(N*rand(1,N_vars));%随机放置蚂蚁
for j = 1:N_vars
h(j) = (Upper(j)-Lower(j))/N;%划分后区间的大小
x(j) = Lower(j)+(pos(j)-1)*h(j);%计算蚂蚁当前位置(区间)的 左区间的值
end%j
f_value = F1(x);%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if f_value < fx_best
%% 更新节点信息素局部更新
for j= 1:N_vars
tao(pos(j),j) = (1-Rou)*tao(pos(j),j)+Rou*Q/f_value;
end %j
% 计算信息量总和
for j = 1:N_vars
tao_sum(j) = sum(tao(:,j));
end%j
%% 更新概率
for j = 1:N
for k = 1:N_vars
P(j,k) = tao(j,k) /tao_sum(k);
end%k
end %j
end%if
end%i
%% 通过概率的大小选择最优的变量和最优的函数值
for j = 1:N_vars
P_vars = P(:,j);%第j个变量的所有区间概率
[Px_best,ind] = sort(P_vars);%当前变量各个区间概率从小到大排序 ind 是对应概率的节点序号
max_ind (j) = ind(N);%概率最大的节点序号=ind最后一个数
x_local(j) = Lower(j)+(Upper(j)-Lower(j))*(max_ind(j)-1)/N;%计算最大概率变量的值
end %j
%信息素全局更新
for j= 1:N_vars
tao(max_ind(j),j) = (1-Rou)*tao(max_ind(j),j)+Rou*Q/f_value ;
end %j
fx_local(iter) = F1(x_local);
if fx_best>fx_local
fx_best = fx_local;
end
lower(iter,:)=Lower;
if iter>1
if lower(iter,:)==lower(iter-1,:)
count =count+1;
end
end
count;
if count==5
count=0;
max_ind = ceil(N*rand(1,N_vars));%随机放置蚂蚁
end
%% 缩小变量范围 优化变量范围
for j = 1:N_vars
Lower_new(j) = Lower(j)+(max_ind(j)-det)*((Upper(j)-Lower(j))/N);
Upper_new(j) = Lower(j)+(max_ind(j)+det)*((Upper(j)-Lower(j))/N);
% 越界处理
if Lower_new(j)<Lower(j)
Lower_new(j)=Lower(j);
end
if Upper_new(j) > Upper(j)
Upper_new(j) = Upper(j);
end
Lower(j) = Lower_new(j);
Upper(j) = Upper_new(j);
end %j
Lower
Upper
end %i
fx_local
fx_best
figure (2) %函数值的变化趋势
plot ([1:Times],fx_local,'b-')
function y = F1(x)
% This is function
% x is a vector
% d=length(x);
% z = 0;
% for k = 1:d
% z = z + x(k).^2;
% end
y= sum(x.^2);