多目标规划的处理
多目标规划(Multi-objective programming)是指在一个优化问题中需要同时考虑多个目标函数的优化。在多目标规划问题中,目标函数之间通常是互相冲突的,即在优化一个目标函数的过程中,另一个或几个目标函数可能会受到影响。因此,多目标规划问题的目标是找到一个解x,使得在满足约束的前提下,所有目标函数达到一个相对满意的折中。
在现实世界中,我们经常面临需要在多个目标之间权衡的问题。例如:
场景 |
示例 |
在经济发展与环境保护之间寻求平衡 |
如经济发展的目标函数可以是国内生产总值(GDP)的增长率,而环境保护的目标函数可以是污染物排放量的减少率。政府在制定政策时需要权衡这两个目标,以实现经济与环境的可持续发展。 |
在提高产品质量的同时降低成本 |
如设计一款手机,设计师需要在保证性能、续航时间、重量和成本等多个因素之间达到一个合适的平衡。 |
在投资理财里权衡收益和风险 |
如购买基金或股票,投资者需要考虑到不同产品的期望收益和风险,来购买合适风险等级的理财产品。 |
在供应链管理中的多目标 |
如库存成本、运输成本、客户满意度等。为了实现这些目标的平衡,公司需要优化其生产、采购、运输和分销策略。 |
商品定价的利润和销量的博弈 |
如电子产品定价,希望能得到最多的利润率,同时又希望能扩大销量,使得生产的单位成本降低。 |
对于这些多目标问题,如何折中以及如何求解是个难题,为此,学者们提出了许多方法将多目标规划问题转化为单目标规划问题,以便利用传统的单目标优化技术求解。如:加权和法(本篇)、指标法、层次法等。这些方法都有其优缺点,使用时需要根据具体问题的特点选择合适的方法。
值得注意的是,将多目标转化为单目标后求解得到的解可能不是多目标优化问题的帕累托最优解(没有其他解更优),因此在实际应用中需要权衡各种因素。
加权和法(Weighted Sum Method)
1. 原理
加权和法(Weighted Sum Method),是将多个目标函数通过赋予不同的权重值相加形成一个单一的目标函数。具体来说,假设有个目标函数,我们可以构建一个新的目标函数如下:
其中表示第个目标函数的权重,通常要求所有权重之和为1。
通过调整权重值,可以得到不同的优化结果。
2.举例子
假设一个农场主希望优化其土地上的作物种植布局,需要在以下两个目标之间取得平衡:
- 目标1:最大化农场产值(单位:元);
- 目标2:最小化化肥使用量(单位:千克)。
农场主有两种作物可以种植:作物A、作物B、作物C。设、
分别为种植作物A、B、C的面积。
- 已知A、B、C每亩作物的产值分别为1000元、1200元、1300元。则,目标1的函数:
- 每亩A、B、C作物分别需要化肥:20千克、30千克、33千克。则,目标2的函数:
- 总种植面积不超过100亩。即:
- 3种作物至少每个需要种10亩。
我们可以使用加权和法将其转换为单目标优化问题。
- 首先,我们引入权重参数、,分别表示农场产值和化肥使用量的重要程度,且满足,即
- 然后考虑两个目标的单位和数据量级不一样,我们引入参数来给目标2调整数量级。实际使用的时候,也可以合并进
- 然后,新的单目标 ,即
在实际应用中,可以根据需求和数据的数量级来调整权重参数w1和w2的值,以平衡这两个目标。 假设农场主更关心农场产值,可以选择。
接下来,我们使用 MindOpt APL建模语言对这个问题进行建模,并调用 MindOpt Solver 来求解。代码如下:
clear model; # ------建模-------Start----- # model_1.mapl # 变量 var x1 >= 10; var x2 >= 10; var x3 >= 10; # 权重参数 param w1 = 0.7; # 假设农场主更关心农场产值 param w2 = 1 - w1; param c = 50; # 根据数量级差异 1000/20 = 50来简单预估 # 目标 maximize obj: w1 * (1000 * x1 + 1200 * x2 + 1300 * x3) - c * w2 * (20 * x1 + 30 * x2 + 33 * x3); # 定义约束条件 subject to constraint1: x1 + x2 + x3 <= 100; # ------建模-------End----- #求解 option solver mindopt; # (可选)指定求解用的求解器,默认是MindOpt option mindopt_options 'print=0'; #设置求解器输出级别,减少过程打印 solve; # 求解 # 结果打印和检查结果 print "-----------------Display---------------"; display; print "改造的单目标最优是:",w1 * (1000 * x1 + 1200 * x2 + 1300 * x3) - c * w2 * (20 * x1 + 30 * x2 + 33 * x3); print "其中,种", x1,"亩作物A,种",x2,"亩作物B,种",x3,"亩作物C。"; print "对应农场产值:", (1000 * x1 + 1200 * x2 + 1300 * x3),"元。"; print "对应化肥使用量:", (20 * x1 + 30 * x2 + 33 * x3),"千克。";
运行上述代码结果如下:
Running mindoptampl wantsol=1 print=0 MindOpt Version 0.25.1 (Build date: 20230816) Copyright (c) 2020-2023 Alibaba Cloud. Start license validation (current time : 22-SEP-2023 16:14:25). License validation terminated. Time : 0.006s OPTIMAL; objective 41100.00 0 simplex iterations Completed. -----------------Display--------------- Primal Solution: x1 = 10.0000000 x2 = 10.0000000 x3 = 80.0000000 改造的单目标最优是:41099.99999999999 其中,种10亩作物A,种10亩作物B,种80亩作物C。 对应农场产值:126000元。 对应化肥使用量:3140千克。
3.权重影响分析和改进
不同的参数设置,结果会不一样,比如上面的方案,如果不变,我们选取不同的 的值,得到结果如下。
w1 |
评估目标值 |
A亩数 |
B亩数 |
C亩数 |
农场产值(元) |
化肥使用量(千克) |
1.0 |
126000 |
10 |
10 |
80 |
126000 |
3140 |
0.9 |
97700 |
10 |
10 |
80 |
126000 |
3140 |
0.8 |
69400 |
10 |
10 |
80 |
126000 |
3140 |
0.7 |
41100 |
10 |
10 |
80 |
126000 |
3140 |
0.65 |
29225 |
80 |
10 |
10 |
105000 |
2230 |
0.6 |
18400 |
80 |
10 |
10 |
105000 |
2230 |
0.55 |
7575 |
80 |
10 |
10 |
105000 |
2230 |
0.5 |
-3250 |
10 |
10 |
10 |
35000 |
830 |
0.4 |
-10900 |
10 |
10 |
10 |
35000 |
830 |
可以看出,不同的权重算出来的最优的决策是不一样的,甚至会出现无有效解的情况。
将多目标规划转换为单目标规划的加权和法存在以下缺点:
- 权重赋值主观性:对每个目标赋权的过程是主观的,可能无法准确反映目标的相对重要性。
- 信息丢失:加权和法将所有目标合并为一个单一目标,丢失了有关单个目标及其关系的信息。
- 灵活性有限:该方法假设目标之间存在线性关系,这在所有情况下可能不成立。
为了改进加权和法,可以考虑以下方法:
- 使用灵敏度分析:进行灵敏度分析,以确定不同权重赋值对最终解决方案的影响。这可以帮助确定产生理想结果的权重范围。
- 考虑非线性关系:如果目标之间存在非线性关系,则可以使用模糊规划或具有非线性函数的目标规划等替代方法来更准确地捕捉复杂性。
- 加入权衡:不是分配固定的权重,而是允许决策者指定目标之间的权衡。这可以通过目标规划或妥协规划等技术来实现。
总体而言,改进加权和法涉及增加更多的灵活性,捕捉目标之间的关系,并减少权重分配中的主观性。