运输问题的建模优化——MindOpt

简介: MindOpt在使用单纯形法求解线性规划问题这一功能上已经取得了不错的成绩,但在实际生活中,可能会遇到一些结构特殊的线性规划问题,这类问题可能存在比单纯形法更加简便的算法。本篇小编将介绍MindOpt如何求解这么一类特殊结构的线性规划问题——运输问题。

本篇是运输问题系列的第一篇,案例在云上建模求解平台可供复制学习。

问题描述

一般的运输问题是计算如何把某个商品从几个不同的产地,运输到几个不同的目的地,并知道运输量需求、不同运输路径的成本,或者不同目的地的需求等信息。问题如下:


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


在这个问题里,3个产地的商品产量如下:

地点

产量

GARY

1400吨

CLEV

2600吨

PITT

2900吨


以上的6900吨商品将被运送到7个地点进行销售,每个地点的需求量各不相同,如图所示:

地点

需求

FRA

900吨

DET

1200吨

LAN

600吨

WIN

400吨

STL

1700吨

FRE

1100吨

LAF

1000吨


已知从产地运输货物到销售地的每吨所需成本如下:

GARY

CLEV

PITT

FRA

39元/吨

27元/吨

24元/吨

DET

14元/吨

9元/吨

14元/吨

LAN

11元/吨

12元/吨

17元/吨

WIN

14元/吨

9元/吨

13元/吨

STL

16元/吨

26元/吨

28元/吨

FRE

82元/吨

95元/吨

99元/吨

LAF

8元/吨

17元/吨

20元/吨

数学规划模型

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


集合

  • 起点集合 image.png
  • 目的地集合 image.png


参数

  • 起点image.png的商品产量 image.png
  • 目的地 image.png的商品需求 image.png
  • 每吨商品从起点image.png运输至目的地 image.png所需成本 image.png


决策变量


起点image.png运送到目的地image.png的商品数量image.png


目标函数

工厂要最小化运输成本: image.png


约束


  • 起点image.png运送到各个目的地货物的总量等于其商品产量 image.png
  • 不同起点运送到目的地image.png的商品总量等于目的地商品的需求 image.png


使用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_01;#方便与方法2的中间文件生成在同一个目录
#---------建模-----------------
# transport_01.mapl
set ORIG := {"GARY", "CLEV", "PITT"};
set DEST := {"FRA",  "DET", "LAN", "WIN", "STL", "FRE", "LAF"};
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[ORIG * DEST] :=
       | "FRA",  "DET",  "LAN",  "WIN",  "STL",  "FRE",  "LAF"|
|"GARY"|  39,     14,     11,     14,     16,     82,     8   |
|"CLEV"|  27,     9,      12,     9,      26,     95,     17  |
|"PITT"|  24,     14,     17,     13,     28,     99,     20  |;
check sum {<o> in ORIG } supply[o] == sum {<d> in DEST } demand[d]; #增加do check的语句来进行验证,确保总产量等于总需求
var Trans[<o, d> in ORIG * DEST] >= 0;
minimize Total_Cost: sum {<o, d> in ORIG * DEST } cost[o, d] * Trans[o, d];
subto Supply: 
   forall { <o> in ORIG }
       sum {<d> in DEST } Trans[o, d] == supply[o];
subto Demand:
   forall { <d> in DEST }
       sum { <o> in ORIG } Trans[o, d] == demand[d];
#------------------------------
print "-----------------用MindOpt求解---------------";
option solver mindopt;   # 指定求解用MindOpt求解器
solve;               # 求解
display;
print "-----------------结果---------------";
print "最小成本 = ";
print sum { <o, d> in ORIG * DEST } 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:37:59).
License validation terminated. Time : 0.004s
Model summary.
 - Num. variables     : 21
 - Num. constraints   : 10
 - Num. nonzeros      : 42
 - 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.001s
Simplex method started.
Model fingerprint: ==gZ3V2Y3ZWZ3dmZ
    Iteration       Objective       Dual Inf.     Primal Inf.     Time
            0     0.00000e+00      0.0000e+00      1.3800e+04     0.01s    
            9     1.96200e+05      0.0000e+00      0.0000e+00     0.01s    
Postsolver started.
Simplex method terminated. Time : 0.007s
OPTIMAL; objective 196200.00
9 simplex iterations
Completed.
Primal Solution:
Trans@<GARY,FRA> = 0.000000000000000E+00
Trans@<GARY,DET> = 0.000000000000000E+00
Trans@<GARY,LAN> = 0.000000000000000E+00
Trans@<GARY,WIN> = 0.000000000000000E+00
Trans@<GARY,STL> = 3.000000000000000E+02
Trans@<GARY,FRE> = 1.100000000000000E+03
Trans@<GARY,LAF> = 0.000000000000000E+00
Trans@<CLEV,FRA> = 0.000000000000000E+00
Trans@<CLEV,DET> = 1.200000000000000E+03
Trans@<CLEV,LAN> = 6.000000000000000E+02
Trans@<CLEV,WIN> = 4.000000000000000E+02
Trans@<CLEV,STL> = 0.000000000000000E+00
Trans@<CLEV,FRE> = 0.000000000000000E+00
Trans@<CLEV,LAF> = 4.000000000000000E+02
Trans@<PITT,FRA> = 9.000000000000000E+02
Trans@<PITT,DET> = 0.000000000000000E+00
Trans@<PITT,LAN> = 0.000000000000000E+00
Trans@<PITT,WIN> = 0.000000000000000E+00
Trans@<PITT,STL> = 1.400000000000000E+03
Trans@<PITT,FRE> = 0.000000000000000E+00
Trans@<PITT,LAF> = 6.000000000000000E+02
Dual Solution:
Supply_1 = 8.000000000000004E+00
Supply_2 = 1.700000000000000E+01
Supply_3 = 2.000000000000000E+01
Demand_1 = 3.999999999999999E+00
Demand_2 = -7.999999999999999E+00
Demand_3 = -5.000000000000000E+00
Demand_4 = -7.999999999999999E+00
Demand_5 = 7.999999999999998E+00
Demand_6 = 7.399999999999999E+01
Demand_7 = 0.000000000000000E+00
-----------------结果---------------
最小成本 = 
196200

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


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

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

结果解析


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


Primal Solution:
Trans@<GARY,FRA> = 0.000000000000000E+00
Trans@<GARY,DET> = 0.000000000000000E+00
Trans@<GARY,LAN> = 0.000000000000000E+00
Trans@<GARY,WIN> = 0.000000000000000E+00
Trans@<GARY,STL> = 3.000000000000000E+02
Trans@<GARY,FRE> = 1.100000000000000E+03
Trans@<GARY,LAF> = 0.000000000000000E+00
Trans@<CLEV,FRA> = 0.000000000000000E+00
Trans@<CLEV,DET> = 1.200000000000000E+03
Trans@<CLEV,LAN> = 6.000000000000000E+02
Trans@<CLEV,WIN> = 4.000000000000000E+02
Trans@<CLEV,STL> = 0.000000000000000E+00
Trans@<CLEV,FRE> = 0.000000000000000E+00
Trans@<CLEV,LAF> = 4.000000000000000E+02
Trans@<PITT,FRA> = 9.000000000000000E+02
Trans@<PITT,DET> = 0.000000000000000E+00
Trans@<PITT,LAN> = 0.000000000000000E+00
Trans@<PITT,WIN> = 0.000000000000000E+00
Trans@<PITT,STL> = 1.400000000000000E+03
Trans@<PITT,FRE> = 0.000000000000000E+00
Trans@<PITT,LAF> = 6.000000000000000E+02
Dual Solution:
Supply_1 = 8.000000000000004E+00
Supply_2 = 1.700000000000000E+01
Supply_3 = 2.000000000000000E+01
Demand_1 = 3.999999999999999E+00
Demand_2 = -7.999999999999999E+00
Demand_3 = -5.000000000000000E+00
Demand_4 = -7.999999999999999E+00
Demand_5 = 7.999999999999998E+00
Demand_6 = 7.399999999999999E+01
Demand_7 = 0.000000000000000E+00
-----------------结果---------------
最小成本 = 
196200

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

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

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,FRE> = 1.100000000000000E+03
Trans@<GARY,STL> = 3.000000000000000E+02
Trans@<PITT,FRA> = 9.000000000000000E+02
Trans@<PITT,LAF> = 6.000000000000000E+02
Trans@<PITT,STL> = 1.400000000000000E+03

联系我们

钉钉群号:32451444

邮箱地址:solver.damo@list.alibaba-inc.com

更多更新通知:https://solver.damo.alibaba.com

相关文章
|
6月前
|
达摩院 开发者 容器
「达摩院MindOpt」优化形状切割问题(MILP)
在制造业,高效地利用材料不仅是节约成本的重要环节,也是可持续发展的关键因素。无论是在金属加工、家具制造还是纺织品生产中,原材料的有效利用都直接影响了整体效率和环境影响。
「达摩院MindOpt」优化形状切割问题(MILP)
|
1月前
|
机器学习/深度学习 算法 数据可视化
如果你的PyTorch优化器效果欠佳,试试这4种深度学习中的高级优化技术吧
在深度学习领域,优化器的选择对模型性能至关重要。尽管PyTorch中的标准优化器如SGD、Adam和AdamW被广泛应用,但在某些复杂优化问题中,这些方法未必是最优选择。本文介绍了四种高级优化技术:序列最小二乘规划(SLSQP)、粒子群优化(PSO)、协方差矩阵自适应进化策略(CMA-ES)和模拟退火(SA)。这些方法具备无梯度优化、仅需前向传播及全局优化能力等优点,尤其适合非可微操作和参数数量较少的情况。通过实验对比发现,对于特定问题,非传统优化方法可能比标准梯度下降算法表现更好。文章详细描述了这些优化技术的实现过程及结果分析,并提出了未来的研究方向。
25 1
|
4月前
|
人工智能 算法 调度
优化问题之如何选择合适的优化求解器
优化问题之如何选择合适的优化求解器
|
4月前
|
调度 决策智能
优化问题之优化求解器有哪些主要的评估特性
优化问题之优化求解器有哪些主要的评估特性
|
6月前
|
机器学习/深度学习 算法 测试技术
MindOpt APL向量化建模语法的介绍与应用(1)
向量化建模是一种高效的数学建模和编程技术,它涉及到对向量、矩阵和更高维数组进行操作,以实现操作的同时性和批量处理。在优化和数据分析等领域,向量化建模可以极大地提高计算效率,特别是当涉及到大量的重复计算时。由于向量化建模具有表述优势、操作优势、计算性能、可扩展性等优势,使得其适合于解决很大一类实际问题
|
6月前
|
测试技术 索引
MindOpt APL向量化建模语法的介绍与应用(2)
在数据科学、工程优化和其他科学计算领域中,向量和矩阵的运算是核心组成部分。MAPL作为一种数学规划语言,为这些领域的专业人员提供了强大的工具,通过向量式和矩阵式变量声明以及丰富的内置数学运算支持,大大简化了数学建模和优化问题的处理。在本文中,我们将探索MAPL的这些特性,并且通过示例来展示如何有效使用这些工具。
|
6月前
|
存储 达摩院 调度
「达摩院MindOpt」优化FlowShop流水线作业排班问题
在企业在面临大量多样化的生产任务时,如何合理地安排流水线作业以提高生产效率及确保交货期成为了一个重要的问题。
「达摩院MindOpt」优化FlowShop流水线作业排班问题
|
6月前
|
SQL 关系型数据库 数据库
ADBPG优化基础(一)ORCA优化器
AnalyticDB PostgreSQL(ADBPG)就是一堆并行的PostgreSQL?当然不是!ADBPG作为一个基于PostgreSQL的Massively Parallel Processing(MPP)全并行架构的分析型数据库,针对数据分析场景在很多方面得到了加强。如双优化器(GPORC...
ADBPG优化基础(一)ORCA优化器
|
6月前
|
人工智能 自然语言处理 达摩院
MindOpt 云上建模求解平台:多求解器协同优化
数学规划是一种数学优化方法,主要是寻找变量的取值在特定的约束情况下,使我们的决策目标得到一个最大或者最小值的决策。
|
达摩院 调度
使用达摩院MindOpt优化交通调度_最大化通行量—线性规划问题
在数学规划中,网络流问题是指一类基于网络模型的流量分配问题。网络流问题的目标是在网络中分配资源,使得网络的流量满足一定的限制条件,并且使得某些目标函数最小或最大化。网络流问题通常涉及一个有向图,图中每个节点表示一个资源,每条边表示资源之间的关系。边上有一个容量值,表示该边上最多可以流动的资源数量。流量从源节点开始流出,经过一系列中间节点,最终到达汇节点。在这个过程中,需要遵守一定的流量守恒和容量限制条件。