函数说明如下:
functionsants = edgeselection(ants, tau, P0, lamda, xl, xu, yl, yu)
% 状态转移 + 约束边界
% ants input 蚁群
% tau input 信息素
% P0 input 转移概率常数
% lamda input 局部搜索参数
% xl input x最小值
% xu input x最大值
% yl input y最小值
% yu input y最大值
% sants output 输出蚁群
下面计算函数的状态转移概率,进行局部搜索和全局搜索:
sants= ants;
% 计算状态转移概率
[taubest,~] = max(tau);
p= abs((taubest - tau) / taubest);
lsindex= find(p < P0);
gsindex= find(p >= P0);
% 局部搜索
r= rand(length(lsindex), 2);
sants(lsindex,:) = sants(lsindex, :) + (2 .* r - 1) .* lamda;
% 全局搜索
r= rand(length(gsindex), 2);
gedge= repmat([xu-xl, yu-yl], length(gsindex), 1);
sants(gsindex,:)= sants(gsindex,:) + gedge .* (r - 0.5);
之后约束边界:
% 约束边界
sants(sants(:,1) < xl, 1) = xl;
sants(sants(:,1) > xu, 1) = xu;
sants(sants(:,2) < yl, 2) = yl;
sants(sants(:,2) > yu, 2) = yu;
最后进行选择:
% 选择
objvalue= calObjFun(ants);
sobjvalue= calObjFun(sants);
tindex= find(sobjvalue < objvalue);
sants(tindex,:) = ants(tindex, :);
初始化蚁群函数:
functionants = initant(num, xl, xu, yl, yu)
% 初始化蚁群
% num input 蚂蚁数量
% xl input x最小
% xu input x最大
% yl input y最小
% yu input y最大
% ants output 蚁群
ants= rand(num, 2);
ants(:,1)= xl + (xu - xl) .* ants(:,1);
ants(:,2)= yl + (yu - yl) .* ants(:,2);
计算目标函数值函数:
functionobjval = calObjFun(X)
% 计算目标函数值
% X input 点输入 [x, y] nx2
% objvalue output 输出nx1
objval= -(X(:,1) .^ 4 + 3 .* X(:,2) .^ 4 - 0.2 .* cos(3*pi .* X(:,1)) ...
- 0.4 .* cos(4*pi .* X(:,2)) + 0.6);
绘制函数图像函数:
functionplotobjfun(xl, xu, yl, yu, step)
% 绘制函数图像
% xl input x最小值
% xu input x最大值
% yl input y最小值
% yu input y最大值
% step input 采样距离
[x,y] = meshgrid(xl:step:xu, yl:step:yu);
f= '-(x.^4 + 3*y.^4 - 0.2*cos(3*pi*x) - 0.4*cos(4*pi*y) + 0.6)';
z= eval(f);
mesh(x,y, z);