多目标规划
一、本质
其本质就是既要xxx,又要xxx,比如我们在买车的时候既想要配置最好,又想要价格最低,那怎么实现这个方案呢,其本质就是一个多目标规划问题,一般来说两个目标是相互冲突的,我们要做的是尽可能在满足条件下达到一个最优状态。
二、举例
这就是一个多目标规划问题,一共有三个目标。
我们将这三个目标翻译成人话:
1.目标1是不超过,也就是要<=
2.目标2是充分利用,但是不加班,也就是尽量=
3.目标3是利润不低于56万,也就是尽量>=
如果同时满足不了就需要进行取舍
隐藏条件是原材料有限。
1.解题思路
(1)需要衡量每个目标的完成情况。
(2)如果目标之间具有冲突则要先完成重要程度高的。
(3)让其整体的完成情况达到最好。
正负偏差变量举例:
目标是让利润不少于56万,也就是利润当然越高越好,因此对于正偏差变量多少无所谓,我们主要让负偏差变量尽可能小,这样即使利润达不到56万,但是差距也小。
由三个目标可以得出公式:
(1) X1-X2<=0 (3)8X1+10X2>=56 分别转化成目标函数:
2.绝对约束
就是目标模型中自带的约束,必须满足,否则就是不可行解。
3.目标约束
也就是对不等式右端的值允许有偏差。
都是采用多退少补策略。因为你多了利润更好,但是你少了就不太行。补也要补的少。
最终会得到目标函数和约束条件。
其中p1,p2,p3相当于设定一个优先级。
4.求解
步骤:
% 使用优化变量、优化问题来求解
% 创建优化变量x,dp和dm,类似于利用C++的类来创建对象
% 可以用来为目标函数和问题约束创建表达式
x=optimvar('x',2,'LowerBound',0); %定义两个变量x,默认值都为1.LowerBound最小值
dp=optimvar('dp',3,'LowerBound',0);%定义三个正偏差变量dp
dm=optimvar('dm',3,'LowerBound',0);%定义三个负偏差变量dm
p=optimproblem('ObjectiveSense','min');%创建求最小值优化类问题。
%设置约束条件
p.Constraints.const1=[2*x(1)+x(2)<=11];
p.Constraints.const2=[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=100000*ones(3,1)
for i=1:3
% 重要:更新上一级的最优值,作为该级的约束条件;
p.Constraints.cons3=[obj<=goal]
p.Objective=obj(i); %p要求第一个目标的最小值
[sx,fval]=solve(p); % 针对优化问题使用solve,会自动选择求解方式。sx最优解 fval最优值
fprintf('第%d级目标求解为:\n',i)
fval, xx=sx.x, sdm=sx.dm, sdp=sx.dp
goal(i)=fval;
end
最终结果: