陆路运输问题.docx
《陆路运输问题.docx》由会员分享,可在线阅读,更多相关《陆路运输问题.docx(35页珍藏版)》请在冰豆网上搜索。
陆路运输问题
第10章
陆路运输
在公路和铁路运输以及第11章中将要研究的航空运输中,都存在很多优化问题。
这陆路运输网络与航空运输网络之间的主要区别在于陆路运输的网络更为密集,参与者更多。
边境的开放和运输商之间的强烈的竞争都使得优化方法成为降低运输成本从而能够从竞争中胜出得关键因素。
第10.1节将给出一个车辆租赁问题,在其中为保持理想的车队大小,需要将汽车在各个租赁代理处之间转运,并需要使费用最小。
在10.2节中描述了一个在不同运输方式之间进行分配的问题:
需要将给定量的货物从网络中的一个结点运输到另一个结点,在此网络中存在多种运输方式,每种方式的成本和运输能力均已知。
第10.3节将处理一个战略层次的经典问题,即如何为仓库选址才能够最小化开办仓库和向客户运输的成本。
在10.4节中,我们将解决一个最优化燃油运输路径的问题。
在第10.5节中描述了一个多种运输方式组合(联合运输)的问题,此问题与10.2节中的问题的不同之处在于更换运输方式时也会带来一定费用支出。
本章的最后一节中将研究一个如何对整个车队进行规划的问题。
10.1汽车租赁
有一家小型汽车租赁公司,此公司有94辆可供出租的汽车,分布于10个代理
点中。
每个代理点的位置都将以地理坐标X和Y的形式给出,单位为千米。
我们假定两个代理点之间的距离约为它们之间欧氏距离(即最短距离)的1.3倍。
下表给出了各个代理点的位置坐标,以及第二天早晨汽车租赁的需求量和前一天晚上各个代理点拥有的汽车数。
表格10.1:
车辆租赁代理点信息
代理点
1
2
3
4
5
6
7
8
9
19
X坐标
0
20
18
30
35
33
5
5
11
2
Y坐标
0
20
10
12
0
25
27
10
0
15
汽车需求量
10
6
8
11
9
7
15
7
9
12
当前拥有量
8
13
4
8
12
2
14
11
15
7
假定汽车转运的成本为每辆车每千米0.50欧元,请找出如何在各个代理点之间
调度分配汽车才能够满足各处的需求,并且使转运成本最低。
10.1.1模型的数学表达
对于代理点集合AGENTS中的每个代理点a我们都用Xa和Ya表示其地理坐标。
REQa表示在代理点a处汽车的需求量,STOCKa为此代理点当前的汽车保有
量。
这两个值之间的差值即表示此处汽车数富余(如果为正数值),或者不足量(负
值)。
此问题即找出车辆富余的代理点集合EXCESS和车辆不足的代理点集合
NEED之间的最小费用车辆流。
由于总富余量等于总不足量,因此必定存在能够满足各处需求的车辆流。
首先,我们定义变量moveab表示在两个代理点之间的车辆流:
∀a∈EXCESS,b∈NEED:
moveab∈N
(10.1.1)
每个车辆富余的代理点都需要将其富余的车辆发送到别处(10.1.2),每个车辆
不足的代理点都需要从别处接受到数量等于不足数量的车辆(10.1.3)。
∀a∈EXCESS:
∀b∈NEED:
∑moveab=STOCKa−REQa
b∈NEED
∑moveab=REQb−STOCKb
(10.1.2)
(10.1.3)
a∈EXCESS
目标函数即最小化总转运成本(10.1.4),其中COST表示每辆车每转运1千米
的成本,DISTab表示在两个代理点a和b之间的距离。
minimize∑∑COST⋅DISTab⋅moveab
a∈EXCESSb∈NEED
(10.1.4)
最小费用流问题是一个运输问题(transportationproblem),其特征在于都有一
组来源的,拥有数量有限的资源,以及一组需要此资源的目的地。
对于最小费用流问题,通常可以采用单纯形算法求解线性规划从而找到整数解。
因此约束条件(10.1.1)可以用简单的非负约束条件取代。
10.1.2模型实现
上述数学模型可以实现为下面的Mosel程序。
在读入数据之后,我们首先检查当前汽车的总保有量是否等于汽车的需求量,如果不相等,则停止此程序。
如果相等,则分别找出车辆富余和车辆不足的代理点集合。
在下面声明决策变量数组和距离矩阵时将用到这两个集合。
model"E-1Carrental"uses"mmxprs"
declarations
AGENTS=1..10!
汽车租赁代理点
REQ:
array(AGENTS)ofinteger!
汽车需求数量
STOCK:
array(AGENTS)ofinteger!
当前汽车保有量
X,Y:
array(AGENTS)ofinteger!
租赁代理点位置坐标COST:
real!
转运一辆汽车每千米成本NEED:
setofinteger!
汽车数不足的代理点EXCESS:
setofinteger!
汽车数富余的代理点
end-declarations
initializationsfrom‘e1carrent.dat'REQSTOCKXYCOST
end-initializations
ifsum(ainAGENTS)(STOCK(a)-REQ(a))<>0thenwriteln("Problemisinfeasible")
exit(0)
end-if
!
计算出汽车数富余和汽车数不足的代理点集合
forall(ainAGENTS)
ifSTOCK(a)-REQ(a)<0then
NEED+={a}
elifSTOCK(a)-REQ(a)>0then
EXCESS+={a}
end-if
finalize(NEED);finalize(EXCESS)
declarations
DIST:
array(EXCESS,NEED)ofreal!
代理点之间的距离
move:
array(EXCESS,NEED)ofmpvar!
代理点之间的汽车转运情况
end-declarations
!
计算代理点之间的距离
forall(ainEXCESS,binNEED)
DIST(a,b):
=1.3*sqrt((X(a)-X(b))^2+(Y(a)-Y(b))^2)
!
目标函数:
总转运成本
Cost:
=sum(ainEXCESS,binNEED)COST*DIST(a,b)*move(a,b)
!
汽车数富余的代理点
forall(ainEXCESS)sum(binNEED)move(a,b)=STOCK(a)-REQ(a)
!
汽车数不足的代理点
forall(binNEED)sum(ainEXCESS)move(a,b)=REQ(b)-STOCK(b)
forall(ainEXCESS,binNEED)move(a,b)is_integer
!
求解此问题
minimize(Cost)
end-model
在这个模型实现中我们使用了指数运算符^。
注意,我们也可以用r^0.5来表示
r,这与使用预定义的Mosel函数sqrt(r)是相同的。
10.1.3结果
优化器将计算出最低总转运成本为152.64欧元。
下表列出了达到此最低成本时在代理点之间转运汽车的具体方案,此方案能够得到我们所需的最终汽车分布。
表格10.2:
车辆转运的最优方案
->
1
3
4
6
7
10
富余量
2
0
1
0
5
1
0
7
5
0
0
3
0
0
0
3
8
0
0
0
0
0
4
4
9
2
3
0
0
0
1
6
不足量
2
4
3
5
1
5
10.2选择运输方式
在法国西南部有一家公司,这家公司需要将180吨存放于仓库D1到D4中的化
学产品运输到3个回收中心C1,C2和C3。
仓库D1到D4分别储存有50,40,35,和65吨化学产品,总计为190吨。
可以选用两种运输方式:
公路运输和铁路运输。
仓库D1只能通过公路向回收中心C1和C2进行运输,运费分别为12欧元/吨和14欧元/吨。
仓库D2只能向回收中心C2运输,可以选择通过铁路或公路,运费分别为
12欧元/吨和14欧元/吨。
仓库D3可以通过公路向回收中心C2运输(9欧元/吨),或通过铁路或公路向回收中心C3运输,运费分别为4欧元/吨和5欧元/吨。
仓库D4可以通过铁路或公路向回收中心C2运输,运费分别为11欧元/吨和14欧元/吨,或者通过铁路或公路向回收中心C3运输,运费分别为10欧元/吨和14欧元/吨。
此公司与铁路公司签订的化学物品运输合同规定,每次运输量至少应为10吨,最多为50吨。
除了标准的安全规章之外,对公路运输不存在其他特殊的限制。
那么此公司应如何运输这180吨化学物品才能够使总运费最低?
10.2.1模型的数学表达
我们将把此问题建模为一个具有固定总通过量的最小费用流问题(minimumcostflowproblem)。
我们先来构造一幅图G=(NODES,ARCS)。
首先向结点集合
NODES中加入一组结点,代表各个仓库,然后再加入一组结点,代表回收中心(参照图10.1)。
弧集合ARCS中包含了在所有仓库和回收中心之间可能存在的连接。
运
输方案即对应于图G中的一个流,即在每一条弧(i,j)上的流flowij。
弧(i,j)具有一
个最小通过量MINCAPij(除铁路运输其他均为0),一个最大通过量MAXCAPij(即运力上限,除铁路运输外均为无穷大),以及每吨的运输成本COSTij。
从一个仓库到一个处理中心之间的两种运输方式需对应两条不同的弧。
在这样的
图中,两个结点之间至多有p条弧,称为p-图。
这样的图无法编码为(二维)矩阵:
例如费用矩阵中的元素COSTij只能表示一个费用。
为将此图转化为两个结点之间至
多有一条弧的图,可以为仓库i和处理中心j之间的每种运输方式都创建一个假想的
结点。
例如,在仓库D2(结点3)和处理中心C1(结点12)之间存在一条公路连接和一条铁路连接。
为避免生成具有两条弧(3,12)的2-图,我们可以创建一个结点6
对应于铁路运输,以及一个结点7对应于公路运输。
则铁路运输即变为路径(3,6,12),公路运输即变为(3,7,12)。
只为弧(3,6)和(3,7)设置通过量和费用。
图10.1:
运输网络图
在此图中未将仓库的存储量纳入考虑。
为此,我们创建一个源结点(假想的结点
1),此结点将用弧(1,d)连接到每个仓库结点d上,且此弧的通过量为MAXCAP1d,对应于仓库d处的存储量。
因此离开仓库d的流不会超过此值。
为方便数学模型的
表达,我们也创建一个宿结点(假想的结点15),并且连接到每个处理中心结点上。
这样最终得到的图即可以表示为图10.1,其中每条弧(i,j)都对应于一个三元组
(MINCAP,MAXCAP,COST
)。
“-”表示通过量为无穷大。
ijijij
在此数学模型中包含了流守恒约束条件(10.2.2),也称为Kirchhoff定理:
每个
结点处的入流都等于此结点处的出流(除了源和宿结点之外)。
每条弧上的流都至少
取值为MINCAPij(约束条件(10.2.3)),且不超过最大通过量MAXCAPij(约束条件(10.2.4))。
式(10.2.5)对总流量加以约束,即MINQ=180吨。
这样就迫使离
开源(结点1)的流总量等于MINQ。
由于在此网络中流保持守恒,因此也可以使用宿结点的入流总量等于MINQ作为约束条件。
在这个约束条件中,我们可以将等
号替换为≥号,由于在最小化总成本时也将最小化总流量,因此此时总运输量将取此下界值。
最后要解释一下目标函数(10.2.1)。
COSTij是每吨的运费成本,因此通过弧(i,j)运输的流flowij的费用为COSTij⋅flowij。
因此最小化总运费即最小化所有弧上的总费用。
最终,通过定义这样的图,我们可以得到相当简洁的数学模型。
注意,在约束条件(10.2.3)中也隐含给出了变量非负的约束条件。
minimize
∑COSTij⋅flowij
(i,j)∈ARCS
(10.2.1)
∀i∈NODES,i≠SOURCE,SINK:
∑flowji=
(i,j)∈ARCS
∑flowij
(i,j)∈ARCS
(10.2.2)
∀(i,j)∈ARCS:
∀(i,j)∈ARCS:
flowij≥MINCAPij
flowij≤MAXCAPij
(10.2.3)
(10.2.4)
∑flowSOURCE,i
(SOURCE,i)∈ARCS
=MINQ
(10.2.5)
除了这种基于图的问题数学表达之外,也可以将使用方式m从仓库d运输到目标c的运量表示为决策变量trasnportdcm,对每个可能出现的三元组(d,c,m)都建立这样的决策变量,从而得到另一种问题表达方式。
这样总运量就可以表示为所有有定
义的变量trasnportdcm的和,目标函数即所有可行的三元组(d,c,m)对应的
COSTdcm⋅trasnportdcm的和。
每种运输方式的最小和最大运力限制将表示为对应变量trasnportdcm的上界和下界约束条件,这一点与上述的(10.2.3)和(10.2.4)很
相似。
对于我们这个问题,这种表达方式可能比基于图的模型表达要容易一些。
但在
后面的模型实现和进一步的讨论中,我们仍然使用这种更一般的最小费用流模型,即
(10.2.1)到(10.2.5)给出的模型。
10.2.2模型实现
从这个问题可以引出一个经典的问题,即图的编码。
可以将图定义为N×N的矩阵形式,其中N为结点总数,并为每对由弧相连的结点(i,j)都定义一个流变量。
然而,对于稀疏图,如我们所使用的这个图,更常用(效率也更高)的方法是将图表
示为弧的列表的形式。
在下面的Mosel程序实现种就使用了这种表示方法。
弧
a=(i,j)将用标号a进行索引,而不是用对应的结点对(i,j)进行索引。
弧的列表为
二维数组A,其中Aa1=i,Aa2=i。
在读入数据后(即弧集为已知)将定义流变量。
注意在下面的实现中,未采用数字对结点进行编号,而是用名称“Source”,“D2”,“C4”等,这样能够能够方便对结果进行解释。
model"E-2Minimumcostflow"uses"mmxprs"
declarations
NODES:
setofstring!
结点集合
MINQ:
integer!
运输总量
A:
array(ARCS:
range,1..2)ofstring!
弧
COST:
array(ARCS)ofinteger!
每条弧的运输成本
MINCAP,MAXCAP:
array(ARCS)ofinteger!
弧的最小和最大通过量
end-declarations
initializationsfrom‘e2minflow.dat’
AMINQMINCAPMAXCAPCOST
end-initializationsfinalize(ARCS)
!
计算结点集合
NODES:
=union(ainARCS){A(a,1),A(a,2)}
declarations
flow:
array(ARCS)ofmpvar!
弧上的流
end-declarations
!
目标函数:
总运输成本
Cost:
=sum(ainARCS)COST(a)*flow(a)
!
流平衡:
入流等于出流
forall(ninNODES|n<>"SOURCE"andn<>"SINK")
sum(ainARCS|A(a,2)=n)flow(a)=sum(ainARCS|A(a,1)=n)flow(a)
!
最小和最大流通过量
forall(ainARCS|MAXCAP(a)>0)doflow(a)>=MINCAP(a)
flow(a)<=MAXCAP(a)
end-do
!
最小运输量
sum(ainARCS|A(a,1)="SOURCE")flow(a)>=MINQ
!
求解此问题
minimize(Cost)
end-model
在此模型中使用了另一个Mosel集合运算符:
对所有由集合ARCS中的弧相连接的结点进行union(并集)运算从而得到结点集合NODES。
10.2.3结果
最低运输成本为1,715欧元。
图10.2示意了此时的解决方案:
在实际用于运输的弧上标出了运输量,未使用的弧用虚线表示。
例如,仓库D1的所有50吨库存都将通过公路运输到回收中心2。
图10.2:
最优运输方案应注意到,这种对弧上的流有最小约束的问题可能会无法找到可行解。
在本例中,
如果MINQ=9,则由于所有铁路运输的弧的最低通过量都是10吨,因此无法使用铁路运输。
10.2.4扩展讨论
这个模型可以用于求解任何类型的最小费用流问题。
例如,可以为各个回收中心设置需求量。
对于回收中心c,可以将弧(c,sink)的流最小值设置为此需求量,从而
保证能够满足需求。
但是,若要求有解,则必须满足一个条件:
仓库处的产品的可用量总和须大于或等于回收中心的需求量总和。
10.3仓库位置设置
有一家大公司希望开设一些新的仓库,以向销售中心供货。
每开设一个新仓库都
有一些固定费用。
货物将从仓库运输到附近的销售中心。
每次运输的运费取决于运输的距离。
这两种类型的费用非常不同:
仓库开设费用属于投资支出,通常在若干年后将勾销,而运输费用属于运营成本。
如何结合这两种费用不属于本书的讨论范围,我们假定这两种费用可比,为此可能需要以年为单位计算运营费用。
有12个可以建造新仓库的位置,并且需要从这些仓库向12个销售中心供货。
下表10.3给出了每个仓库完全满足每个客户(销售中心)需求所需的总成本(千
欧元,不是单位成本)。
因此,例如从仓库1向客户9(根据表10.5可以看到此客户
总需求量为30吨)供货的单位成本为60000欧元/30吨,即2000欧元/吨。
如果无法进行送货,则对应的成本标记为无穷大∞。
表格10.3:
满足客户需求所需的运输成本客户
仓库
1
2
3
4
5
6
7
8
9
10
11
12
1
100
80
50
50
60
100
120
90
60
70
65
110
2
120
90
60
70
65
110
140
110
80
80
75
130
3
140
110
80
80
75
130
160
125
100
100
80
150
4
160
125
100
100
80
150
190
150
130
∞
∞
∞
5
190
150
130
∞
∞
∞
200
180
150
∞
∞
∞
6
200
180
150
∞
∞
∞
100
80
50
50
60
100
7
100
80
50
50
60
100
120
90
60
70
65
110
8
120
90
60
70
65
110
140
110
80
80
75
130
9
140
110
80
80
75
130
160
125
100
100
80
150
10
160
125
100
100
80
150
190
150
130
∞
∞
∞
11
190
150
130
∞
∞
∞
200
180
150
∞
∞
∞
12
200
180
150
∞
∞
∞
100
80
50
50
60
100
此外,对每个仓库,还有如下信息:
仓库建设的固定费用(需要计入目标函数)
和仓库的容量上限,这些信息都列于表10.4中。
表格10.4:
仓库建设费用和容量限制
仓库
1
2
3
4
5
6
7
8
9
10
11
12
建设费用
3500
9000
10000
4000
3000
9000
9000
3000
4000
10000
9000
35000
容量上限
300
250
100
180
275
300
200
220
270
250
230
180
表10.5列出了各个销售中心(客户)的需求量。
表格10.5:
客户需求量数据
客户
1
2
3
4
5
6
7
8
9
10
11
12
需求量
120
80
75
100
110
100
90
60
30
150
95
120
任何时候都要保证满足客户需求,可以从多个仓库向同一个客户送货。
应在哪些
位置开办仓库才能使总的建设成本以及运输成本最低,同时仍然能够满足所有客户需求?
10.3.1模型的数学表达
为写出此问题的数学模型,我们用变量DEMc表示客户(销售中心)c的需求量,用CAPd表示仓库d的最大容量。
建造仓库d的固定费用为CFIXd,从仓库d向客户c运输一吨货物的运输成本为COSTcd。
此外,令DEPOTS为所有可建造仓库的位置的集合,CUST为将要向其进行送货的客户集合。
为求解此问题,我们需要了解将要在哪些位置开办仓库。
因此可以定义一个二值变量buildd,如果在位置d处开办了仓库,则buildd取值为1,否则为