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

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

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

  1. % 运行主脚本
  2. solveMultiObjective;
  3. % 定义第一个目标函数
  4. function f1 = objective1(x)
  5. f1 = x(1)^2 + x(2)^2 + x(3)^2;
  6. end
  7. % 定义第二个目标函数
  8. function f2 = objective2(x)
  9. f2 = (x(1) - 2)^2 + (x(2) - 1)^2 + (x(3) - 3)^2;
  10. end
  11. % 定义包含两个目标函数的函数
  12. function f = multiObjectiveFunction(x)
  13. f1 = objective1(x);
  14. f2 = objective2(x);
  15. f = [f1, f2];
  16. end
  17. % 主脚本,用于解决多目标优化问题
  18. function solveMultiObjective
  19. % 变量的数量
  20. nvars = 3;
  21. % 定义每个变量的下界和上界
  22. lb = [0, 0, 0];
  23. ub = [3, 3, 3];
  24. % 设置遗传算法的选项
  25. options = optimoptions('gamultiobj', ...
  26. 'PopulationSize', 100, ... % 设置种群大小
  27. 'Generations', 100, ... % 设置代数
  28. 'PlotFcn', @gaplotpareto, ... % 设置绘图函数
  29. 'Display', 'iter'); % 设置每次迭代时显示信息
  30. % 使用gamultiobj函数求解问题
  31. [x, fval] = gamultiobj(@multiObjectiveFunction, nvars, [], [], [], [], lb, ub, options);
  32. % 绘制Pareto前沿
  33. figure;
  34. plotHandle = plot(fval(:,1), fval(:,2), 'o');
  35. xlabel('目标1: f1 = x1^2 + x2^2 + x3^2');
  36. ylabel('目标2: f2 = (x1 - 2)^2 + (x2 - 1)^2 + (x3 - 3)^2');
  37. title('多目标优化问题的Pareto前沿');
  38. grid on;
  39. % 启用数据光标模式
  40. dcmObj = datacursormode(gcf);
  41. set(dcmObj, 'UpdateFcn', @(obj, event_obj) dataCursorUpdate(obj, event_obj, x, fval));
  42. end
  43. % 自定义数据光标的显示函数
  44. function output_txt = dataCursorUpdate(~, event_obj, x, fval)
  45. % 获取点击的目标函数值
  46. pos = get(event_obj, 'Position');
  47. % 找到点击的点对应的索引
  48. index = find(fval(:,1) == pos(1) & fval(:,2) == pos(2));
  49. % 获取对应的x1, x2x3
  50. x1_value = x(index, 1);
  51. x2_value = x(index, 2);
  52. x3_value = x(index, 3);
  53. % 创建输出文本
  54. output_txt = {['目标1: ', num2str(pos(1))], ...
  55. ['目标2: ', num2str(pos(2))], ...
  56. ['x1 = ', num2str(x1_value)], ...
  57. ['x2 = ', num2str(x2_value)], ...
  58. ['x3 = ', num2str(x3_value)]};
  59. end

运行效果图

二、代码详细注释

1、optimoptions 

  1. options = optimoptions('gamultiobj', ... % 指定算法为 gamultiobj
  2. 'PopulationSize', 100, ... % 设置种群大小
  3. 'Generations', 100, ... % 设置代数
  4. 'PlotFcn', @gaplotpareto, ... % 设置绘图函数,用于绘制帕累托前沿图
  5. 'Display', 'iter'); % 设置每次迭代时显示信息,如当前代数、最佳目标值

2、gamultiobj

  1. gamultiobj(@multiObjectiveFunction, % @目标函数
  2. nvars, % 变量数量/维度
  3. [], % 线性不等式约束矩阵A,不等式约束即 A*x <= b
  4. [], % 线性不等式约束向量b
  5. [], % 线性等式约束矩阵Aeq,等式约束即 Aeq*X == beq
  6. [], % 线性等式约束向量beq
  7. lb, % 决策变量X的下界
  8. ub, % 决策变量X的上界
  9. options); % 设置遗传算法选项

官方文档:https://ww2.mathworks.cn/help/releases/R2021b/gads/gamultiobj.html?s_tid=doc_ta

上面由于我们没有传非线性约束,故nonlcon参数可以不传

下面主要介绍一下带约束条件的时候,A,b,Aeq, beq, nonlcon 这几个参数应该怎么传

1)1个决策变量(单维)

代码如下:

  1. % 1. 定义线性不等式约束 A * x <= b
  2. A = 1;
  3. b = 5;
  4. % 2. 定义线性等式约束 Aeq * x = beq
  5. Aeq = 2;
  6. beq = 6;
  7. % 3. 定义非线性约束
  8. function [c, ceq] = nonlcon(x)
  9. c = x^2 - 16; % 非线性不等式约束
  10. ceq = x^3 - 1; % 非线性等式约束
  11. end
  12. % 运行多目标遗传算法
  13. [x, fval] = gamultiobj(multiObjectiveFunction, nvars, A, b, Aeq, beq, lb, ub, @nonlcon, options);

 

2)2个决策变量(二维)

代码如下:

  1. % 1. 定义线性不等式约束 A * x <= b
  2. A = [1, 2; 2, 1];
  3. b = [10; 8];
  4. % 2. 定义线性等式约束 Aeq * x = beq
  5. Aeq = [1, 1; 2, -1];
  6. beq = [5; 2];
  7. % 3. 定义非线性约束
  8. function [c, ceq] = nonlcon(x)
  9. c = [x(1)^2 + x(2)^2 - 16; % 非线性不等式约束1
  10. (x(1) - 1)^2 + (x(2) - 1)^2 - 9]; % 非线性不等式约束2
  11. ceq = [x(1)^3 + x(2) - 1; % 非线性等式约束1
  12. x(1) + x(2)^3 - 3]; % 非线性等式约束2
  13. end
  14. [x, fval] = gamultiobj(multiObjectiveFunction, nvars, A, b, Aeq, beq, lb, ub, @nonlcon, options);

 

3、plot

  1. figure; % 创建一个新的图形窗口
  2. plotHandle = plot(fval(:,1), fval(:,2), 'o'); % 绘制二维散点图,并返回绘图对象的句柄
  3. xlabel('目标1: f1 = x1^2'); % x轴标签
  4. ylabel('目标2: f2 = (x1 - 2)^2'); % y轴标签
  5. title('多目标优化问题的Pareto前沿'); % 标题
  6. grid on; % 启用网格线

4、datacursormode

绘制二维的图

  1. figure; % 创建一个新的图形窗口
  2. plotHandle = plot(fval(:,1), fval(:,2), 'o'); % 绘制二维散点图,并返回绘图对象的句柄
  3. xlabel('目标1: f1 = x1^2'); % x轴标签
  4. ylabel('目标2: f2 = (x1 - 2)^2'); % y轴标签
  5. title('多目标优化问题的Pareto前沿'); % 标题
  6. grid on; % 启用网格线

其中 plot 使用

  1. plotHandle = plot(fval(:,1), % 所有解的第一个目标函数值,即 f1(xi)
  2. fval(:,2), % 所有解的第二个目标函数值,即 f2(xi)
  3. 'o'); % 指定使用圆圈标记来绘制数据点

关于第三个标记,见附录1

 

5、dataCursorUpdate

定义用户点击图表中的点的时候,触发函数 dataCursorUpdate

GUI会传递obj和event_obj2个内部的对象属性,x和fval是我们自己外部定义的变量

  1. % 1. 获得数据光标模式对象,gcf是当前窗口句柄
  2. dcmObj = datacursormode(gcf);
  3. % 2. set函数用于设置图形对象或 UI 控件的属性
  4. set(dcmObj, 'UpdateFcn', % 当用户点击图表时调用下面的匿名函数
  5. % 3. 自定义匿名函数@(obj, event_obj) 2个参数由GUI内部填充进去,一般是固定的
  6. @(obj, event_obj)
  7. % 4. 匿名函数内部调用 dataCursorUpdate 函数,并返回
  8. dataCursorUpdate(obj, % 数据光标模式对象
  9. event_obj, % 事件对象,包含数据光标的位置信息
  10. x, % 决策变量的值
  11. 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
  • 个人淘宝
  • 店铺名:言曌博客咨询部

  • (部分商品未及时上架淘宝)

发表评论

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

  

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