蚁群算法求函数最大值

这里使用蚁群算法求函数的最大值,函数是:

f = -(x.^4 + 3*y.^4 - 0.2*cos(3*pi*x) - 0.4*cos(4*pi*y) + 0.6);

步骤如下:

  1. 初始化参数。
  2. 初始化蚁群,第一代蚁群随机分布在可行域中。
  3. 初始化信息素,第一代信息素采用第一代蚁群的函数值表示,函数值越大,信息素越多。
  4. 状态转移,计算状态转移概率,根据状态转移概率进行局部搜索或全局搜索。
  5. 约束边界。
  6. 选择,根据目标函数值在原始蚁群和状态转移之后的蚁群之间进行选择。
  7. 更新信息素,tau = (1 - Rou) .* tau + calObjFun(ants)。
  8. 对选择后的蚁群重复进行状态转移、约束边界和更新信息素3步,直至结束。

主函数及结果

下面是主函数:

clear;
clc;

Ant     =   300;    % 蚂蚁数量
Times   =   80;     % 蚂蚁移动次数
Rho     =   0.9;    % 信息素挥发系数
P0      =   0.2;    % 转移概率常数
xl = -1; xu = 1;    % 设置搜索范围
yl = -1; yu = 1;
step = 0.05;

ants = initant(Ant, xl, xu, yl, yu);    % 初始化蚁群
tau = calObjFun(ants);                  % 计算初代信息素
firstants = ants;

for t = 1:Times
    ants = edgeselection(ants, P0, tau, 1/t, xl, xu, yl, yu);    % 转移+约束
    tau = (1 - Rho) .* tau + calObjFun(ants);               % 更新信息素
end

figure(1);
plotobjfun(xl, xu, yl, yu, step);
hold on;
plot3(firstants(:,1), firstants(:,2), calObjFun(firstants), 'b*');
hold on;
plot3(ants(:,1), ants(:,2), calObjFun(ants), 'r*');
hold off;

程序运行结果绘图如下,其中蓝色点为第一代蚁群,红色为最后一代蚁群:

蚁群算法求函数最大值结果

状态转移和约束边界函数

函数说明如下:

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);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容