本文为北海的数模课程学习笔记,课程出自微信公众号:数学建模BOOM。
多目标规划就是既要又要,但总有优先级的。
目录
解题思路
•
需要衡量每个目标的
完成情况
;
•
如果三个目标有一定
冲突
,要在主观上区分三个目标的
重要性;
•
使得
整体的完成情况
尽量好
概念一:正负偏差变量
概念二:绝对约束和目标约束
例题模型建立
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是第一个单目标的最优值。
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是第二个单目标的最优值。
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的话可能不满足约束。