数学建模常用的优化算法有蚁群算法。
首先学习资料:
- 网站:慕课数学建模在线课程
- 课件:链接:https://pan.baidu.com/s/1-bhmFZl7yM4-5JL__fzkLw 提取码:4s4m
课程第十二节讲的是智能算法,十来分钟就能大概了解蚁群算法主要思想,剩下的就靠自己的练习。
主要算法思想:
- 随机产生N个蚂蚁的初始群体,蚂蚁随机分布于函数可行域上(如果是函数,那就是定义域);
- 根据优化函数(自行建模确定)计算每个蚂蚁的初始信息素T0,信息素正比于函数值f(x, y);
- 根据蚂蚁的当前信息素T0(i)和全局最优信息素T0(best)求出蚂蚁的转移概率Prob;
- 根据转移概率更新每个蚂蚁的位置X,新位置限制在函数的可行域内;
- 蚂蚁移动到新位置之后,更新自己的信息素T0;
- 经过多次迭代,找到全局最大值。
注:本节例题也可使用遗传算法实现,见 遗传算法
1、计算下列函数的全局最大值。
思路:
- 1、变量:设定每个蚂蚁个体包含两个数据 x和y(本题X(i, 1) =x, X(i, 2) = y );
函数:目标函数作为初始信息素T0; - 2、假设蚂蚁种群100个,也就是X,size(X) = 100*2,X(i, j)∈(-1, 1);
- 3、初始化蚂蚁种群X,计算初始信息素T0;
- 4、根据转移概率更新蚂蚁位置X;
- 5、根据更新后的蚂蚁位置更新信息素T0;
- 6、迭代50次,求得全局最大值。
matlab程序如下:
main.m(主程序)
%主程序
%ant main program
%清屏
clear all;
close all;
clc;
tic;
%蚂蚁数量100
ant = 100;
%迭代次数50
iter = 50;
%数值范围
xmin = -1;
xmax = 1;
ymin = -1;
ymax = 1;
%绘制原图的步长
stride = 0.05;
%函数
f = 'cos(2*pi.*x).*cos(2*pi.*y).*exp(-((x.^2 + y.^2)/10))';
[x, y] = meshgrid(xmin:stride:xmax, ymin:stride:ymax);
vxp = x;
vyp = y;
vzp = eval(f);
%画出原始图像
figure(1);
mesh(vxp, vyp, vzp);
hold on;
%初始化蚂蚁位置以及计算初始信息素
[X, T0] = initant(ant, xmin, xmax, ymin, ymax);
%绘制蚂蚁的初始分布
plot3(X(:,1), X(:, 2), T0, 'r*');
hold on;
grid on;
title('ant init pos');
xlabel('x');
ylabel('y');
zlabel('f(x, y)');
%开始优化
%迭代50次
for i_iter = 1:iter
P0 = 0.2; %P0--全局转移选择因子
P = 0.8; %P--信息素蒸发系数
lamda = 1/i_iter;%步长(用于局部搜索和全局搜索)
%求最大信息素
[T_Best(i_iter), BestIndex] = max(T0);
%求全局转移概率
Prob = prob(ant, BestIndex, T0, i_iter);
%蚂蚁位置更新
X = update_ant_location(X, ant, P0, lamda, Prob, xmin, xmax, ymin, ymax, i_iter);
%信息素更新
T0 = Pheromone_update(X, ant, T0, P);
%找到本次更新后的最大值以及索引值(也就是x, y对应的那只蚂蚁)
[c, i] = max(T0);
maxpoint_iter = [X(i, 1), X(i, 2)];
max_local(i_iter) = cos(2*pi.*X(i, 1)).*cos(2*pi.*X(i, 2)).*exp(-((X(i, 1).^2 + X(i, 2).^2)/10));
%将每一代的全局最优解存到max_global矩阵中
if i_iter >=2
if max_local(i_iter) > max_global(i_iter - 1)
max_global(i_iter) = max_local(i_iter);
else
max_global(i_iter) = max_local(i_iter - 1);
end
else
max_global(i_iter) = max_local(i_iter);
end
end
%画出最终图像
figure(2);
mesh(vxp, vyp, vzp);
hold on;
x = X(:, 1);
y = X(:, 2);
plot3(x, y, eval(f), 'b*');
hold on;
grid on;
title('ant final pos ');
xlabel('x');
ylabel('y');
zlabel('f(x, y)');
%画出最优函数值的变化图像
figure(3);
plot(1:iter, max_global, 'b-');
hold on;
title('The optimal function change trend');
xlabel('iteration');
ylabel('Maxf(x, y)');
grid on;
%在迭代50次后的T0中找最大值作为全局最优解,显示在command窗口
[c_max, i_max] = max(T0);
Maxpoint = [X(i_max, 1), X(i_max, 2)]
maxvalue = cos(2*pi.*X(i_max, 1)).*cos(2*pi.*X(i_max, 2)).*exp(-((X(i_max, 1).^2 + X(i_max, 2).^2)/10))
runtime = toc
initant.m(初始化蚁群)
%%初始化蚂蚁位置和初始信息素大小
function [X T0] = initant(ant, xmin, xmax, ymin, ymax)
for i = 1:ant
X(i, 1) = (xmin + (xmax - xmin)*rand(1));
X(i, 2) = (ymin + (ymax - ymin)*rand(1));
%T0--信息素,函数值越大,信息素浓度越大 此处将函数值作为信息素
T0(i) = cos(2*pi.*X(i, 1)).*cos(2*pi.*X(i, 2)).*exp(-((X(i, 1).^2 + X(i, 2).^2)/10));
end
prob.m(计算全局转移概率)
%计算全局转移概率
function Prob = prob(ant, BestIndex, T0, i_iter)
%求每个蚂蚁的全局转移概率
for j_g = 1:ant
r = T0(BestIndex) - T0(j_g);
Prob(i_iter, j_g) = r/T0(BestIndex);
end
update_ant_location.m(更新蚂蚁位置)
%更新蚂蚁位置
function X = update_ant_location(X, ant, P0, lamda, Prob, xmin, xmax, ymin, ymax, i_iter)
%<P0 进行局部搜索,>P0进行全局搜索
for j_g_tr = 1:ant
if Prob(i_iter, j_g_tr) < P0
temp1 = X(j_g_tr, 1) + (2*rand(1) - 1)*lamda;
temp2 = X(j_g_tr, 2) + (2*rand(1) - 1)*lamda;
else
temp1 = X(j_g_tr, 1) + (xmax - xmin)*(rand(1) - 0.5);
temp2 = X(j_g_tr, 2) + (ymax - ymin)*(rand(1) - 0.5);
end
%x搜索范围不能超过边界
if temp1 < xmin
temp1 = xmin;
end
if temp1 > xmax
temp1 = xmax;
end
%y搜索范围不能超过边界
if temp2 < ymin
temp2 = ymin;
end
if temp2 > ymax
temp2 = ymax;
end
%如果更新位置函数值大于原来位置的函数值,那么更新
if cos(2*pi.*temp1).*cos(2*pi.*temp2).*exp(-((temp1.^2 + temp2.^2)/10)) > cos(2*pi.*X(j_g_tr, 1)).*cos(2*pi.*X(j_g_tr, 2)).*exp(-((X(j_g_tr, 1).^2 + X(j_g_tr, 2).^2)/10))
X(j_g_tr, 1) = temp1;
X(j_g_tr, 2) = temp2;
end
end
Pheromone_update.m(更新信息素)
%信息素更新
function T0 = Pheromone_update(X, ant, T0, P)
%信息素更新
for t_t = 1:ant
T0(t_t) = (1 - P)*T0(t_t) + cos(2*pi.*X(t_t, 1)).*cos(2*pi.*X(t_t, 2)).*exp(-((X(t_t, 1).^2 + X(t_t, 2).^2)/10));
end
实验结果:
初始分布图
迭代50次后的分布
最优值的变化趋势(随着迭代次数的增加而增大)
Maxpoint =
0.0002 -0.0015
maxvalue =
1.0000
runtime =
1.6900
对照试验:
lingo计算最大值:
程序:
model:
max = @cos(2*pi*x)*@cos(2*pi*y)*@exp(-((x^2 + y^2)/10));
x >= -1;
x <= 1;
y >= -1;
y <= 1;
end
结果:
Local optimal solution found.
Objective value: 1.000000
Infeasibilities: 0.000000
Extended solver steps: 5
Total solver iterations: 58
Model Class: NLP
Total variables: 3
Nonlinear variables: 3
Integer variables: 0
Total constraints: 5
Nonlinear constraints: 1
Total nonzeros: 7
Nonlinear nonzeros: 3
Variable Value Reduced Cost
PI 10.42753 0.000000
X 0.000000 0.000000
Y 0.000000 0.000000
Row Slack or Surplus Dual Price
1 1.000000 1.000000
2 1.000000 0.000000
3 1.000000 0.000000
4 1.000000 0.000000
5 1.000000 0.000000
这道题目来看,两种方式都可以找到全局最大值。
2、计算香蕉函数的全局最大值。
题目:求函数
在
和
范围内的全局最大值。
思路:
- 变量:设定每个蚂蚁个体包含两个数据 x和y(本题X(i, 1) =x, X(i, 2) = y );
函数:目标函数作为初始信息素T0; - 2、假设蚂蚁种群100个,也就是X,size(X) = 100*2,X(i, j)∈(-2.048, 2.048);
- 3、初始化蚂蚁种群X,计算初始信息素T0;
- 4、根据转移概率更新蚂蚁位置X;
- 5、根据更新后的蚂蚁位置更新信息素T0;
- 6、迭代100次,求得全局最大值。
matlab程序:
main.m
%主程序
%ant main program
%清屏
clear all;
close all;
clc;
tic;
%蚂蚁数量100
ant = 100;
%迭代次数100
iter = 100;
%数值范围
xmin = -2.048;
xmax = 2.048;
ymin = -2.048;
ymax = 2.048;
%绘制原图的步长
stride = 0.05;
%函数
f = '(1 - x).^2 + 100*(y - x.^2).^2';
[x, y] = meshgrid(xmin:stride:xmax, ymin:stride:ymax);
vxp = x;
vyp = y;
vzp = eval(f);
%画出原始图像
figure(1);
mesh(vxp, vyp, vzp);
hold on;
%初始化蚂蚁位置以及计算初始信息素
[X, T0] = initant(ant, xmin, xmax, ymin, ymax);
%绘制蚂蚁的初始分布
plot3(X(:,1), X(:, 2), T0, 'r*');
hold on;
grid on;
title('ant init pos');
xlabel('x');
ylabel('y');
zlabel('f(x, y)');
%开始优化
%迭代50次
for i_iter = 1:iter
P0 = 0.2; %P0--全局转移选择因子
P = 0.8; %P--信息素蒸发系数
lamda = 1/i_iter;%步长(用于局部搜索和全局搜索)
%求最大信息素
[T_Best(i_iter), BestIndex] = max(T0);
%求全局转移概率
Prob = prob(ant, BestIndex, T0, i_iter);
%蚂蚁位置更新
X = update_ant_location(X, ant, P0, lamda, Prob, xmin, xmax, ymin, ymax, i_iter);
%信息素更新
T0 = pheromone_update(X, ant, T0, P);
%找到本次更新后的最大值以及索引值(也就是x, y对应的那只蚂蚁)
[c, i] = max(T0);
maxpoint_iter = [X(i, 1), X(i, 2)];
max_local(i_iter) = (1 - X(i, 1)).^2 + 100*(X(i, 2) - X(i, 1).^2).^2;
%将每一代的全局最优解存到max_global矩阵中
if i_iter >=2
if max_local(i_iter) > max_global(i_iter - 1)
max_global(i_iter) = max_local(i_iter);
else
max_global(i_iter) = max_local(i_iter - 1);
end
else
max_global(i_iter) = max_local(i_iter);
end
%max_global(i_iter) = max_local(i_iter);
end
%画出最终图像
figure(2);
mesh(vxp, vyp, vzp);
hold on;
x = X(:, 1);
y = X(:, 2);
plot3(x, y, eval(f), 'b*');
hold on;
grid on;
title('ant final pos ');
xlabel('x');
ylabel('y');
zlabel('f(x, y)');
%画出最优函数值的变化图像
figure(3);
plot(1:iter, max_global, 'b-');
hold on;
title('The optimal function change trend');
xlabel('iteration');
ylabel('Maxf(x, y)');
grid on;
%在迭代50次后的T0中找最大值作为全局最优解,显示在command窗口
[c_max, i_max] = max(T0);
Maxpoint = [X(i_max, 1), X(i_max, 2)]
maxvalue = (1 - X(i_max, 1)).^2 + 100*(X(i_max, 2) - X(i_max, 1).^2).^2
runtime = toc
initant.m
%%初始化蚂蚁位置和初始信息素大小
function [X T0] = initant(ant, xmin, xmax, ymin, ymax)
for i = 1:ant
X(i, 1) = (xmin + (xmax - xmin)*rand(1));
X(i, 2) = (ymin + (ymax - ymin)*rand(1));
%T0--信息素,函数值越大,信息素浓度越大 此处将函数值作为信息素
T0(i) = (1 - X(i, 1)).^2 + 100*(X(i, 2) - X(i, 1).^2).^2;
end
prob.m
%计算全局转移概率
function Prob = prob(ant, BestIndex, T0, i_iter)
%求每个蚂蚁的全局转移概率
for j_g = 1:ant
r = T0(BestIndex) - T0(j_g);
Prob(i_iter, j_g) = r/T0(BestIndex);
end
update_ant_location.m
%更新蚂蚁位置
function X = update_ant_location(X, ant, P0, lamda, Prob, xmin, xmax, ymin, ymax, i_iter)
%<P0 进行局部搜索,>P0进行全局搜索
for j_g_tr = 1:ant
if Prob(i_iter, j_g_tr) < P0
temp1 = X(j_g_tr, 1) + (2*rand(1) - 1)*lamda;
temp2 = X(j_g_tr, 2) + (2*rand(1) - 1)*lamda;
else
temp1 = X(j_g_tr, 1) + (xmax - xmin)*(rand(1) - 0.5);
temp2 = X(j_g_tr, 2) + (ymax - ymin)*(rand(1) - 0.5);
end
%x搜索范围不能超过边界
if temp1 < xmin
temp1 = xmin;
end
if temp1 > xmax
temp1 = xmax;
end
%y搜索范围不能超过边界
if temp2 < ymin
temp2 = ymin;
end
if temp2 > ymax
temp2 = ymax;
end
%如果更新位置函数值大于原来位置的函数值,那么更新
if (1 - temp1).^2 + 100*(temp2 - temp1.^2).^2 > (1 - X(j_g_tr, 1)).^2 + 100*(X(j_g_tr, 2) - X(j_g_tr, 1).^2).^2
X(j_g_tr, 1) = temp1;
X(j_g_tr, 2) = temp2;
end
end
pheromone_update.m
%信息素更新
function T0 = pheromone_update(X, ant, T0, P)
%信息素更新
for t_t = 1:ant
T0(t_t) = (1 - P)*T0(t_t) + (1 - X(t_t, 1)).^2 + 100*(X(t_t, 2) - X(t_t, 1).^2).^2;
end
实验结果:
初始蚂蚁位置分布
迭代100次后蚂蚁位置分布
T0随迭代次数的变化
Maxpoint =
-2.0480 -2.0480
maxvalue =
3.9059e+03
runtime =
0.5669
3、求下列二元函数的最大值。
题目:f(x, y) = x2 + y2,求f(x, y)在x∈{1,2,3,4,5,6,7},y∈{1,2,3,4,5,6,7}内的最大值.
这个题是整数问题,解决的大体框架是一样的,仅仅需要对蚂蚁的可行域改成整数,解决方法:round四舍五入成为整数或者取整即命令可。
思路:
- 变量:设定每个蚂蚁个体包含两个数据 x和y(本题X(i, 1) =x, X(i, 2) = y );
函数:目标函数作为初始信息素T0; - 2、假设蚂蚁种群100个,也就是X,size(X) = 100*2,X(i, j)∈(-2.048, 2.048);
初始化蚂蚁位置(加一个四舍五入函数确保为整数):
X(i, 1) = round((xmin + (xmax - xmin)*rand(1))); X(i, 2) = round((ymin + (ymax - ymin)*rand(1)));
- 3、初始化蚂蚁种群X,计算初始信息素T0;
- 4、根据转移概率更新蚂蚁位置X;
- 5、根据更新后的蚂蚁位置更新信息素T0;
- 6、迭代100次,求得全局最大值。
matlab程序:
main1.m
%主程序
%ant main program
%清屏
clear all;
close all;
clc;
tic;
%蚂蚁数量100
ant = 100;
%迭代次数100
iter = 10;
%数值范围
xmin = 1;
xmax = 7;
ymin = -1;
ymax = 7;
%绘制原图的步长
stride = 0.05;
%函数
f = 'x.^2 + y.^2';
[x, y] = meshgrid(xmin:stride:xmax, ymin:stride:ymax);
vxp = x;
vyp = y;
vzp = eval(f);
%画出原始图像
figure(1);
mesh(vxp, vyp, vzp);
hold on;
%初始化蚂蚁位置以及计算初始信息素
[X, T0] = initant1(ant, xmin, xmax, ymin, ymax);
%绘制蚂蚁的初始分布
plot3(X(:,1), X(:, 2), T0, 'r*');
hold on;
grid on;
title('ant init pos');
xlabel('x');
ylabel('y');
zlabel('f(x, y)');
%开始优化
%迭代50次
for i_iter = 1:iter
P0 = 0.2; %P0--全局转移选择因子
P = 0.8; %P--信息素蒸发系数
lamda = 1/i_iter;%步长(用于局部搜索和全局搜索)
%求最大信息素
[T_Best(i_iter), BestIndex] = max(T0);
%求全局转移概率
Prob = prob1(ant, BestIndex, T0, i_iter);
%蚂蚁位置更新
X = update_ant_location1(X, ant, P0, lamda, Prob, xmin, xmax, ymin, ymax, i_iter);
%信息素更新
T0 = pheromone_update1(X, ant, T0, P);
%找到本次更新后的最大值以及索引值(也就是x, y对应的那只蚂蚁)
[c, i] = max(T0);
maxpoint_iter = [X(i, 1), X(i, 2)];
max_local(i_iter) = X(i, 1).^2 + X(i, 2).^2;
%将每一代的全局最优解存到max_global矩阵中
if i_iter >=2
if max_local(i_iter) > max_global(i_iter - 1)
max_global(i_iter) = max_local(i_iter);
else
max_global(i_iter) = max_local(i_iter - 1);
end
else
max_global(i_iter) = max_local(i_iter);
end
%max_global(i_iter) = max_local(i_iter);
end
%画出最终图像
figure(2);
mesh(vxp, vyp, vzp);
hold on;
x = X(:, 1);
y = X(:, 2);
plot3(x, y, eval(f), 'b*');
hold on;
grid on;
title('ant final pos ');
xlabel('x');
ylabel('y');
zlabel('f(x, y)');
%画出最优函数值的变化图像
figure(3);
plot(1:iter, max_global, 'b-');
hold on;
title('The optimal function change trend');
xlabel('iteration');
ylabel('Maxf(x, y)');
grid on;
%在迭代50次后的T0中找最大值作为全局最优解,显示在command窗口
[c_max, i_max] = max(T0);
Maxpoint = [X(i_max, 1), X(i_max, 2)]
maxvalue = X(i_max, 1).^2 + X(i_max, 2).^2
runtime = toc
initant1.m
%%初始化蚂蚁位置和初始信息素大小
function [X T0] = initant1(ant, xmin, xmax, ymin, ymax)
for i = 1:ant
X(i, 1) = round((xmin + (xmax - xmin)*rand(1)));
X(i, 2) = round((ymin + (ymax - ymin)*rand(1)));
%T0--信息素,函数值越大,信息素浓度越大 此处将函数值作为信息素
T0(i) = X(i, 1).^2 + X(i, 2).^2;
end
prob1.m
%计算全局转移概率
function Prob = prob1(ant, BestIndex, T0, i_iter)
%求每个蚂蚁的全局转移概率
for j_g = 1:ant
r = T0(BestIndex) - T0(j_g);
Prob(i_iter, j_g) = r/T0(BestIndex);
end
update_ant_location.m
%更新蚂蚁位置
function X = update_ant_location1(X, ant, P0, lamda, Prob, xmin, xmax, ymin, ymax, i_iter)
%<P0 进行局部搜索,>P0进行全局搜索
for j_g_tr = 1:ant
if Prob(i_iter, j_g_tr) < P0
temp1 = X(j_g_tr, 1) + round((2*rand(1) - 1)*lamda);
temp2 = X(j_g_tr, 2) + round((2*rand(1) - 1)*lamda);
else
temp1 = X(j_g_tr, 1) + round((xmax - xmin)*(rand(1) - 0.5));
temp2 = X(j_g_tr, 2) + round((ymax - ymin)*(rand(1) - 0.5));
end
%x搜索范围不能超过边界
if temp1 < xmin
temp1 = xmin;
end
if temp1 > xmax
temp1 = xmax;
end
%y搜索范围不能超过边界
if temp2 < ymin
temp2 = ymin;
end
if temp2 > ymax
temp2 = ymax;
end
%如果更新位置函数值大于原来位置的函数值,那么更新
if temp1.^2 + temp2.^2 > X(j_g_tr, 1).^2 + X(j_g_tr, 2).^2
X(j_g_tr, 1) = temp1;
X(j_g_tr, 2) = temp2;
end
end
pheromone_update.m
%信息素更新
function T0 = pheromone_update1(X, ant, T0, P)
%信息素更新
for t_t = 1:ant
T0(t_t) = (1 - P)*T0(t_t) + X(t_t, 1).^2 + X(t_t, 2).^2;
end
实验结果:
初始蚂蚁分布
迭代100次后蚂蚁分布
最大值随迭代次数变化函数
Maxpoint =
7 7
maxvalue =
98
runtime =
0.5356
4、求解非线性规划问题
题目:
使用蚁群算法求解最优值,加入约束条件即可。
思路:
- 1、变量:设定每个蚂蚁个体包含两个数据 x和y(本题X(i, 1) =x, X(i, 2) = y );
- 2、假设蚂蚁种群100个,也就是X,size(X) = 100*2,X(i, j)∈(-10, 10);
- 3、初始化蚂蚁种群X,计算初始信息素T0;
- 4、根据转移概率更新蚂蚁位置X;
- 5、根据更新后的蚂蚁位置更新信息素T0;
- 6、迭代100次,求得全局最大值。
- 注:蚂蚁向信息素大的方向走,所以信息素函数T0 = -f(x, y)(本文采用T0 = 300 - f(x, y)),确保找到的是目标函数的最小值.
matlab程序:
main2.m
%主程序
%ant main program
%清屏
clear all;
close all;
clc;
tic;
%蚂蚁数量100
ant = 100;
%迭代次数100
iter = 500;
%数值范围
xmin = -10;
xmax = 10;
ymin = -10;
ymax = 10;
%绘制原图的步长
stride = 0.05;
%函数
f = 'exp(x).*(4*x.^2 + 2*y.^2 + 4*x.*y +2*y + 1)';
[x, y] = meshgrid(xmin:stride:xmax, ymin:stride:ymax);
vxp = x;
vyp = y;
vzp = eval(f);
%画出原始图像
figure(1);
mesh(vxp, vyp, vzp);
hold on;
%初始化蚂蚁位置以及计算初始信息素
[X, T0] = initant2(ant, xmin, xmax, ymin, ymax);
%绘制蚂蚁的初始分布
x = X(:, 1);y = X(:, 2);
plot3(X(:,1), X(:, 2), eval(f), 'r*');
hold on;
grid on;
title('ant init pos');
xlabel('x');
ylabel('y');
zlabel('f(x, y)');
%开始优化
%迭代50次
for i_iter = 1:iter
P0 = 0.2; %P0--全局转移选择因子
P = 0.8; %P--信息素蒸发系数
lamda = 1/i_iter;%步长(用于局部搜索和全局搜索)
%求最大信息素
[T_Best(i_iter), BestIndex] = max(T0);
%求全局转移概率
Prob = prob2(ant, BestIndex, T0, i_iter);
%蚂蚁位置更新
X = update_ant_location2(X, ant, P0, lamda, Prob, xmin, xmax, ymin, ymax, i_iter);
%信息素更新
T0 = pheromone_update2(X, ant, T0, P);
%找到本次更新后的最大值以及索引值(也就是x, y对应的那只蚂蚁)
[c, i] = max(T0);
maxpoint_iter = [X(i, 1), X(i, 2)];
max_local(i_iter) = exp(X(i, 1)).*(4*X(i, 1).^2 + 2*X(i, 2).^2 + 4*X(i, 1).*X(i, 2) +2*X(i, 2) + 1);
%将每一代的全局最优解存到max_global矩阵中
if i_iter >=2
if max_local(i_iter) > max_global(i_iter - 1)
max_global(i_iter) = max_local(i_iter);
else
max_global(i_iter) = max_local(i_iter - 1);
end
else
max_global(i_iter) = max_local(i_iter);
end
%max_global(i_iter) = max_local(i_iter);
end
%画出最终图像
figure(2);
mesh(vxp, vyp, vzp);
hold on;
x = X(:, 1);
y = X(:, 2);
plot3(x, y, eval(f), 'b*');
hold on;
grid on;
title('ant final pos ');
xlabel('x');
ylabel('y');
zlabel('f(x, y)');
%画出最优函数值的变化图像
figure(3);
plot(1:iter, max_global, 'b-');
hold on;
title('The optimal function change trend');
xlabel('iteration');
ylabel('Maxf(x, y)');
grid on;
%在迭代50次后的T0中找最大值作为全局最优解,显示在command窗口
[c_max, i_max] = max(T0);
Maxpoint = [X(i_max, 1), X(i_max, 2)]
maxvalue = exp(X(i_max, 1)).*(4*X(i_max, 1).^2 + 2*X(i_max, 2).^2 + 4*X(i_max, 1).*X(i_max, 2) +2*X(i_max, 2) + 1)
runtime = toc
initant2.m
%%初始化蚂蚁位置和初始信息素大小
function [X T0] = initant2(ant, xmin, xmax, ymin, ymax)
for i = 1:ant
X(i, 1) = (xmin + (xmax - xmin)*rand(1));
X(i, 2) = (ymin + (ymax - ymin)*rand(1));
g1 = 1.5 + X(i, 1).*X(i, 2) - X(i, 1) - X(i, 2);
g2 = -X(i, 1).*X(i, 2);
if g1<=0 && g2<=10
%T0--信息素,函数值越大,信息素浓度越大 此处将函数值作为信息素
T0(i) = 300-(exp(X(i, 1)).*(4*X(i, 1).^2 + 2*X(i, 2).^2 + 4*X(i, 1).*X(i, 2) +2*X(i, 2) + 1));
else
T0(i) = 0;
end
end
prob2.m
%计算全局转移概率
function Prob = prob2(ant, BestIndex, T0, i_iter)
%求每个蚂蚁的全局转移概率
for j_g = 1:ant
r = T0(BestIndex) - T0(j_g);
Prob(i_iter, j_g) = r/T0(BestIndex);
end
update_ant_location2.m
%更新蚂蚁位置
function X = update_ant_location2(X, ant, P0, lamda, Prob, xmin, xmax, ymin, ymax, i_iter)
%<P0 进行局部搜索,>P0进行全局搜索
for j_g_tr = 1:ant
if Prob(i_iter, j_g_tr) < P0
temp1 = X(j_g_tr, 1) + (2*rand(1) - 1)*lamda;
temp2 = X(j_g_tr, 2) + (2*rand(1) - 1)*lamda;
else
temp1 = X(j_g_tr, 1) + (xmax - xmin)*(rand(1) - 0.5);
temp2 = X(j_g_tr, 2) + (ymax - ymin)*(rand(1) - 0.5);
end
%x搜索范围不能超过边界
if temp1 < xmin
temp1 = xmin;
end
if temp1 > xmax
temp1 = xmax;
end
%y搜索范围不能超过边界
if temp2 < ymin
temp2 = ymin;
end
if temp2 > ymax
temp2 = ymax;
end
%如果更新位置函数值大于原来位置的函数值,那么更新
if 300-(exp(temp1).*(4*temp1.^2 + 2*temp2.^2 + 4*temp1.*temp2 +2*temp2 + 1)) > 300-(exp(X(j_g_tr, 1)).*(4*X(j_g_tr, 1).^2 + 2*X(j_g_tr, 2).^2 + 4*X(j_g_tr, 1).*X(j_g_tr, 2) +2*X(j_g_tr, 2) + 1))
X(j_g_tr, 1) = temp1;
X(j_g_tr, 2) = temp2;
end
end
pheromone_update2.m
%信息素更新
function T0 = pheromone_update2(X, ant, T0, P)
%信息素更新
for t_t = 1:ant
g1 = 1.5 + X(t_t, 1).*X(t_t, 2) - X(t_t, 1) - X(t_t, 2);
g2 = -X(t_t, 1).*X(t_t, 2);
%满足约束条件,信息素才能大
if g1<=0 && g2<=10
T0(t_t) = (1 - P)*T0(t_t) + 300-(exp(X(t_t, 1)).*(4*X(t_t, 1).^2 + 2*X(t_t, 2).^2 + 4*X(t_t, 1).*X(t_t, 2) +2*X(t_t, 2) + 1));
else
T0(t_t) = 0;
end
end
实验结果:
蚂蚁初始分布
蚂蚁最终分布
函数值变化
Maxpoint =
-7.3710 1.2993
maxvalue =
0.1170
runtime =
0.7804