当前位置:   article > 正文

数学建模|多目标规划+序贯算法|简要原理+实例matalb代码实现_matlab目标规划代码

matlab目标规划代码

1. 核心原理简介

1.1 三个重要概念

(1) 正负偏差变量

【衡量每个目标的完成情况】

设 \[fi(i=1,l)\] 为第i个目标函数的实际值;

设 \[di0\] 表示 \[fi\] 的目标值

  • 正偏差变量\[di+\]  【表示实际值超过目标值的部分】

 \[di+=max{fidi0,0}\]

  •  负偏差变量\[di\] 【表示实际值未达到目标值的部分】

\[di=min{fidi0,0}\] 

 实例说明:

目标函数实际值\[f1\]目标值\[d10\]

正偏差变量

\[d1+\]

负偏差变量

\[d1\]

意义
收入50万不少于60万010未到达还有10万
收入70万100超出10万


 (2) 绝对约束与目标约束

  • 绝对约束

【必须要满足的条件】

  • 目标约束

【允许有偏差→利用正负偏差变量】

实例说明:【含有“尽可能”、“尽量”等关键词】

尽可能使利润不低于56万


(3)优先因子

【类似“权重”】

给每一个目标一个优先因子P,仅仅是确定各目标的求解次序


 1.2 序贯算法

【将之前的单目标最优解变成下一个目标的约束条件,然后迭代这个过程】

1.根据模型中各个目标的优先级(优先因子),确定各目标的求解次序

2.求第一级单目标规划的最优值\[f1\]注意要先给最优解附一个初值

3.以第一 级单目标等于最优值\[f1\]为新的约束条件,求第二级目标最优值记为\[f2\]

4.依次递推,直到所有目标都求完或不存在可行解为止


2. 实例建模过程

2.1 实例

某工厂生产产品1和产品2,有关数据如下,请给出方案,设计每天生产产品1、2各多少时,满足下面的要求:

现在的要求是:


2.2 建模过程

 (1)分析问题(翻译成数学语言)

  • 根据原材料拥有量

\[2x1+x211\]

  • 根据生产能力

\[x1+2x210\]

  • 根据具体要求(因为带有“尽可能”关键词,为目标约束)

\[{x1x2x1+2x2=108x1+10x256\]


(2)引入正负变差变量 

\[{x1x20x1+2x2=108x1+10x256\]                             \[\]                                  \[{mind1+min(d2++d2)mind3\]

以上不等式变形顺序对应

  • 第一个不等式:因为是≤,所以要求正偏差变量要最小
  • 第二个不等式:因为是=,所以要求正偏差和负偏差都要小,所以求和要最小
  • 第三个不等式:因为是≥,所以要求负偏差变量要最小

所以得到目标函数

\[min{P1d1++P2(d2++d2)+P3d3}\] 

P仅仅是优先因子,仅仅决定后面多目标求解顺序,而不是真正意义上的权重值

根据1中原理介绍偏差变量,目标函数看似没有包含变量x,实则每一个偏差变量都要利用x计算 


(3)模型总结 

  • 目标函数:

\[min{P1d1++P2(d2++d2)+P3d3}\]

  •  约束条件:

\[stc:{2x1+x211x1x2d1++d1=0x1+2x2d2++d2=108x1+10x2d3++d3=56x1,x2,di+,di0,i=1,2,3\]

 “多退少补”原则【将目标约束中的不等式变成等式】

\[d1++d1\] 表示:减去“超过”的,加上“未达到


3. Matlab实现

 3.1 代码

  1. clc,clear
  2. %初始化优化问题框架
  3. %创建优化变量
  4. %%2个产品【用x表示】【最小值=0
  5. x = optimvar('x',2,'LowerBound',0);
  6. %%3个目标函数的正偏差变量 【最小值=0
  7. dp = optimvar('dp',3,'LowerBound',0);
  8. %%3个目标函数的负偏差变量 【最小值=0
  9. dm = optimvar('dm',3,'LowerBound',0);
  10. %创建优化问题对象
  11. p = optimproblem('ObjectiveSense','min');
  12. %设置约束条件
  13. %%设置绝对约束
  14. p.Constraints.cons1 = (2*x(1)+x(2)<=11);
  15. %%设置3个目标约束
  16. p.Constraints.cons2 = [x(1)-x(2)-dp(1)+dm(1)==0
  17. x(1)+2*x(2)-dp(2)+dm(2)==10
  18. 8*x(1)+10*x(2)-dp(3)+dm(3)==56];
  19. %设置目标函数
  20. obj = [dp(1);dm(2)+dp(2);dm(3)];
  21. % 单级目标函数的最优值goal,初始设为足够大的数
  22. % 非常宽松的约束就等于没有约束,确保第一级的正常运算
  23. goal=100000*ones(3,1);
  24. %序贯算法(迭代最优)
  25. for i=1:3
  26. % 重要:更新上一级的最优值,作为该级的约束条件;
  27. p.Constraints.cons3=[obj<=goal];
  28. p.Objective = obj(i);
  29. %求解【 针对优化问题使用solve,会自动选择求解方式】
  30. [sx,fval] = solve(p);
  31. %【下面两行可注释】只是展示每一次迭代结果
  32. fprintf('第%d级目标求解为:\n',i)
  33. fval, xx=sx.x, sdm=sx.dm, sdp=sx.dp
  34. %sx类似于python中创建的类【这里指优化类】
  35. %x(最后得到的优化方案)、dm(负偏差变量)、dp(正偏差变量)为3个sx下的对象
  36. goal(i) = fval;
  37. end

3.2 结果展示

 表示:每天应生产产品一2件,产品二4件


4. 总结

(1)问题函数optimproblem【用来创建优化问题】

prob=optimproblem('ObjectiveSense','max');
  • ObjectiveSense是目标类型,后面跟的‘max’为求最大优化

  • 默认为求min


(2) 求解函数`optimvar`【一种类似于赋值的函数】

x=optimvar('x',1,2,'TYPE','integer','LowerBound',0,'UpperBound',inf);
  • 第一个‘x’里面是变量名,后面 1 2 为变量的行 列

  • ‘TYPE’,后面定义的是该函数所属类型,比如说integer整数型,double双精度型号等

  • ‘LowerBound'下界;'UpperBound'上界

(3) 设置约束条件prob.Constraints.cons1

  1. p.Constraints.cons1 = ( 2*x(1)+x(2)<=11 )
  2. p.Constraints.cons2=[x(1)-x(2)+dm(1)-dp(1)==0
  3. x(1)+2*x(2)+dm(2)-dp(2)==10
  4. 8*x(1)+10*x(2)+dm(3)-dp(3)==56];
  • p为优化问题创建的对象


(4) 设置目标函数pro.Objective

  1. obj=[dp(1); dm(2)+dp(2); dm(3)];
  2. p.Objective=obj(i);
  • p为优化问题创建的对象


(5) sovle函数求解

[sx,fval]=solve(p);
  • p为优化问题创建的对象

  • sx为最优值变量(理想)

  • fval为在最优变量下的目标函数值

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/55612
推荐阅读
相关标签
  

闽ICP备14008679号