资源描述
第 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 我们都用 X a 和 Ya 表示其地理坐 标。 REQa 表示在代理点 a 处汽车的需求量, STOCK a 为此代理点当前的汽车保有
量。这两个值之间的差值即表示此处汽车数富余(如果为正数值),或者不足量(负
值 )。此问题即找出车辆富余的代理点集合 EXCESS 和车辆不足的代理点集合
NEED 之间的最小费用车辆流。由于总富余量等于总不足量,因此必定存在能够满 足各处需求的车辆流。首先,我们定义变量 moveab 表示在两个代理点之间的车辆流:
∀a ∈ EXCESS ,b ∈ NEED :
moveab ∈ N
(10.1.1)
每个车辆富余的代理点都需要将其富余的车辆发送到别处(10.1.2),每个车辆
不足的代理点都需要从别处接受到数量等于不足数量的车辆(10.1.3)。
∀a ∈ EXCESS :
∀b ∈ NEED :
∑ moveab = STOCK a − REQa
b∈NEED
∑ moveab = REQb − STOCK b
(10.1.2)
(10.1.3)
a∈EXCESS
目标函数即最小化总转运成本(10.1.4),其中 COST 表示每辆车每转运 1 千米
的成本, DISTab 表示在两个代理点 a 和 b 之间的距离。
minimize ∑ ∑COST ⋅ DISTab ⋅ moveab
a∈EXCESS b∈NEED
(10.1.4)
最小费用流问题是一个运输问题(transportation problem),其特征在于都有一
组来源的,拥有数量有限的资源,以及一组需要此资源的目的地。对于最小费用流问 题,通常可以采用单纯形算法求解线性规划从而找到整数解。因此约束条件(10.1.1) 可以用简单的非负约束条件取代。
10.1.2 模型实现
上述数学模型可以实现为下面的 Mosel 程序。在读入数据之后,我们首先检查 当前汽车的总保有量是否等于汽车的需求量,如果不相等,则停止此程序。如果相等, 则分别找出车辆富余和车辆不足的代理点集合。在下面声明决策变量数组和距离矩阵 时将用到这两个集合。
model "E-1 Car rental" uses "mmxprs"
declarations
AGENTS = 1..10 ! 汽车租赁代理点
REQ: array(AGENTS) of integer ! 汽车需求数量
STOCK: array(AGENTS) of integer ! 当前汽车保有量
X,Y: array(AGENTS) of integer ! 租赁代理点位置坐标 COST: real ! 转运一辆汽车每千米成本 NEED: set of integer ! 汽车数不足的代理点 EXCESS: set of integer ! 汽车数富余的代理点
end-declarations
initializations from ‘e1carrent.dat' REQ STOCK X Y COST
end-initializations
if sum(a in AGENTS) (STOCK(a)-REQ(a)) <> 0 then writeln("Problem is infeasible")
exit(0)
end-if
! 计算出汽车数富余和汽车数不足的代理点集合
forall(a in AGENTS)
if STOCK(a) -REQ(a) < 0 then
NEED += {a}
elif STOCK(a) -REQ(a) > 0 then
EXCESS += {a}
end-if
finalize(NEED); finalize(EXCESS)
declarations
DIST: array(EXCESS,NEED) of real ! 代理点之间的距离
move: array(EXCESS,NEED) of mpvar ! 代理点之间的汽车转运情况
end-declarations
! 计算代理点之间的距离
forall(a in EXCESS,b in NEED)
DIST(a,b):= 1.3*sqrt((X(a)-X(b))^2 + (Y(a)-Y(b))^2)
! 目标函数:总转运成本
Cost:= sum(a in EXCESS,b in NEED) COST*DIST(a,b)*move(a,b)
! 汽车数富余的代理点
forall(a in EXCESS) sum(b in NEED) move(a,b) = STOCK(a) -REQ(a)
! 汽车数不足的代理点
forall(b in NEED) sum(a in EXCESS) move(a,b) = REQ(b) -STOCK(b)
forall(a in EXCESS,b in NEED) 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 模型的数学表达
我们将把此问题建模为一个具有固定总通过量的最小费用流问题(minimum cost flow problem)。我们先来构造一幅图 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
)。“-”表示通过量为无穷大。
ij ij ij
在此数学模型中包含了流守恒约束条件(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 :
∑ flow ji =
(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 的运量表示为决策变量 trasnport dcm ,对每个可能出现的三元组 (d ,c,m)都建立 这样的决策变量,从而得到另一种问题表达方式。这样总运量就可以表示为所有有定
义的变量 trasnport dcm 的和,目标函 数即所有可 行的三元组 (d ,c,m) 对应的
COSTdcm ⋅ trasnport dcm 的和。每种运输方式的最小和最大运力限制将表示为对应变 量 trasnport dcm 的上界和下界约束条件,这一点与上述的(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 , Aa 2 = i 。在读入数据后(即弧集为已知)将定义流变 量。注意在下面的实现中,未采用数字对结点进行编号,而是用名称“Source”,“D2”, “C4”等,这样能够能够方便对结果进行解释。
model "E-2 Minimum cost flow" uses "mmxprs"
declarations
NODES: set of string ! 结点集合
MINQ : integer ! 运输总量
A: array(ARCS:range,1..2) of string ! 弧
COST: array(ARCS) of integer ! 每条弧的运输成本
MINCAP,MAXCAP: array(ARCS) of integer ! 弧的最小和最大通过量
end-declarations
initializations from ‘e2minflow.dat’
A MINQ MINCAP MAXCAP COST
end-initializations finalize(ARCS)
! 计算结点集合
NODES:= union(a in ARCS) {A(a,1),A(a,2)}
declarations
flow: array(ARCS) of mpvar ! 弧上的流
end-declarations
! 目标函数:总运输成本
Cost:= sum(a in ARCS) COST(a)*flow(a)
! 流平衡:入流等于出流
forall(n in NODES | n<>"SOURCE" and n<>"SINK")
sum(a in ARCS | A(a,2)=n) flow(a) = sum(a in ARCS | A(a,1)=n) flow(a)
! 最小和最大流通过量
forall(a in ARCS | MAXCAP(a) > 0) do flow(a) >= MINCAP(a)
flow(a) <= MAXCAP(a)
end-do
! 最小运输量
sum(a in ARCS | 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,sin k )的流最小值设置为此需求量,从而
保证能够满足需求。但是,若要求有解,则必须满足一个条件:仓库处的产品的可用 量总和须大于或等于回收中心的需求量总和。
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 模型的数学表达
为写出此问题的数学模型,我们用变量 DEM c 表示客户(销售中心) c 的需求 量,用 CAPd 表示仓库 d 的最大容量。建造仓库 d 的固定费用为 CFIX d ,从仓库 d 向 客户 c 运输一吨货物的运输成本为 COSTcd 。此外,令 DEPOTS 为所有可建造仓库 的位置的集合, CUST 为将要向其进行送货的客户集合。
为求解此问题,我们需要了解将要在哪些位置开办仓库。因此可以定义一个二值 变量 build d ,如果在位置 d 处开办了仓库,则 build d 取值为 1,否则为 0。此外, 我们也需要知道有哪个或哪些仓库向某个客户供货。因此我们引入变量 fflowdc ,表
示客户 c 从仓库 d 那里接受到的货物量占总需求量的比例。这些变量的取值范围为
[0,1],因此可以得到约束条件(10.3.1)。
∀d ∈ DEPOTS ,c ∈ CUST :
fflowdc ≤ 1
(10.3.1)
每个客户的需求都应完全满足:
∀c ∈ CUST :
∑ fflowdc = 1
(10.3.2)
d∈DEPOTS
现在我们需 要建模表示 出离开仓库 d 的货物总量 不可超过此 仓库的总容 量
CAPd ,但如果此仓库尚未修建,则此流为 0。因此有约束条件(10.3.3)。
∀d ∈ DEPOTS :
∑ DEM c ⋅ fflowdc ≤ CAPd ⋅ build d
c∈CUST
(10.3.3)
现在我们来看看为什么可以这样表示。由于 fflowdc 是客户 c 从仓库 d 那里收到
的货物占其总需求量的比例,因此 DEM c ⋅ fflowdc 就是客户 c 从仓库 d 那里收到的货
物量。如果仓库 d 已经开办( build d
CAPd ;如果仓库 d 尚未开办( build d
= 1 ),则从仓库 d 流出的货物总量不能超过
= 0 ),则此货物出流值必须为 0。
要最小化的总成本由仓库建设费用和运输费用两部分组成。即目标函数(10.3.4)
由两个求和组成。这样完整的数学模型就可以写成:
minmize
∑CFIX d ⋅ build d +
d∈DEPOTS
∑ ∑COSTdc ⋅ fflowdc
d∈DEPOTS c∈CUST
(10.3.4)
∀d ∈ DEPOTS ,c ∈ CUST :
fflowdc ≤ 1
(10.3.5)
∀c ∈ CUST :
∑ fflowdc = 1
d∈DEPOTS
(10.3.6)
∀d ∈ DEPOTS :
∑ DEM c ⋅ fflowdc ≤ CAPd ⋅ build d c∈CUST
(10.3.7)
∀d ∈ DEPOTS ,c ∈ CUST :
fflowdc ≥ 0
(10.3.8)
∀d ∈ DEPOTS :
build d ∈ N
(10.3.9)
10.3.2 模型实现
上述数学模型可以很容易地改写为如下的 Mosel 程序。
model "E-3 Depot location" uses "mmxprs"
declarations
DEPOTS = 1..12 ! 仓库集合
CUST = 1..12 ! 客户集合
COST: array(DEPOTS,CUST) of integer ! 运输成本
CFIX: array(DEPOTS) of integer ! 仓库建设固定成本
CAP: array(DEPOTS) of integer ! 仓库容量
DEM: array(CUST) of integer ! 客户需求量
fflow: array(DEPOTS,CUST) of mpvar ! 仓库供货量占客户需求总量百分比
build: array(DEPOTS) of mpvar ! 如果选择在某处建造仓库,则取值为 1
! 否则为 0
end-declarations
initializations from ‘e3depot.dat’
COST CFIX CAP DEM
end-initializations
! 目标函数:总成本
TotCost:= sum(d in DEPOTS, c in CUST) COST(d,c)*fflow(d,c) +
sum(d in DEPOTS) CFIX(d)*build(d)
! 满足客户需求
forall(c in CUST) sum(d in DEPOTS) fflow(d,c) = 1
! 仓库容量限制
forall(d in DEPOTS) sum(c in CUST) DEM(c)*fflow(d,c) <= CAP(d)*build(d)
forall(d in DEPOTS) build(d) is_binary
forall(d in DEPOTS, c in CUST) fflow(d,c) <= 1
! 求解此问题
minimize(TotCost)
end-model
我们可以再加入一组约束条件来描述关系“如果从仓库 d 有货物运出,则应该修
建此仓库”(以及其相反关系“如果仓库 d 未修建,则从此仓库没有货物运出”)。约 束条件(10.3.3)隐含表示了此关系,但我们加入的新约束条件(分离出的约束条件)
能够使模型表达更紧密。即,向模型中加入了这些约束条件之后,线性规划松弛求解
的结果将更接近混合整数规划的解。可以向模型直接加入这些新的约束条件,但由于 在上面的程序中已经完整地给出了此模型,因此我们可以将这些约束条件转化为下面 所示的模型剪辑(model cuts)形式。通过将这些变量表示为模型剪辑,我们可以让 优化器来决定是否使用这些附加的约束条件。以,用作模型剪辑的约束条件都应进行 命名,并在 Mosel 程序中进行全局声明,如下所示(Mosel 程序中线性约束条件的 类型未 linctr)。
declarations
modcut: array(DEPOTS,CUST) of linctr end-declarations
forall(d in DEPOTS, c in CUST) do modcut(d,c):= fflow(d,c) <= build(d) setmodcut(modcut(d,c))
end-do
10.3.3 结果
优化算法求得最低总成本为 18,103 千欧元。应在五个位置开设仓库,即位置 1,
5,8,9,12。下表列出了从这些仓库向客户送货的方案。除了位置 5 上的仓库之外, 其他仓库都完全利用了库存能力。
表格 10.6:运输方案 客户
仓库
1
2
3
4
5
6
7
8
9
10
11
12
1
-
5
75
100
-
-
-
-
-
-
-
120
5
120
40
-
-
-
-
-
-
-
-
-
-
8
-
35
-
-
-
100
-
-
-
85
-
-
9
-
-
-
-
110
-
-
-
-
65
95
-
12
-
-
-
-
-
-
90
60
30
-
-
-
10.4 燃油运输
有一个运输商需要将一些燃油从位于 Donges 的炼油厂运输到法国西部的一些
客户那里。这些客户分别位于 Brain-sur-l΄Authion,Craquefou,Guérande,Haie
Fouassière,Mésanger,和 Ponts-de-Cé。下表列出了每个地方的需求量升数。
表格 10.7:客户需求量(升)
Brain-sur-
Craquefou
Guérande
Haie
Mésanger
Ponts-de-Cé
l΄Authion
Fouassière
14000
3000
6000
16000
15000
5000
下面这个表中列出了炼油厂与客户之间的距离。
表格 10.8:距离矩阵(千米)
Brain-
Haie
Ponts-
Donges
sur-
Craquefou Guérande
l΄Authion
Donges
0
148
55
32
70
140
73
Brain-sur-l΄Authion
148
0
93
180
99
12
72
Craquefou
55
93
0
85
20
83
28
Guérande
32
180
85
0
100
174
99
Haie Fouassière
70
99
20
100
0
85
49
Mésanger
140
12
83
174
85
0
73
Ponts-de-Cé
73
72
28
99
49
73
0
Fouassière
Mésanger
de-Cé
此运输公司使用容量为 39000 升的油罐车进行运输。请选择运输路线,使向所
有客户运输的总里程数最少。
10.4.1 模型的数学表达
这个问题可以看作注明的旅行商问题(TSP)的推广形式,我们在第 11.5 节中 将看到旅行商问题的另一个例子。在这个例子中,我们有多个“旅行商”,每个“旅 行商”的行程都需要从 Donges 出发,并最后回到 Donges。
我们引入变量 precij ,如果在路线中城市 j 紧随城市 i ,则此变量取值为 1,否 则为 0。令 SITES = {1,K , NS }为地点集合。地点 1 即为此炼油厂,因此可以得到一
个子集 CLIENTS = {2,K , NS},对应于我们送货的目标地点。令 DISTij 为两个城市
i 和 j 之间的距离,DEM i 为客户 i 定购的燃油数量,CAP 为油罐车的容量上限。此 外也加入变量 quanti ,表示在通往客户 i 的路径上送出去的燃油总量,包括给客户 i 的燃油量。例如如果包含客户 10 的路径为 1,3,11,10,6,1,则 quant10 的值即
为 DEM 3 + DEM 11 + DEM 10 。借助于这些符号,我们可以写出如下的数学模型:
minmize ∑ ∑ DISTij ⋅ precij
i∈CLIENTS j∈SITES ,i ≠ j
(10.4.1)
∀j ∈ CLIENTS :
∀i ∈ CLIENTS :
∑ precij = 1
i∈SITES ,i ≠ j
∑ precij = 1
j∈SITES , j ≠i
(10.4.2)
(10.4.3)
∀i ∈ CLIENTS :
∀i ∈ CLIENTS :
DEM i ≤ quanti ≤ CAP
quanti ≤ CAP + (DEM i − CAP )prec1i
(10.4.4)
(10.4.5)
∀i, j ∈ CLIENTS ,i ≠ j :
quant j ≥ quanti + DEM j − CAP + CAP ⋅ precij +
j
ji
(CAP − DEM
− DEM i
)⋅ prec
(10.4.6)
∀i ∈ CLIENTS :
quanti
展开阅读全文