多目标规划+MATLAB的一种可以自动选择求解方式的优化方法

本文为北海的数模课程学习笔记,课程出自微信公众号:数学建模BOOM。
多目标规划就是既要又要,但总有优先级的。

目录

解题思路

 概念一:正负偏差变量​编辑

 概念二:绝对约束和目标约束 

例题模型建立

常用算法:序贯算法

为什么此处不给优先因子的准确数值?

 代码讲解

初始化

设置约束条件 

设置目标函数并优化

代码求解过程详解

求第一级目标(i=1)时

目标函数和约束条件

求解输出 

解释

求第二级目标(i=2)时

 求解输出 

解释

求第三级目标(i=3)时

结果分析

模型改进:可以优化为整数规划

解题思路

需要衡量每个目标的 完成情况
如果三个目标有一定 冲突 ,要在主观上区分三个目标的 重要性;
使得 整体的完成情况 尽量好

 概念一:正负偏差变量

 概念二:绝对约束和目标约束 

例题模型建立

  

st中的约束条件包含了绝对约束和目标约束。

目标函数中的正负偏差变量都含有x,所以最后都是可以转化为x的。

常用算法:序贯算法

为什么此处不给优先因子的准确数值?

因为难以确定为什么恰好是这个准确数值。

要尽量减少甚至避免主观性

 代码讲解

代码涉及的优化变量optimvar、优化问题optimproblem概念
MATLAB官方讲解
https://ww2.mathworks.cn/help/optim/ug/optimvar.html
https://ww2.mathworks.cn/help/optim/ug/optim.problemdef.optimizationproblem.solve.html?searchHighlight=solve&s_tid=srchtitle_solve_2

初始化

当前模型

clc, clear
% 使用优化变量、优化问题来求解
% 创建优化变量x,dp和dm,类似于利用C++的类来创建对象
% 可以用来为目标函数和问题约束创建表达式
x = optimvar('x',2,'LowerBound',0);   % 定义两个变量x,最小值都为0
dp = optimvar('dp',3,'LowerBound',0); % 定义3个正偏差变量dp,最小值都为0
dm = optimvar('dm',3,'LowerBound',0); % 定义3个负偏差变量dm,最小值都为0

% 创建求最小值的优化问题p;optimproblem创建优化类问题,
p=optimproblem('ObjectiveSense','min');
% ObjectiveSense用于指定优化问题的目标方向,包含max和min

设置约束条件 

 

% 设置优化问题的约束条件,cons可以一次写(一条)或者[多行]
p.Constraints.cons1 = ( 2*x(1)+x(2)<=11 );
% 注意,表示相等关系用的符号是"=="
p.Constraints.cons2=[x(1)-x(2)+dm(1)-dp(1)==0       
                     x(1)+2*x(2)+dm(2)-dp(2)==10
                     8*x(1)+10*x(2)+dm(3)-dp(3)==56];

设置目标函数并优化

% 设置目标函数
obj=[dp(1); dm(2)+dp(2); dm(3)];
% 单级目标函数的最优值goal,初始设为足够大的数
% 非常宽松的约束(goal非常大)就等于没有约束,确保第一级的正常运算
goal=100000*ones(3,1);

for i=1:3 %从第一级到第三级,求第n级时,前n-1级都是约束
    % 重要:更新上一级的最优值,作为该级的约束条件;
    p.Constraints.cons3=obj<=goal;
    p.Objective=obj(i);
    [sx,fval]=solve(p);     % 针对优化问题使用solve,会自动选择求解方式
    % 显示当前迭代的信息,并将结果赋值给新的变量
    fprintf('第%d级目标求解为:\n',i)
    fval, xx=sx.x, sdm=sx.dm, sdp=sx.dp
    goal(i)=fval;
end

代码求解过程详解

求第一级目标(i=1)时

目标函数和约束条件

对于三个目标的偏差变量都没有约束,代码中用小于等于一个很大的数来表示。

求解输出 

Solving problem using linprog.

Optimal solution found.
第1级目标求解为:
fval = 0
xx = 2×1    
         0
    5.6000

sdm = 3×1    
    5.6000
         0
         0

sdp = 3×1    
         0
    1.2000
         0

解释

结果xx是第一个单目标\min d_1^{+}的最优值。

xx:xx包含了两个产品的生产数量(0,5.6)。第一个是0,就是第一种尽可能少,一个都不生产,全生产第二个(5.6)。

验证结果xx:

  • 绝对约束2*0+1*5.6<11
  • 目标一负偏差变量为-(0-5.6)=5.6
  • 目标二的正偏差变量是5.6*2-10=1.2。
  • 目标三正好为5.6*10=56万,此时正负偏差变量都是0

求第二级目标(i=2)时

目标函数和约束条件

 

 求解输出 

Solving problem using linprog.

Optimal solution found.
第2级目标求解为:
fval = 0
xx = 2×1    
    2.0000
    4.0000

sdm = 3×1    
    2.0000
         0
         0

sdp = 3×1    
     0
     0
     0

解释

结果xx是第二个单目标\min d_2^{-}+d_2^{+}的最优值。

xx:xx包含了两个产品的生产数量(2,4)。

验证结果xx:

  • 绝对约束2*2+1*4=8<11
  • 目标一负偏差变量为-(2-4)=2
  • 目标二的正负偏差变量是2*2+4*2-10=0。
  • 目标三正好为2*8+4*10=56万,此时正负偏差变量都是0

求第三级目标(i=3)时

Solving problem using linprog.

Optimal solution found.
第3级目标求解为:
fval = 0
xx = 2×1    
    2.0000
    4.0000

sdm = 3×1    
    2.0000
         0
         0

sdp = 3×1    
     0
     0
     0

结果分析

模型改进:可以优化为整数规划

本体没有加上整数的约束(整数规划),但是恰好最后的“满意解”是整数。

一开始的5.6可以取5,因为取6的话可能不满足约束。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值