MAPL有两种求解方法,分别是在cell中直接输入建模代码运行、导入.mapl文件运行建模然后求解。
本文将用两个不同的例子(排产排程问题、数学算例)来分别展示MAPL语言建模及优化的两种方法。
云上建模求解平台
不需要下载软件,可以直接在平台上使用!而且有更多的案例提供参考哦!
如果您想要下载使用其他语言的话可以戳这里MindOpt优化求解器
MAPL
可以有效地连接数学模型和求解器的调用:
- 支持对线性规划、整数规划、0-1规划、二次规划、非线性规划、多目标规划、约束规划等多类问题的建模,且能对数学模型进行模型优化和预处理。
- 支持调用MindOpt Solver等优化求解器,方便切换求解器对比结果。
例题(一)
一位员工每天要负责处理a任务(生成零部件) 和b任务(组装产品)。其参与a任务的报酬为100元/小时,b任务的报酬为150元/小时。工厂要求该员工每天在每个任务上花费至少 3 个小时。已知该员工每天工作8小时(因此在 6 小时之外,可以自行决定 2 小时如何工作),那么他该如何在两项任务上分配时间以得到尽可能多的报酬?
- 以上问题可以被称为任务分配问题,也可以被视为一个简单的排产排程问题,由于该员工要决策时间分配,我们引入决策变量 Xa和 Xb用于表示该工人投入在任务和任务中的时长。由问题描述可知,这些变量需要满足Xa+Xb=8 和 Xa>=3,Xb>=3。
- 此外,该工人的目标是获得尽可能多的报酬。在定义如上三要素后,我们可以建立如下的数学规划问题:
- 决策变量: Xa,Xb
- 目标函数: maxmize 100Xa + 150Xb
- 约束: s.t. Xa + Xb = 8
- Xa>=3 , Xb>= 3
操作步骤
将以上数学规划问题用MAPL语法的代码表示,并另存为twoTask.mapl文件。
# twoTask.mapl var xa >= 3; # 用var来声明决策变量xa var xb >= 3; # 声明决策变量xb maximize Reward: 100 * xa + 150 * xb; # 用maximize来声明目标函数 subto Worker_time: xa + xb == 8; # 用subto来声明约束
#minimize来声明目标函数最小化,本例maximize是目标函数最大化
导入.mapl文件来运行
#步骤
#输入代码
clear model; # 清除模型的内存 model ./model/twoTask.mapl; # .mapl模型文件的路径,建模 do print "-----------------用MindOpt求解---------------"; option solver mindopt; # (可选)指定求解用的求解器,默认是MindOpt solve; # 求解 do print "-----------------Display---------------"; display; # 展示结果 do print "目标函数值 = "; do print 100 * xa + 150 * xb; # 更换求解器 do print "-----------------用CBC求解---------------"; option solver cbc; # (可选)指定求解用CBC求解器 solve; # 求解 do print "-----------------Display---------------"; display; # 展示结果 do print "目标函数值 = "; do print 100 * xa + 150 * xb;
#每行代码用分号结尾
求解的结果
-----------------用MindOpt求解--------------- Running mindoptampl .. wantsol=1 MindOpt Version 0.20.0 (Build date: 20220915) Copyright (c) 2020-2022 Alibaba Cloud. Start license validation (current time : 31-OCT-2022 10:24:55). License validation terminated. Time : 0.002s Model summary. - Num. variables : 2 - Num. constraints : 1 - Num. nonzeros : 2 - Bound range : [3.0e+00,1.0e+20] - Objective range : [1.0e+02,1.5e+02] - Matrix range : [1.0e+00,1.0e+00] Presolver started. Model has been fully presolved. Presolver terminated. Time : 0.000s Simplex method started. Postsolver started. Simplex method terminated. Time : 0.001s OPTIMAL; objective 1050.00 0 simplex iterations Completed. -----------------Display--------------- Primal Solution: xa = 3.000000000000000E+00 xb = 5.000000000000000E+00 Dual Solution: Worker_time = 1.500000000000000E+02 目标函数值 = + 1050 -----------------用CBC求解--------------- Running cbc .. CBC 2.10.5Completed. -----------------Display--------------- Primal Solution: xa = 3.000000000000000E+00 xb = 5.000000000000000E+00 Dual Solution: Worker_time = 1.500000000000000E+02 目标函数值 = + 1050
例题(二)
线性规划模型:
max x1 + 2 *x2 + 3 *x3 + x4
s.t. − x1 + x2 + 3 *x3 + 10 *x4 ≤ 20
x1 − 3 *x2 + x3 ≤ 30
x2 - 3.5 *x4 = 0
0 ≤ x1 ≤ 40
x2 ≥ 0
x3 ≥ 0
2 ≤ x4 ≤ 3
在cell中直接输入建模代码运行
clear model; #清除model,多次run的时候使用 option modelname model/test; #运行完代码之后会自动生成.nl和.sol文件 model是存放的地址,test是文件名 #-------------------------- # test.mapl var x1 >= 0; # 声明决策变量 var x2 >= 0; var x3 >= 0; var x4 >= 2; maximize Reward: x1 + 2 * x2 + 3 * x3 + x4; # 声明目标函数 subto c1: (-1) * x1 + x2 + 3 * x3 + 10 * x4 <= 20; # 声明约束 subto c2: x1 - 3 * x2 + x3 <= 30; subto c3: x2 - 3.5 * x4 == 0; subto c4: x1 <= 40; #因为决策变量的声明目前只能识别上界或者下界一个, subto c5: x4 <= 3; 所以我们把另一个下界或者上届放在声明约束这一组中。 #-------------------------- option solver mindopt; # (可选)指定求解用的求解器,默认是MindOpt solve; # 求解 do print "-----------------Display---------------"; display; # 展示结果 do print "目标函数值 = "; do print x1 + 2 * x2 + 3 * x3 + x4;
#每行一定要用分号结尾!!!
结果展示
Running mindoptampl .. wantsol=1 MindOpt Version 0.23.0 (Build date: 20221129) Copyright (c) 2020-2022 Alibaba Cloud. Start license validation (current time : 16-DEC-2022 15:16:12). License validation terminated. Time : 0.004s Model summary. - Num. variables : 4 - Num. constraints : 3 - Num. nonzeros : 9 - Bound range : [2.0e+00,1.0e+20] - Objective range : [1.0e+00,3.0e+00] - Matrix range : [1.0e+00,1.0e+01] Presolver started. Presolver terminated. Time : 0.001s Simplex method started. Model fingerprint: ==gZ3R2dkdnZ Iteration Objective Dual Inf. Primal Inf. Time 0 9.73004e+01 0.0000e+00 3.4501e+00 0.01s 1 8.90000e+01 0.0000e+00 0.0000e+00 0.01s Postsolver started. Simplex method terminated. Time : 0.008s OPTIMAL; objective 89.00 1 simplex iterations Completed. -----------------Display--------------- Primal Solution: x1 = 4.000000000000000E+01 x2 = 7.000000000000000E+00 x3 = 1.100000000000000E+01 x4 = 2.000000000000000E+00 Dual Solution: c1 = 1.000000000000000E+00 c2 = 0.000000000000000E+00 c3 = 1.000000000000000E+00 目标函数值 = + 89
联系我们
钉钉:y7r_yr2crky16
邮箱地址:solver.damo@list.alibaba-inc.com