运输问题的建模优化(二)——MindOpt

简介: 本系列将讲解多篇运输问题的示例,讲解对于不同的运输问题场景,用数学规划的方法进行线性规划问题建模,并进行求解得到解决方案。

本篇为第二篇,往期如下:

运输问题(一)

运输问题(二)本篇


1. 线性规划问题——运输问题

运输问题是线性规划问题里面常研究的一个问题。一般的运输问题是计算如何把某个商品从几个不同的产地,运输到几个不同的目的地,并知道运输量需求、不同运输路径的成本,或者不同目的地的需求等信息。

image.png


某公司在如下3个地方生产商品,并运送到另外7个地点进行销售,请问该公司如何配送运输的成本最低?

地点

产量

GARY

1400吨

CLEV

2600吨

PITT

2900吨


总共生产的6900吨商品将被运送到七个地点进行销售,每个地点的需求量各不相同,如图所示:

地点

需求

FRA

900吨

DET

1200吨

LAN

600吨

WIN

400吨

STL

1700吨

FRE

1100吨

LAF

1000吨


已知从产地运输货物到销售地的路线有如下几条,且每条路线的价格不相同:

线路

每吨价格

GARY , DET

14元

GARY , LAN

11元

GARY , STL

16元

GARY , LAF

8元

CLEV , FRA

27元

CLEV , DET

9元

CLEV , LAN

12元

CLEV , WIN

9元

CLEV , STL

26元

CLEV , LAF

17元

PITT , FRA

24元

PITT , WIN

13元

PITT , STL

28元

PITT , FRE

99元

2. 数学规划模型


以上问题,我们可以建立线性规划的数学模型如下。


集合


  • image.png


参数

image.png


决策变量


image.png


目标函数


image.png


约束

image.png

3. 使用MindOpt APL进行建模和求解


MindOpt建模语言(MindOpt Algebra Programming Language, MindOpt APL,简称为MAPL)是一种高效且通用的代数建模语言。当前主要用于数学规划问题的建模,并支持调用多种求解器求解。下面将演示如何使用MAPL将上面的数学模型公式和数据输入,生成一个求解器可求解的问题,再调用求解器去进行求解。


方法1:cell中直接输入建模代码运行


在求解数独问题时,MindOpt APL可以将其建模代码直接输入如下cell里运行。请注意内核(kernel)需要选MAPL。
其中,有一行我们增加do check的语句来进行验证,确保总产量等于总需求。

clear model;#清除model,多次run的时候使用
option modelname model/transport_02;#方便与方法2的中间文件生成在同一个目录
#---------建模-----------------
# transport_02.mapl
set ORIG := {"GARY", "CLEV", "PITT"};
set DEST := {"FRA",  "DET", "LAN", "WIN", "STL", "FRE", "LAF"};
set LINKS := {<"GARY","DET">, <"GARY","LAN">, <"GARY","STL">, <"GARY","LAF">,
             <"CLEV","FRA">, <"CLEV","DET">, <"CLEV","LAN">, <"CLEV","WIN">,
             <"CLEV","STL">, <"CLEV","LAF">,
             <"PITT","FRA">, <"PITT","WIN">, <"PITT","STL">, <"PITT","FRE">};
param supply[ORIG] := <"GARY"> 1400, <"CLEV"> 2600, <"PITT"> 2900;
param demand[DEST] := <"FRA"> 900,  <"DET"> 1200, <"LAN"> 600, <"WIN"> 400, <"STL"> 1700, <"FRE"> 1100, <"LAF"> 1000;
param cost[LINKS] := <"GARY","DET"> 14, <"GARY","LAN"> 11, <"GARY","STL"> 16, <"GARY","LAF">8,
             <"CLEV","FRA"> 27, <"CLEV","DET"> 9, <"CLEV","LAN"> 12, <"CLEV","WIN"> 9,
             <"CLEV","STL"> 26, <"CLEV","LAF"> 17,
             <"PITT","FRA"> 24 , <"PITT","WIN"> 13, <"PITT","STL"> 28, <"PITT","FRE"> 99;
check sum { <o> in ORIG } supply[o] == sum { <d> in DEST } demand[d];#增加do check的语句来进行验证,确保总产量等于总需求
var Trans[LINKS] >= 0;
minimize Total_Cost: sum  {<o, d> in LINKS } cost[o, d] * Trans[o, d];
subto Supply: 
   forall { <o> in ORIG }
       sum { <o, d> in LINKS } Trans[o, d] == supply[o];
subto Demand:
   forall {<d> in DEST }
       sum { <o, d> in LINKS } Trans[o, d] == demand[d];
#------------------------------
print "-----------------用MindOpt求解---------------";
option solver mindopt;   # 指定求解用MindOpt求解器
solve;               # 求解
display;
print "-----------------结果---------------";
print "最小成本 = ";
print sum { <o, d> in LINKS } cost[o, d] * Trans[o, d];

运行代码得到结果如下:

-----------------用MindOpt求解---------------
Running mindoptampl
wantsol=1
mip_integer_tolerance=1e-9
MindOpt Version 0.23.0 (Build date: 20221129)
Copyright (c) 2020-2022 Alibaba Cloud.
Start license validation (current time : 01-MAR-2023 20:38:43).
License validation terminated. Time : 0.003s
Model summary.
 - Num. variables     : 14
 - Num. constraints   : 9
 - Num. nonzeros      : 27
 - Bound range        : [4.0e+02,1.0e+20]
 - Objective range    : [8.0e+00,9.9e+01]
 - Matrix range       : [1.0e+00,1.0e+00]
Presolver started.
Presolver terminated. Time : 0.000s
Simplex method started.
Model fingerprint: =Y2djZ2dgdHZ
    Iteration       Objective       Dual Inf.     Primal Inf.     Time
            0     1.75100e+05      0.0000e+00      2.8000e+03     0.00s    
            2     2.01700e+05      0.0000e+00      0.0000e+00     0.00s    
Postsolver started.
Simplex method terminated. Time : 0.003s
OPTIMAL; objective 201700.00
2 simplex iterations
Completed.
Primal Solution:
Trans@<GARY,DET> = 0.000000000000000E+00
Trans@<GARY,LAN> = 0.000000000000000E+00
Trans@<GARY,STL> = 8.000000000000000E+02
Trans@<GARY,LAF> = 6.000000000000000E+02
Trans@<CLEV,DET> = 1.200000000000000E+03
Trans@<CLEV,LAN> = 6.000000000000000E+02
Trans@<CLEV,STL> = 0.000000000000000E+00
Trans@<CLEV,LAF> = 4.000000000000000E+02
Trans@<CLEV,FRA> = 0.000000000000000E+00
Trans@<CLEV,WIN> = 4.000000000000000E+02
Trans@<PITT,STL> = 9.000000000000000E+02
Trans@<PITT,FRA> = 9.000000000000000E+02
Trans@<PITT,WIN> = 0.000000000000000E+00
Trans@<PITT,FRE> = 1.100000000000000E+03
Dual Solution:
Supply_1 = 0.000000000000000E+00
Supply_2 = 9.000000000000000E+00
Supply_3 = 1.200000000000000E+01
Demand_1 = 1.200000000000000E+01
Demand_2 = 0.000000000000000E+00
Demand_3 = 3.000000000000000E+00
Demand_4 = 0.000000000000000E+00
Demand_5 = 1.600000000000000E+01
Demand_6 = 8.000000000000000E+00
-----------------结果---------------
最小成本 = 
201700

方法2:导入.mapl文件运行建模然后求解


上面时直接在cell中运行所有的脚本,我们也可以建立个新文档,将中间建模的代码保存为transport_02.mapl文件。然后运行如下code,结果同方法1。

clear model;#清除model,多次run的时候使用
#------------------------------
model model/transport_02.mapl;  #通过导入建模脚本.mapl文件进行建模
#------------------------------
print "-----------------用MindOpt求解---------------";
option solver mindopt;   # 指定求解用MindOpt求解器
solve;               # 求解
display;
print "-----------------结果---------------";
print "最小成本 = ";
print sum { <o, d> in LINKS } cost[o, d] * Trans[o, d];

4. 结果解析


display指令运行时,会打印出很多求解的结果,Trans@name  是决策变量的取值,后面的dual solution是对偶解的值。示意如下:


Primal Solution:
Trans@<GARY,DET> = 0.000000000000000E+00
Trans@<GARY,LAN> = 0.000000000000000E+00
Trans@<GARY,STL> = 8.000000000000000E+02
Trans@<GARY,LAF> = 6.000000000000000E+02
Trans@<CLEV,DET> = 1.200000000000000E+03
Trans@<CLEV,LAN> = 6.000000000000000E+02
Trans@<CLEV,STL> = 0.000000000000000E+00
Trans@<CLEV,LAF> = 4.000000000000000E+02
Trans@<CLEV,FRA> = 0.000000000000000E+00
Trans@<CLEV,WIN> = 4.000000000000000E+02
Trans@<PITT,STL> = 9.000000000000000E+02
Trans@<PITT,FRA> = 9.000000000000000E+02
Trans@<PITT,WIN> = 0.000000000000000E+00
Trans@<PITT,FRE> = 1.100000000000000E+03
Dual Solution:
Supply_1 = 0.000000000000000E+00
Supply_2 = 9.000000000000000E+00
Supply_3 = 1.200000000000000E+01
Demand_1 = 1.200000000000000E+01
Demand_2 = 0.000000000000000E+00
Demand_3 = 3.000000000000000E+00
Demand_4 = 0.000000000000000E+00
Demand_5 = 1.600000000000000E+01
Demand_6 = 8.000000000000000E+00
-----------------结果---------------
最小成本 = 
201700

同时,在最近建模的文件所在目录或option modelname指定的位置,会生成对应的文件.nl.sol。其中.nl文件是建模的问题模型文件,可被多数求解器识别,.sol文件中存储了求解结果solution。


从打印的结果,我们可以得到该公司的最低运输成本为201700元。并且此成本时,运输方案是:

Trans@<CLEV,DET> = 1.200000000000000E+03
Trans@<CLEV,LAF> = 4.000000000000000E+02
Trans@<CLEV,LAN> = 6.000000000000000E+02
Trans@<CLEV,WIN> = 4.000000000000000E+02
Trans@<GARY,LAF> = 6.000000000000000E+02
Trans@<GARY,STL> = 8.000000000000000E+02
Trans@<PITT,FRA> = 9.000000000000000E+02
Trans@<PITT,FRE> = 1.100000000000000E+03
Trans@<PITT,STL> = 9.000000000000000E+02

可以看出,在运输路径不一样的时候,会带来运输方案和最低成本不一样。


相关文章
|
达摩院 开发者 容器
「达摩院MindOpt」优化形状切割问题(MILP)
在制造业,高效地利用材料不仅是节约成本的重要环节,也是可持续发展的关键因素。无论是在金属加工、家具制造还是纺织品生产中,原材料的有效利用都直接影响了整体效率和环境影响。
「达摩院MindOpt」优化形状切割问题(MILP)
|
3月前
|
并行计算 算法 调度
【微电网优化】基于吸血水蛭优化器(BSLO)的微电网优化研究(Matlab代码实现)
【微电网优化】基于吸血水蛭优化器(BSLO)的微电网优化研究(Matlab代码实现)
114 3
|
机器学习/深度学习 算法 数据可视化
如果你的PyTorch优化器效果欠佳,试试这4种深度学习中的高级优化技术吧
在深度学习领域,优化器的选择对模型性能至关重要。尽管PyTorch中的标准优化器如SGD、Adam和AdamW被广泛应用,但在某些复杂优化问题中,这些方法未必是最优选择。本文介绍了四种高级优化技术:序列最小二乘规划(SLSQP)、粒子群优化(PSO)、协方差矩阵自适应进化策略(CMA-ES)和模拟退火(SA)。这些方法具备无梯度优化、仅需前向传播及全局优化能力等优点,尤其适合非可微操作和参数数量较少的情况。通过实验对比发现,对于特定问题,非传统优化方法可能比标准梯度下降算法表现更好。文章详细描述了这些优化技术的实现过程及结果分析,并提出了未来的研究方向。
439 1
|
人工智能 算法 调度
优化问题之如何选择合适的优化求解器
优化问题之如何选择合适的优化求解器
|
调度 决策智能
优化问题之优化求解器有哪些主要的评估特性
优化问题之优化求解器有哪些主要的评估特性
|
机器学习/深度学习 算法 测试技术
MindOpt APL向量化建模语法的介绍与应用(1)
向量化建模是一种高效的数学建模和编程技术,它涉及到对向量、矩阵和更高维数组进行操作,以实现操作的同时性和批量处理。在优化和数据分析等领域,向量化建模可以极大地提高计算效率,特别是当涉及到大量的重复计算时。由于向量化建模具有表述优势、操作优势、计算性能、可扩展性等优势,使得其适合于解决很大一类实际问题
|
测试技术 索引
MindOpt APL向量化建模语法的介绍与应用(2)
在数据科学、工程优化和其他科学计算领域中,向量和矩阵的运算是核心组成部分。MAPL作为一种数学规划语言,为这些领域的专业人员提供了强大的工具,通过向量式和矩阵式变量声明以及丰富的内置数学运算支持,大大简化了数学建模和优化问题的处理。在本文中,我们将探索MAPL的这些特性,并且通过示例来展示如何有效使用这些工具。
|
SQL 关系型数据库 数据库
ADBPG优化基础(一)ORCA优化器
AnalyticDB PostgreSQL(ADBPG)就是一堆并行的PostgreSQL?当然不是!ADBPG作为一个基于PostgreSQL的Massively Parallel Processing(MPP)全并行架构的分析型数据库,针对数据分析场景在很多方面得到了加强。如双优化器(GPORC...
ADBPG优化基础(一)ORCA优化器
|
达摩院 Linux 决策智能
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
### MindOpt 优化求解器月刊(2024年3月) - 发布亮点:MAPL建模语言升级至V2.4,支持云上无安装使用和向量化建模语法。 - 新增功能:Linux用户可本地安装`maplpy`,并支持Python与MAPL混编。 - 实例分享:介绍背包问题的组合优化,展示如何在限定容量下最大化收益。 - 用户投稿:探讨机票超售时的最优调派策略,以最小化赔付成本。 - 加入互动:官方钉钉群32451444,更多资源及。 [查看详细内容](https://opt.aliyun.com/)
258 0
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
|
机器学习/深度学习 达摩院
阿里达摩院MindOpt优化求解器-月刊(2024年4月)
【摘要】2024.04.30,阿里云发布了MindOpt优化求解器的新商品和功能。MindOpt现在已上架,提供超低价零售求解器,支持按需购买,可在阿里云平台上直接购买联网或不联网License。新版本V1.2发布,提升MILP性能,并增加PostScaling参数。此外,MindOpt Studio推出租户定制版,正处于邀测阶段。同时分享了使用MindOpt解决二分类SVM问题的案例。更多内容,可访问相关链接。
473 0