python运输问题_Pyomo使用简介(二):运输问题

上次讲到了基础的求最优化问题,这次将会主要主要涉及到运输问题。

在Pyomo的使用过程中,模型分为Concrete和Abstract模型。

不论是什么模型,在建模的构建中,一些Model Components是必不可少的。

这些Components的定义方式会在之后有所涉及,其实在一些例题的学习过程中,也可以加深对于这些东西的理解。

今天的内容是关于运输问题。运输问题是一类经典运筹学中涉及到的问题,其包括:

一般运输问题,又称希契科克运输问题,简称H问题。

网络运输问题,又称图上运输问题,简称T问题。

最大流量问题,简称F问题。

最短路径问题,简称S问题。

任务分配问题,又称指派问题,简称A问题。

生产计划问题,又称日程计划问题,简称CPS问题。

运输问题的典型情况是研究单一品种物质的运输调度问题:设某种物品有m个产地A1,A2,···,Am,各产地的产量分别是a1,a2,···,am;有n个销地B1,B2,···,Bn,各个销地的销量分别为b1,b2,···,bn。假定从产地Ai(i=1,2,···,m)向销地Bj(j=1,2,···,n)运输单位物品的运价为cij,问怎么调运这些物品才能使总运费最小?

这里,我们有如下简例:运输问题表格

每行最后的Supply(5 7 3)代表供应商S1 S2 S3 最多能提供的数量上限,每列最后的Demand(7 3 5)代表D1 D2 D3需求量的下限。

表格中的数据代表每条路的消费。

M则为这条路消费过高,暂不考虑,可以理解为此路不通。

一.数学模型

根据这个表格我们可以首先构建数学模型。

The objective fuction(目标函数):

Constraints:

Supply:

Demand:

至此,数学模型构建完成,我们可以先开始编写data文件。

二. 数据文件编写

我习惯用AMPL文件格式来编写数据文件,这个是关于Ampl数据文件的编写的介绍(官方文件)。https://ampl.com/BOOK/CHAPTERS/12-data.pdf​ampl.com

其实关于这种运输问题的数据文件编写很简单,首先我们得先定义两个集合:

Set D 和 Set S,既代表了i(行),j(列),也代表了数据文件中的供求关系。

在这之后,需要定义参数。

param cost 可以表述表格中的数字。

param demand 和param supply 分别表述表格之外的每行/每列后面的数。

记得S/D的一一对应关系,不要写串行了。

而表格中的M该如何代替呢,只需要写一个稍大的数,在解算器计算的时候,这条路自然就会被判定不通,从何选择更优化的方式。

下面就是完整的数据代码了,记得后面重要的分号。

set D := D1 D2 D3 ;

set S := S1 S2 S3 ;

param cost :=

S1 D1 3

S1 D2 1

S1 D3 10

S2 D1 4

S2 D2 2

S2 D3 4

S3 D1 10

S3 D2 3

S3 D3 3

;

param demand :=

D1 7

D2 3

D3 5 ;

param supply :=

S1 5

S2 7

S3 3

;

三. 模型代码编写

第一行自然是熟悉的:

from pyomo.environ import *

接下来是全部的模型代码:模型主体代码

在之后便是结果输出部分:

结果输出部分

到这里运输问题的介绍基本上就结束了,这个只是一个很基础的运输问题,所以要考虑的东西不用很多,下一次可能会涉及到基础的Components定义方式或是更复杂的一些问题。还有就是推荐把环境,模型主体,结果输出或是结果可视化分开编写,这样看起来更简洁明了,也易于理解(老师告诉我的),我之前都是一大堆写在一个格子里面,系统报错也不知道哪错了.

你可能感兴趣的:(python运输问题)