一、多目标三维无约束优化代码示例
% 运行主脚本
solveMultiObjective;
% 定义第一个目标函数
function f1 = objective1(x)
f1 = x(1)^2 + x(2)^2 + x(3)^2;
end
% 定义第二个目标函数
function f2 = objective2(x)
f2 = (x(1) - 2)^2 + (x(2) - 1)^2 + (x(3) - 3)^2;
end
% 定义包含两个目标函数的函数
function f = multiObjectiveFunction(x)
f1 = objective1(x);
f2 = objective2(x);
f = [f1, f2];
end
% 主脚本,用于解决多目标优化问题
function solveMultiObjective
% 变量的数量
nvars = 3;
% 定义每个变量的下界和上界
lb = [0, 0, 0];
ub = [3, 3, 3];
% 设置遗传算法的选项
options = optimoptions('gamultiobj', ...
'PopulationSize', 100, ... % 设置种群大小
'Generations', 100, ... % 设置代数
'PlotFcn', @gaplotpareto, ... % 设置绘图函数
'Display', 'iter'); % 设置每次迭代时显示信息
% 使用gamultiobj函数求解问题
[x, fval] = gamultiobj(@multiObjectiveFunction, nvars, [], [], [], [], lb, ub, options);
% 绘制Pareto前沿
figure;
plotHandle = plot(fval(:,1), fval(:,2), 'o');
xlabel('目标1: f1 = x1^2 + x2^2 + x3^2');
ylabel('目标2: f2 = (x1 - 2)^2 + (x2 - 1)^2 + (x3 - 3)^2');
title('多目标优化问题的Pareto前沿');
grid on;
% 启用数据光标模式
dcmObj = datacursormode(gcf);
set(dcmObj, 'UpdateFcn', @(obj, event_obj) dataCursorUpdate(obj, event_obj, x, fval));
end
% 自定义数据光标的显示函数
function output_txt = dataCursorUpdate(~, event_obj, x, fval)
% 获取点击的目标函数值
pos = get(event_obj, 'Position');
% 找到点击的点对应的索引
index = find(fval(:,1) == pos(1) & fval(:,2) == pos(2));
% 获取对应的x1, x2和x3值
x1_value = x(index, 1);
x2_value = x(index, 2);
x3_value = x(index, 3);
% 创建输出文本
output_txt = {['目标1: ', num2str(pos(1))], ...
['目标2: ', num2str(pos(2))], ...
['x1 = ', num2str(x1_value)], ...
['x2 = ', num2str(x2_value)], ...
['x3 = ', num2str(x3_value)]};
end
运行效果图
二、代码详细注释
1、optimoptions
options = optimoptions('gamultiobj', ... % 指定算法为 gamultiobj
'PopulationSize', 100, ... % 设置种群大小
'Generations', 100, ... % 设置代数
'PlotFcn', @gaplotpareto, ... % 设置绘图函数,用于绘制帕累托前沿图
'Display', 'iter'); % 设置每次迭代时显示信息,如当前代数、最佳目标值
2、gamultiobj
gamultiobj(@multiObjectiveFunction, % @目标函数
nvars, % 变量数量/维度
[], % 线性不等式约束矩阵A,不等式约束即 A*x <= b
[], % 线性不等式约束向量b
[], % 线性等式约束矩阵Aeq,等式约束即 Aeq*X == beq
[], % 线性等式约束向量beq
lb, % 决策变量X的下界
ub, % 决策变量X的上界
options); % 设置遗传算法选项
官方文档:https://ww2.mathworks.cn/help/releases/R2021b/gads/gamultiobj.html?s_tid=doc_ta
上面由于我们没有传非线性约束,故nonlcon参数可以不传
下面主要介绍一下带约束条件的时候,A,b,Aeq, beq, nonlcon 这几个参数应该怎么传
1)1个决策变量(单维)
代码如下:
% 1. 定义线性不等式约束 A * x <= b
A = 1;
b = 5;
% 2. 定义线性等式约束 Aeq * x = beq
Aeq = 2;
beq = 6;
% 3. 定义非线性约束
function [c, ceq] = nonlcon(x)
c = x^2 - 16; % 非线性不等式约束
ceq = x^3 - 1; % 非线性等式约束
end
% 运行多目标遗传算法
[x, fval] = gamultiobj(multiObjectiveFunction, nvars, A, b, Aeq, beq, lb, ub, @nonlcon, options);
2)2个决策变量(二维)
代码如下:
% 1. 定义线性不等式约束 A * x <= b
A = [1, 2; 2, 1];
b = [10; 8];
% 2. 定义线性等式约束 Aeq * x = beq
Aeq = [1, 1; 2, -1];
beq = [5; 2];
% 3. 定义非线性约束
function [c, ceq] = nonlcon(x)
c = [x(1)^2 + x(2)^2 - 16; % 非线性不等式约束1
(x(1) - 1)^2 + (x(2) - 1)^2 - 9]; % 非线性不等式约束2
ceq = [x(1)^3 + x(2) - 1; % 非线性等式约束1
x(1) + x(2)^3 - 3]; % 非线性等式约束2
end
[x, fval] = gamultiobj(multiObjectiveFunction, nvars, A, b, Aeq, beq, lb, ub, @nonlcon, options);
3、plot
figure; % 创建一个新的图形窗口
plotHandle = plot(fval(:,1), fval(:,2), 'o'); % 绘制二维散点图,并返回绘图对象的句柄
xlabel('目标1: f1 = x1^2'); % x轴标签
ylabel('目标2: f2 = (x1 - 2)^2'); % y轴标签
title('多目标优化问题的Pareto前沿'); % 标题
grid on; % 启用网格线
4、datacursormode
绘制二维的图
figure; % 创建一个新的图形窗口
plotHandle = plot(fval(:,1), fval(:,2), 'o'); % 绘制二维散点图,并返回绘图对象的句柄
xlabel('目标1: f1 = x1^2'); % x轴标签
ylabel('目标2: f2 = (x1 - 2)^2'); % y轴标签
title('多目标优化问题的Pareto前沿'); % 标题
grid on; % 启用网格线
其中 plot 使用
plotHandle = plot(fval(:,1), % 所有解的第一个目标函数值,即 f1(xi)
fval(:,2), % 所有解的第二个目标函数值,即 f2(xi)
'o'); % 指定使用圆圈标记来绘制数据点
关于第三个标记,见附录1
5、dataCursorUpdate
定义用户点击图表中的点的时候,触发函数 dataCursorUpdate
GUI会传递obj和event_obj2个内部的对象属性,x和fval是我们自己外部定义的变量
% 1. 获得数据光标模式对象,gcf是当前窗口句柄
dcmObj = datacursormode(gcf);
% 2. set函数用于设置图形对象或 UI 控件的属性
set(dcmObj, 'UpdateFcn', % 当用户点击图表时调用下面的匿名函数
% 3. 自定义匿名函数@(obj, event_obj) 这2个参数由GUI内部填充进去,一般是固定的
@(obj, event_obj)
% 4. 匿名函数内部调用 dataCursorUpdate 函数,并返回
dataCursorUpdate(obj, % 数据光标模式对象
event_obj, % 事件对象,包含数据光标的位置信息
x, % 决策变量的值
fval)); % 多目标优化的目标函数值
三、附录
1、plot绘图常用标记
'o'
:圆圈(circle)'+'
:加号(plus sign)'*'
:星号(asterisk)'.'
:点(point)'x'
:叉号(cross)'s'
:方块(square)'d'
:菱形(diamond)'^'
:上三角(upward-pointing triangle)'v'
:下三角(downward-pointing triangle)'>'
:右三角(right-pointing triangle)'<'
:左三角(left-pointing triangle)'p'
:五角星(pentagram)'h'
:六角星(hexagram)2. 线型
线型用于指定连接数据点的线的样式。以下是一些常用的线型:
'-'
:实线(solid line)'--'
:虚线(dashed line)':'
:点线(dotted line)'-.'
:点划线(dash-dot line)3. 颜色
颜色指定数据点和线的颜色。以下是一些常用的颜色选项:
'r'
:红色(red)'g'
:绿色(green)'b'
:蓝色(blue)'c'
:青色(cyan)'m'
:洋红色(magenta)'y'
:黄色(yellow)'k'
:黑色(black)'w'
:白色(white)组合使用
你可以组合线型、标记符号和颜色来创建不同的绘图样式。例如:
'-o'
:实线加圆圈标记'--x'
:虚线加叉号标记':s'
:点线加方块标记'-.*r'
:红色实线加星号标记
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏