多目标代码详细注释, optimoptions、gamultiobj、plot、datacursormode、dataCursorUpdate的逐行注释

avatar 2024年05月23日17:21:41 0 75 views
博主分享免费Java教学视频,B站账号:Java刘哥 ,长期提供技术问题解决、项目定制:本站商品点此

一、多目标三维无约束优化代码示例

% 运行主脚本
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':红色实线加星号标记

 

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 编程爱好者交流群
  • 资源分享,问题解决,技术交流。QQ群:424285828(新群)
  • weinxin

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0