赞
踩
多目标规划(Multi-objective programming)是指在一个优化问题中需要同时考虑多个目标函数的优化。在多目标规划问题中,目标函数之间通常是互相冲突的,即在优化一个目标函数的过程中,另一个或几个目标函数可能会受到影响。因此,多目标规划问题的目标是找到一个解x,使得在满足约束的前提下,所有目标函数达到一个相对满意的折中。
在现实世界中,我们经常面临需要在多个目标之间权衡的问题。例如:
场景 | 示例 |
---|---|
在经济发展与环境保护之间寻求平衡 | 如经济发展的目标函数可以是国内生产总值(GDP)的增长率,而环境保护的目标函数可以是污染物排放量的减少率。政府在制定政策时需要权衡这两个目标,以实现经济与环境的可持续发展。 |
在提高产品质量的同时降低成本 | 如设计一款手机,设计师需要在保证性能、续航时间、重量和成本等多个因素之间达到一个合适的平衡。 |
在投资理财里权衡收益和风险 | 如购买基金或股票,投资者需要考虑到不同产品的期望收益和风险,来购买合适风险等级的理财产品。 |
在供应链管理中的多目标 | 如库存成本、运输成本、客户满意度等。为了实现这些目标的平衡,公司需要优化其生产、采购、运输和分销策略。 |
商品定价的利润和销量的博弈 | 如电子产品定价,希望能得到最多的利润率,同时又希望能扩大销量,使得生产的单位成本降低。 |
对于这些多目标问题,如何折中以及如何求解是个难题,为此,学者们提出了许多方法将多目标规划问题转化为单目标规划问题,以便利用传统的单目标优化技术求解。如:加权和法(本篇)、指标法、层次法等。这些方法都有其优缺点,使用时需要根据具体问题的特点选择合适的方法。
值得注意的是,将多目标转化为单目标后求解得到的解可能不是多目标优化问题的帕累托最优解(没有其他解更优),因此在实际应用中需要权衡各种因素。
加权和法(Weighted Sum Method),是将多个目标函数通过赋予不同的权重值相加形成一个单一的目标函数。具体来说,假设有 m m m个目标函数 f i ( x ) , i = 1 , . . . , m f_i(x),i=1,...,m fi(x),i=1,...,m,我们可以构建一个新的目标函数 F ( x ) F(x) F(x)如下:
F ( x ) = w 1 ∗ f 1 ( x ) + w 2 ∗ f 2 ( x ) + . . . + w m ∗ f m ( x ) F(x) = w_1 * f_1(x) + w_2 * f_2(x) + ... + w_m * f_m(x) F(x)=w1∗f1(x)+w2∗f2(x)+...+wm∗fm(x)
其中 w i w_i wi表示第 i i i个目标函数的权重,通常要求所有权重之和为1。
通过调整权重值,可以得到不同的优化结果。
假设一个农场主希望优化其土地上的作物种植布局,需要在以下两个目标之间取得平衡:
农场主有两种作物可以种植:作物A、作物B、作物C。设 x 1 x_1 x1、 x 2 x_2 x2、 x 3 x_3 x3分别为种植作物A、B、C的面积。
我们可以使用加权和法将其转换为单目标优化问题。
在实际应用中,可以根据需求和数据的数量级来调整权重参数w1和w2的值,以平衡这两个目标。 假设农场主更关心农场产值,可以选择 w 1 = 0.7 w_1 = 0.7 w1=0.7。
接下来,我们使用 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千克。
不同的参数设置,结果会不一样,比如上面的方案,如果 c c c不变,我们选取不同的 w w w 的值,得到结果如下。
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 |
可以看出,不同的权重算出来的最优的决策是不一样的,甚至会出现无有效解的情况。
将多目标规划转换为单目标规划的加权和法存在以下缺点:
为了改进加权和法,可以考虑以下方法:
总体而言,改进加权和法涉及增加更多的灵活性,捕捉目标之间的关系,并减少权重分配中的主观性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。