「达摩院MindOpt」用于多目标规划(目标规划法)

简介: 前篇我们讲述了使用加权和法对多目标规划问题的优化,本篇将讲述使用目标规划法。

前篇我们讲述了使用加权和法对多目标规划问题的优化,本篇将讲述使用目标规划法。

1. 原理

目标规划法,首先是为每个目标函数设定一个期望值(目标值)image.png

方案1: 然后构建一个新的目标函数image.png,其形式如下:image.png其中,image.png表示第image.png个目标函数的权重。通过最小化image.png,可以在满足各种约束的同时实现多目标的调和。这个距离也可以通过 image.png 范数来表达。此方法有些类似加权和法。


方案2:我们还可以把目标设定进约束里(类似层次分析法),将优先级高的目标设置为约束条件,从而降低目标函数的个数。即在约束里面增加 image.png

2.举例子

同样用之前的农场主问题:

假设一个农场主希望优化其土地上的作物种植布局,需要在以下两个目标之间取得平衡:

  • 目标1:最大化农场产值(单位:元);
  • 目标2:最小化化肥使用量(单位:千克)。

农场主有两种作物可以种植:作物A、作物B、作物C。设image.png分别为种植作物A、B、C的面积。

  • 已知A、B、C每亩作物的产值分别为1000元、1200元、1300元。则,目标1的函数:image.png
  • 每亩A、B、C作物分别需要化肥:20千克、30千克、33千克。则,目标2的函数:image.png
  • 总种植面积不超过100亩。即,image.png
  • 3种作物至少每个需要种10亩。

2.1. 设定目标值

在不清楚设什么目标值时候,我们还可以通过求解各个单目标的最优解,观察值,然后设目标值。

如我们使用 MindOpt APL建模语言对这个问题进行建模,并调用 MindOpt Solver 来求解。代码如下:

# ==================目标1=======================
clear model;
# ------建模-------Start-----
# model_2_1.mapl
# 变量
var x1 >= 10;
var x2 >= 10;
var x3 >= 10;
# 目标
maximize obj: (1000 * x1 + 1200 * x2 + 1300 * x3);
# 定义约束条件
subject to constraint1: x1 + x2 + x3 <= 100;
# ------建模-------End-----
#求解
option solver mindopt;     # (可选)指定求解用的求解器,默认是MindOpt
option mindopt_options 'print=0'; #设置求解器输出级别,减少过程打印
solve;         # 求解
# 结果打印和检查结果
print "-----------------Display---------------";
display; 
print "其中,种", x1,"亩作物A,种",x2,"亩作物B,种",x3,"亩作物C。";
print "对应农场产值:", (1000 * x1 + 1200 * x2 + 1300 * x3),"千克。";
# ==================目标2=======================
clear model;
# ------建模-------Start-----
# model_2_2.mapl
# 变量
var x1 >= 10;
var x2 >= 10;
var x3 >= 10;
# 目标
minimize obj: (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 "其中,种", x1,"亩作物A,种",x2,"亩作物B,种",x3,"亩作物C。";
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 : 13-OCT-2023 15:54:20).
License validation terminated. Time : 0.004s
OPTIMAL; objective 126000.00
0 simplex iterations
Completed.
-----------------Display---------------
Primal Solution:
      x1 = 10.0000000
      x2 = 10.0000000
      x3 = 80.0000000
其中,种10亩作物A,种10亩作物B,种80亩作物C。
对应农场产值:126000千克。
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 : 13-OCT-2023 15:54:20).
License validation terminated. Time : 0.004s
OPTIMAL; objective 830.00
0 simplex iterations
Completed.
-----------------Display---------------
Primal Solution:
      x1 = 10.0000000
      x2 = 10.0000000
      x3 = 10.0000000
其中,种10亩作物A,种10亩作物B,种10亩作物C。
对应化肥使用量:830千克。

从上面可以看出,目标1的最优值是126000千克,目标2的最优值是不种植多余的,只消耗830千克。接下来我们把这两个数值作为目标。

2.2. 方法1:设定优化目标距离

考虑到变量的取值域,这里我们直接采用(大数-小数)的方式来表示距离。

然后类似加权和法,我们引入两个权重参数,分别表示农场产值和化肥使用量的重要程度,且满足,然后考虑两个目标的单位和数据量级不一样,我们引入参数来给目标2调整数量级。

MAPL代码如下:

# ==================设定目标转换后=======================
clear model;
# ------建模-------Start-----
# model_2_3.mapl
# 变量
var x1 >= 10;
var x2 >= 10;
var x3 >= 10;
# 权重参数
param w1 = 0.7; # 假设农场主更关心农场产值
param w2 = 1 - w1;
param c = 50; # 根据数量级差异 1000/20 = 50来简单预估
# 目标
minimize obj:   w1 *(126000 - (1000 * x1 + 1200 * x2 + 1300 * x3)) + c*w2*((20 * x1 + 30 * x2 + 33 * x3) - 830);
# 定义约束条件
subject to constraint1: x1 + x2 + x3 <= 100;
# ------建模-------End-----
#求解
option solver mindopt;     # (可选)指定求解用的求解器,默认是MindOpt
option mindopt_options 'print=0'; #设置求解器输出级别,减少过程打印
solve;         # 求解
# 结果打印和检查结果
print "-----------------Display---------------";
display;
print "改造的单目标最优是:",w1 *(126000 - (1000 * x1 + 1200 * x2 + 1300 * x3)) + c*w2*((20 * x1 + 30 * x2 + 33 * x3) - 830);
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 : 13-OCT-2023 15:55:49).
License validation terminated. Time : 0.006s
OPTIMAL; objective 34650.00
0 simplex iterations
Completed.
-----------------Display---------------
Primal Solution:
      x1 = 10.0000000
      x2 = 10.0000000
      x3 = 80.0000000
改造的单目标最优是:34650.00000000001
其中,种10亩作物A,种10亩作物B,种80亩作物C。
对应农场产值:126000元。
对应化肥使用量:3140千克。

从上面可以看出,在本案例里面,目标改造与前面的加权和方法类似。

2.3. 方案2:将目标作为约束来求解最优

除了改造进目标,我们还可以改进约束里。观察上面的目标函数的最优值们:

  • 最优是:种10亩作物A,种10亩作物B,种80亩作物C。对应农场产值:126000千克。
  • 最优是:种10亩作物A,种10亩作物B,种10亩作物C。对应化肥使用量:830千克。

这里我们将的最优值作为约束,改造后如下:

# ==================设定目标转换后=======================
clear model;
# ------建模-------Start-----
# model_2_3.mapl
# 变量
var x1 >= 10;
var x2 >= 10;
var x3 >= 10;
# 目标
minimize obj: 20 * x1 + 30 * x2 + 33 * x3; # 仅有F2(x)
# 定义约束条件
subject to constraint1: x1 + x2 + x3 <= 100;
subject to constraint_new: (1000 * x1 + 1200 * x2 + 1300 * x3) == 126000 ;
# ------建模-------End-----
#求解
option solver mindopt;     # (可选)指定求解用的求解器,默认是MindOpt
option mindopt_options 'print=0'; #设置求解器输出级别,减少过程打印
solve;         # 求解
# 结果打印和检查结果
print "-----------------Display---------------";
display;
print "其中,种{:.9g}亩作物A,种{:.9g}亩作物B,种{:.9g}亩作物C。" % x1,x2,x3;
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 : 13-OCT-2023 15:56:49).
License validation terminated. Time : 0.006s
OPTIMAL; objective 3140.00
3 simplex iterations
Completed.
-----------------Display---------------
Primal Solution:
      x1 = 10.0000000
      x2 = 10.0000000
      x3 = 80.0000000
其中,种10亩作物A,种10亩作物B,种80亩作物C。
对应农场产值:126000元。
对应化肥使用量:3140千克。

如果是把第二个目标的最优值设置进约束,结果就有些不合适了。如下:

# ==================设定目标转换后=======================
clear model;
# ------建模-------Start-----
# model_2_3.mapl
# 变量
var x1 >= 10;
var x2 >= 10;
var x3 >= 10;
# 目标
minimize obj:  (1000 * x1 + 1200 * x2 + 1300 * x3); # 仅有F1(x)
# 定义约束条件
subject to constraint1: x1 + x2 + x3 <= 100;
subject to constraint_new: (20 * x1 + 30 * x2 + 33 * x3) == 830 ;
# ------建模-------End-----
#求解
option solver mindopt;     # (可选)指定求解用的求解器,默认是MindOpt
option mindopt_options 'print=0'; #设置求解器输出级别,减少过程打印
solve;         # 求解
# 结果打印和检查结果
print "-----------------Display---------------";
display;
print "其中,种{:.9g}亩作物A,种{:.9g}亩作物B,种{:.9g}亩作物C。" % x1,x2,x3;
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 : 29-AUG-2023 11:35:49).
License validation terminated. Time : 0.007s
OPTIMAL; objective 35000.00
0 simplex iterations
Completed.
-----------------Display---------------
Primal Solution:
      x1 = 10.0000000
      x2 = 10.0000000
      x3 = 10.0000000
其中,种10亩作物A,种10亩作物B,种10亩作物C。
对应农场产值:35000元。
对应化肥使用量:830千克。

3.分析和改进

从上面可以看到:

  • 直接设置进目标里面,效果会和加权和法类似。
  • 如果设置进约束,是个不一样的思路,也可以得到解。其原理类似设置不同目标的优先级。但是选用不同的目标进约束会导致效果并不合适。

因此多目标转换时候,建议多尝试。可以考虑下述改进思路:

  • 结合其他方法:例如与加权法结合,可以在考虑目标优先级的同时,更好地平衡各个目标之间的权重。
  • 求解多个解决方案:尝试使用不同的目标优先级或权重组合,以生成多个解决方案。这些解决方案可以提供多个选择方向,有助于在实际应用中找到满意的平衡点。
  • 使用交互式方法:在实际应用中,可以使用交互式方法,让决策者参与到优化过程中。在每一轮迭代中,决策者可以根据当前解决方案提供反馈。根据决策者的反馈,可以调整目标优先级或权重,从而在多轮迭代中逐渐找到满意的解决方案。
相关文章
|
5月前
|
达摩院 供应链 安全
光储荷经济性调度问题【数学规划的应用(含代码)】阿里达摩院MindOpt
本文介绍使用MindOpt工具优化光储荷经济性调度的数学规划问题。光储荷经济性调度技术旨在最大化能源利用率和经济效益,应用场景包括分布式光伏微网、家庭能源管理系统、商业及工业用电、电力市场参与者等。文章详细阐述了如何通过数学规划方法解决虚拟电厂中的不确定性与多目标优化难题,并借助MindOpt云建模平台、MindOpt APL建模语言及MindOpt优化求解器实现问题建模与求解。最终案例展示了如何通过合理充放电策略减少37%的电费支出,实现经济与环保双重效益。读者可通过提供的链接获取完整源代码。
|
5月前
|
达摩院 BI 索引
切割问题【数学规划的应用(含代码)】阿里达摩院MindOpt
本文主要讲述了使用MindOpt工具对切割问题进行优化的过程与实践。切割问题是指从一维原材料(如木材、钢材等)中切割出特定长度的零件以满足不同需求,同时尽可能减少浪费的成本。文章通过实例详细介绍了如何使用MindOpt云上建模求解平台及其配套的MindOpt APL建模语言来解决此类问题,包括数学建模、代码实现、求解过程及结果分析等内容。此外,还讨论了一维切割问题的应用场景,并对其进行了扩展,探讨了更复杂的二维和三维切割问题。通过本文的学习,读者能够掌握利用MindOpt工具解决实际切割问题的方法和技术。
|
5月前
|
达摩院 算法 安全
智慧楼宇多目标调度问题【数学规划的应用(含代码)】阿里达摩院MindOpt
本文探讨了使用MindOpt工具优化智慧楼宇的多目标调度问题,特别是在虚拟电厂场景下的应用。智慧楼宇通过智能化技术综合考虑能耗、舒适度等多目标,实现楼宇设备的有效管理和调度。虚拟电厂作为多能源聚合体,能够参与电力市场,提供调峰、调频等辅助服务。文章介绍了如何使用MindOpt云上建模求解平台及MindOpt APL建模语言对楼宇多目标调度问题进行数学建模和求解,旨在通过优化储能设备的充放电操作来最小化用电成本、碳排放成本和功率变化成本,从而实现经济、环保和电网稳定的综合目标。最终结果显示,在使用储能设备的情况下,相比不使用储能设备的情形,成本节约达到了约48%。
|
5月前
|
达摩院 供应链 JavaScript
网络流问题--仓储物流调度【数学规划的应用(含代码)】阿里达摩院MindOpt
本文通过使用MindOpt工具优化仓储物流调度问题,旨在提高物流效率并降低成本。首先,通过考虑供需匹配、运输时间与距离、车辆容量、仓库储存能力等因素构建案例场景。接着,利用数学规划方法,包括线性规划和网络流问题,来建立模型。在网络流问题中,通过定义节点(资源)和边(资源间的关系),确保流量守恒和容量限制条件下找到最优解。文中还详细介绍了MindOpt Studio云建模平台和MindOpt APL建模语言的应用,并通过实例展示了如何声明集合、参数、变量、目标函数及约束条件,并最终解析了求解结果。通过这些步骤,实现了在满足各仓库需求的同时最小化运输成本的目标。
|
6月前
|
达摩院 安全 调度
网络流问题--交通调度【数学规划的应用(含代码)】阿里达摩院MindOpt
本文探讨了如何利用数学规划工具MindOpt解决交通调度问题。交通调度涉及网络流分析,考虑道路容量、车辆限制、路径选择等因素,以实现高效运行。通过建立数学模型,利用MindOpt云平台和建模语言MAPL,设定流量最大化目标并确保流量守恒,解决实际的调度问题。案例展示了如何分配车辆从起点到终点,同时满足道路容量约束。MindOpt Studio提供在线开发环境,支持模型构建和求解,帮助优化大规模交通调度。
|
6月前
|
达摩院
人员排班【数学规划的应用(含代码)】阿里达摩院MindOpt
本文介绍了使用阿里巴巴达摩院的MindOpt工具解决人员排班的数学规划问题。人员排班在多个行业中至关重要,如制造业、医疗、餐饮和零售等。问题涉及多种约束,包括工作需求、员工能力、工作时间限制、连续工作天数及公平性。通过MindOpt云建模平台和建模语言MindOpt APL,建立数学模型并编写代码来解决最小化总上班班次的问题。案例中展示了如何声明集合、参数、变量和约束,并给出了部分代码示例。最后,通过MindOpt求解器得到最优解,并将结果输出到CSV文件中。
|
8月前
|
达摩院 Linux 决策智能
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
### MindOpt 优化求解器月刊(2024年3月) - 发布亮点:MAPL建模语言升级至V2.4,支持云上无安装使用和向量化建模语法。 - 新增功能:Linux用户可本地安装`maplpy`,并支持Python与MAPL混编。 - 实例分享:介绍背包问题的组合优化,展示如何在限定容量下最大化收益。 - 用户投稿:探讨机票超售时的最优调派策略,以最小化赔付成本。 - 加入互动:官方钉钉群32451444,更多资源及。 [查看详细内容](https://opt.aliyun.com/)
133 0
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
|
8月前
|
达摩院 Linux API
阿里达摩院MindOpt求解器V1.1新增C#接口
阿里达摩院MindOpt求解器发布最新版本V1.1,增加了C#相关API和文档。优化求解器产品是求解优化问题的专业计算软件,可广泛各个行业。阿里达摩院从2019年投入自研MindOpt优化求解器,截止目前经历27个版本的迭代,取得了多项国内和国际第一的成绩。就在上个月,2023年12月,在工信部产业发展促进中心等单位主办的首届能源电子产业创新大赛上,MindOpt获得电力用国产求解器第一名。本文将为C#开发者讲述如何下载安装MindOpt和C#案例源代码。
253 3
阿里达摩院MindOpt求解器V1.1新增C#接口
|
8月前
|
达摩院 开发者 容器
「达摩院MindOpt」优化形状切割问题(MILP)
在制造业,高效地利用材料不仅是节约成本的重要环节,也是可持续发展的关键因素。无论是在金属加工、家具制造还是纺织品生产中,原材料的有效利用都直接影响了整体效率和环境影响。
「达摩院MindOpt」优化形状切割问题(MILP)
|
8月前
|
机器学习/深度学习 达摩院
阿里达摩院MindOpt优化求解器-月刊(2024年4月)
【摘要】2024.04.30,阿里云发布了MindOpt优化求解器的新商品和功能。MindOpt现在已上架,提供超低价零售求解器,支持按需购买,可在阿里云平台上直接购买联网或不联网License。新版本V1.2发布,提升MILP性能,并增加PostScaling参数。此外,MindOpt Studio推出租户定制版,正处于邀测阶段。同时分享了使用MindOpt解决二分类SVM问题的案例。更多内容,可访问相关链接。
169 0