多目标规划

一、本质

其本质就是既要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

最终结果:
在这里插入图片描述

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐