蚁群算法求函数最大值二

状态转移和约束边界函数

函数说明如下:

function sants = 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, :);

一些其他函数

初始化蚁群函数:

function ants = 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);

计算目标函数值函数:

function objval = 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);

绘制函数图像函数:

function plotobjfun(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);

“蚁群算法求函数最大值二”的一个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注