1、航空运输,航空运输业是许多优化问题的温床,其中不乏一些很困难的问题。航空公司之间的激烈竞争促进了各个航空公司的运筹部门的发展,尤其是那些最大的航空公司(如美国航空公司,德尔塔航空公司,英国航空公司等,以及最近法国航空公司的运筹部门也开始复兴)。本章将介绍这一领域中运筹学的多种应用,包括旅客流,机组人员,航班调度,枢纽(hub)选址,以及航线安排等。 在第一个问题(11.1 节)中,需要对进场和离场飞机进行安排,以最小化需要更换飞机的旅客(以及行李)数目。第11.2 节中的问题研究如何根据各种兼容性和表现来安排机组人员。第11.3 节描述了一个有趣的航空运输业的原创问题,即对飞机的降落顺序进行调
2、度。在第11.4 节中将处理网络结构(航空枢纽选择)的问题。第11.5 节的主题是紧急情况下的物流配送问题(向遭受灾害袭击的国家提供补给品)。,11.1 机场航班连接,SafeFlight 航空公司使用戴高乐机场作为中转枢纽,以最小化与欧洲各个目的地之间的航班连接数。从上午11 点到下午12 点30 分之间有六架分别来自波尔多,克莱蒙-费朗,马赛,南特,尼斯,以及图卢兹的福克100 型飞机将要在这里降落。这些飞机将要去往柏林,波恩,布鲁塞尔,伦敦,罗马,和维也纳,离场时间在下午12 点30 分到13 点30 分之间。表11.1 列出了各个航班的旅客转机情况。,例如,如果从波尔多来的飞机继续飞往
3、柏林,则当在巴黎降落时,其中35 名旅客及其携带的行李可以继续待在飞机上,不需换非机。从尼斯来的飞机到达得太晚,不能继续用于飞往柏林,从图卢兹飞来的飞机与之相似,也无法用于飞往柏林,波恩,和布鲁塞尔(在上表中对应栏目标记为-)。 应重新安排这些降落的飞机各执行哪一个离场航班才能够使需要换飞机的乘客数最少?,11.1.1 模型的数学表达,令 PLANES 为飞机集合(其数目等于航班起点和终点数), 为在机场中从来源地i 转到目的地j 的乘客数。我们引入二值变量 ,当且仅当来自来源地i 的飞机继续飞往目的地j 时此变量取值才为1。这样就可以将此问题表示为下面的线性规划形式: maximize (1
4、1.1.1) jPLANES: =1 (11.1.2) iPLANES: =1 (11.1.3) i,jPLANES: 0,1 (11.1.4),初始的目标是最小化需要更换飞机的乘客数目,这个目标等价于(11.1.1),即最大化不需要更换飞机的乘客数。约束条件(11.1.2)将使每个目的地安排的飞机数等于1,并且约束条件(11.1.3)将使来自每个来源地的航班数也等于1。约束条件(11.1.4)指定这些变量为二值变量。注意,由于这个问题是著名的分配问题的一个例子,因此使用单纯形算法求得的线性规划最优解就是整数解。因此只需要为这些变量指定非负约束条件即可。约束条件(11.1.2)和(11.1.3
5、)将为这些变量确立上界。,11.1.2 模型实现,range Planes = 16;int PassPlanes,Planes = .;dvar boolean contPlanes,Planes;dexpr int Transfer =sum(i,j in Planes)Passi,j*conti,j;maximize Transfer;subject toforall(i in Planes)sum(j in Planes)conti,j=1;forall(j in Planes)sum(i in Planes)conti,j=1;,数据文件:,Pass=35 12 16 38 5 2
6、25 8 9 24 6 6 12 8 11 27 3 2 38 15 14 39 2 9 0 9 8 25 10 5 0 0 0 14 6 7;,11.1.3 结果,在最优解决方案中,有 112 名乘客无须换飞机。下表列出了对应的航班连接。,11.2 机组人员组成,在第二次世界大展中,英国皇家空军(RAS)中有很多说不同语言的飞行员,飞行员所学习驾驶的飞机也不尽相同。皇家空军希望为每架飞机安排一对飞行员-副飞行员(一个机组),他们必须语言相通,并且都熟悉此机型。在我们这个例子中有8 名飞行员。下面的表中用0(最差)到20(最好)表示每名飞行员对各种语言(英语,法语,荷兰语,挪威语)的掌握程度,
7、以及对不同类型的双座飞机(侦察机,运输机,轰炸机,战斗轰炸机,补给运输机)的驾驶经验。,只有两名飞行员对同一种语言的掌握都超过10/20,且对同一种飞机的掌握都超过10/20,这样才能组成一个机组。,问题1:是否有可能让所有飞行员都编入机组? 计算每个可行机组人员对其掌握得分均超过10/20 的每种类型飞机的掌握得分之和。这样我们可以定义每个机组的最高得分。例如,飞行员5 和6 对轰炸机的掌握分别为13 和10,对补给运输机的掌握分别为12 和18。因此它们组成的机组的最高得分为max(13+10, 12+18) = 30。 问题2:应如何编组才能让所有机组的得分之和最大?,11.2.1 模型
8、的数学表达,令PILOTS 为飞行员集合。可以使用无向兼容性图G = (PILOTS ,ARCS )来对这个问题进行建模。每个结点代表一个飞行员,如果飞行员p 和q 能够兼容,即有一门语言的掌握都至少为10/20,且有一种机型的掌握也至少为10/20,则用弧(边)a = p,q连接这两个飞行员的结点。此弧具有权值,权值即等于此机组人员的最高得分。图11.1 给出了本问题所对应的此图,并且在其中标出了每个机组的最高得分。,一个可行的编组方案即对应于图G 中相互之间没有共同结点的一些弧的集合。在图论中,这样的集合称为一个匹配(matching)。对于问题1,我们即在图中寻找最大基数匹配(maxim
9、um cardinality matching);对于问题2,即寻找具有最大总权值的匹配(matching with maximum total weight)。根据此图,我们可以将模型表示 为如下形式: maximize (11.2.1) rPILOTS: = , = 1 (11.2.2) aARCS: 0,1 (11.2.3),对于图中的每条边 a = p,q,都用一个二值变量 来表示是否使用此边(11.2.3)。通过约束条件(11.2.2),每个结点r 都至多属于一条边。问题2 的目标函数为(11.2.1),即累加所有选中的边的权值。对于问题1,我们需要最大化机组数目,并查看此时是否所有
10、飞行员都已经编组:此时需要从目标函数中去掉系数 。注意最大基数匹配是具有最大总权值的匹配的一个特例,在其中所有权值都设置为1。,11.2.2 模型实现,range Pilots = 18; /飞行员 range Rl = 14; /语言 range Rt = 15; /机型int LangRlPilots=.; int PtypeRtPilots=.;dvar boolean CrewPilotsPilotsRlRt;dexpr float TotalScore=0.5*sum(p,q in Pilots,l in Rl,t in Rt)Crewpqlt*(Ptypetp+Ptypetq);m
11、aximize TotalScore;,subject toforall(p,q in Pilots,l in Rl,t in Rt)if(Langl,p=10 ,数据文件:,Lang=20 14 0 13 0 0 8 8 12 0 0 10 15 20 8 9 0 20 12 0 8 11 14 12 0 0 0 0 17 0 0 16; Ptype=18 12 15 0 0 0 8 0 10 0 9 14 15 8 12 13 0 17 0 11 13 10 0 0 0 0 14 0 0 12 16 0 0 0 0 0 12 18 0 18;,11.2.3 结果,在回答第一个问题时,程序将
12、发现最多可以同时编为四个机组,即所有八名飞行员都将编入机组。对于第二个问题,程序求出最高总得分为125,此时的机组编成为1, 2,3, 7,4, 5,和6, 8。,11.3 航班降落调度,在大型机场中,飞机的降落要受到很多安全约束条件的限制。本节中将研究如何对单条跑道上的飞机降落进行调度。已经有人研究了更一般的问题,但这些问题相当复杂(动态案例,例如航班晚点,同时有多条跑道,等等),因此我们只讨论一个简单的情形。 有十个航班需要降落。每个航班都有一个最早到达时间(飞机以最高速度到达降落区域的时间)和最晚到达时间(可能受其他因素如燃油量等的影响)。在这个时间窗口内,航空公司需要选择一个目标时间,
13、并将它作为航班到达时间公布出去。如果比此目标时间迟到或早到,则可能会引起机场秩序混乱并带来额外的费用支出。为将这些费用计入考虑,并方便进行比对,每个航班都定义了早到每分钟的惩罚和晚到每分钟的惩罚。下表列出了每个航班的时间窗口(以从当天零时起分钟数计)和惩罚值。,由于尾流影响以及飞机停留在跑道上的时间影响,在两次降落之间需要间隔一段安全时间。在表11.5 中第p 行第q 列即表示在航班p 和q 降落之间需要等待的最短时间(分钟),即便这两个航班实际上不是连续降落的。应采取何种降落调度方案才能够在使总惩罚最小,同时航班又都在指定的时间窗口中降落,并且满足两个航班降落之间的时间间隔?,11.3.1
14、模型的数学表达,令 PLANES 为到达此机场的航班集合。航班p 的到达时间窗口为 , ,目标到达时间为 。每早到一分钟的惩罚为 。每晚到一分钟的惩罚为 。在航班p 和q 降落之间的最小时间间隔为 。在本例子的数据中,任意两个时间窗口之间都有部分重叠。因此可以为此重叠情况建立模型,稍后将介绍如何将此模型扩展到任意类型的时间窗口。我们需要定义变量 ,代表每个航班p 的降落时间。这些变量要受到各个航班的最早和最晚到达时间约束(11.3.1)。 pPLANES: (11.3.1),为描述任意两个航班p 和q 之间的降落时间间隔,我们引入二值变量 ,如果航班 p 在航班q之前降落,则 =1,否则为0。
15、 p,qPLANES,pq: 0,1 (11.3.2) 约束条件(11.3.3)将指定航班p 和q 必须一前一后降落。约束条件(11.3.4)将保证两次降落之间有足够的安全世间;这是经典的互斥(disjunctive 或exclusion)约束条件,常用于在同一台机器上调度两个任务,以避免它们发生重叠。其中M 为一个足够大的正常数。 p,qPLANES,pq: + =1 (11.3.3) p,qPLANES,pq: + (11.3.4),如果航班 p 在航班q之前到达,则有 =1,因此由(11.3.3)可以得到 =0 。从 p 和q的约束条件(11.3.4)可以得出 + ,从而保证这两次降落之
16、间的时间间隔满足要求。如果 =0,则 =1,因此约束条件(11.3.4)的不等式左面是一个足够大的负数值,因此此约束条件显然成立。为避免问题出现数值不稳定性, pq M 的数值不应太大, = + 就已经足够大,能够满足(11.3.4)中的每个约束条件。 为减少变量的数量,我们只定义 p q 的二维变量 ,如果p 在q 之前降落,则此变量取值为1,否则为0。则约束条件(11.3.2)可以用(11.3.5)代替,约束条件(11.3.3)即多余。 p,qPLANES,pq: 0,1 (11.3.5),约束条件(11.3.4)可以改写为(11.3.6)和(11.3.7)。(11.3.6)是 p q的一
17、对航班(p,q)的互斥约束条件,(11.3.7)是 p q 时的互斥约束。例如,如果 p q(约束条件(11.3.7),且 p 在q之前到达,则 =1,因此1 =0,且 + 。如果 p q ,但 q 在 p 之前到达,则 =0,(11.3.7)显然满足。 p,qPLANES,qp: + + (11.3.6) p,qPLANES,qp: + +(1 )(11.3.7),建模要将航班p 相对于目标到达时间 迟到或早到的时间需要一些技巧。我们引入变量 ,代表早到的时间长度, 表示迟到的时间长度。然后就可以写出带有早到每分钟和迟到每分钟的惩罚 和 的目标函数(11.3.8)。 minimize ( +
18、 ) (11.3.8) 变量 和 都有上界(11.3.9)和(11.3.10),以便使航班能够在时间窗口 , 中降落。 pPLANES:0 (11.3.9) pPLANES:0 (11.3.10),约束条件(11.3.11)即在降落时间与早到或迟到时间长度之间建立了联系。 pPIANEAS: = + (11.3.11) 我们要最小化这个目标函数,因此(11.3.11)中 和 不可能同时为非零值。 最终就可以得到一个混合整数模型,即(11.3.1),和(11.3.5)-(11.3.11)。,11.3.2 推广到任意类型的时间窗口,在一般情形中, p q 的一对航班(p,q)可以分为三个集合,即O
19、VERLAP,SEP,和NONSEP。OVERLAP 中包含所有时间窗口有重叠的航班对。变量 用于判断航班p 是否在航班q 之前到达。我们前面给出的模型是对一般情况的简化,在其中要求所有航班对都属于集合OVERLAP。 集合SEP表示那些时间窗口不相连,并且肯定能够满足降落时间间隔要求的航班对:例如两个航班的时间窗口分别为10, 50和70, 110,其安全降落间隔时间为15 分钟,显然此条件能够得到满足。两个时间窗口之间的这种类型的关系可以写成( + )( + )。 第 三 个 集 合NONSEP表示所有时间窗口不相连,但无法肯定保证安全降落间隔时间的航班对,例如时间窗口分别为10, 50和
20、70, 110,但安全降落时间间隔为30 的两个航班。,原先的约束条件(11.3.6)-(11.3.7)只考虑了集合OVERLAP 中的航班对,为得到更一般化的模型,我们需要加入约束条件(11.3.12)到(11.3.15)。约束条件(11.3.12)和(11.3.13)将迫使两个时间窗口不相连时变量取值为0 或1。约束条件(11.3.14)和(11.3.15)是简单的先决关系约束条件,类似于第7 章体育馆建设问题中的约束条件。 p,q SEPNONSET, : =1 (11.3.12) p,q SEPNONSET, : =0 (11.3.13) p,q NONSET, : + (11.3.1
21、4),11.3.3 模型实现,range Planes =110;int StartPlanes =.; int StopPlanes = .; int TargetPlanes=.; int CearlyPlanes=.; int ClatePlanes=.; int DistPlanes,Planes=.; dvar int MPlanes,Planes;,dvar boolean precPlanes,Planes; dvar int+ landPlanes; dvar int+ earlyPlanes; dvar int+ latePlanes;dexpr int Cost=sum(p
22、 in Planes)(Cearlyp*earlyp+Clatep*latep);minimize Cost;,subject toforall(p,q in Planes)Mp,q=Stopp+Distp,q-Startq;forall(p,q in Planes:pq)landp+Distp,q=Targetp-landp;latep=landp-Targetp;landp=Targetp-earlyp+latep;,forall(p in Planes)Startp=landp;landp=Stopp;earlyp=Targetp-Startp;latep=Stopp-Targetp;,
23、数据文件:,Start=129 195 89 96 110 120 124 126 135 160; Stop=559 744 510 521 555 576 577 573 591 657; Target=155 258 98 106 123 135 138 140 150 180; Cearly=10 10 30 30 30 30 30 30 30 30; Clate=10 10 30 30 30 30 30 30 30 30; Dist=0 3 15 15 15 15 15 15 15 15 3 0 15 15 15 15 15 15 15 15 15 15 0 8 8 8 8 8 8
24、8 15 15 8 0 8 8 8 8 8 8,15 15 8 8 0 8 8 8 8 8 15 15 8 8 8 0 8 8 8 8 15 15 8 8 8 8 0 8 8 8 15 15 8 8 8 8 8 0 8 8 15 15 8 8 8 8 8 8 0 8 15 15 8 8 8 8 8 8 8 0;,11.3.4 结果,程序计算出总惩罚为 700。下表列出了每个航班的调度信息以及目标时间和实际降落时间与目标时间之间的偏差(较目标时间迟到或早到的时间长度)。值得一提的是,此问题的线性规划解的最优值为0,但此时许多变量 都需要取小数值。,11.4 航空枢纽选择选址,FAL(法国航空公司
25、)专门从事货运。此公司在法国的主要城市与美国的主要城市之间进行运输,这些城市为:亚特兰大,波士顿,芝加哥,马赛,尼斯,巴黎。此公司在这些城市之间平均每天运输的货物吨数列于下表中。,我们假定城市i 和j 之间的运输费用与它们之间的距离成正比。下表给出了这些城市之间的距离,单位为英里。,此航空公司计划使用两个城市作为连接平台(航空枢纽),以降低运输费用。然后每个城市将连接到一个枢纽。连接到枢纽 1 的城市与连接到枢纽 2 之间的城市之间的运输即都需要通过 1 到 2 这段路径,这样能够降低运输费用。我们知道两个枢纽之间的运输费用比一般运输费用低20%。使用哪两个城市作为枢纽才能够最小化总运输成本?
26、,11.4.1 模型的数学表达,用CITIES 表示所有城市的集合,NHUBS 为枢纽数目。令 为在城市i 和j 之间的距离 为需要从i 到j 运输的货物数量。每吨的运费取决于选择哪些城市作为枢纽。从任意城市i 到任意城市j 的货运量都要经过两个枢纽k 和l (可以为同一个枢纽)。令 为从i 到j 经过枢纽k 和l 的运输费用,则此费用等于从i 到k 的运费加上k 到l 的运费再加上l 到j 的运费。由于从k 到l 是枢纽之间的运输,因此其运费等于表11.8 中列出正常运费的80%。 再加入一组二值变量 ,如果i 到j 的运输需要依次经过枢纽k 和l ,则 取值为1,反之则为0。同时我们引入变
27、量 ,如果城市i 是枢纽,则 取值为1,否则为0。,目标函数即为(11.4.1),即最小化总运输成本。约束条件(11.4.2)表明我们希望创建NHUBS 个枢纽。约束条件(11.4.3)规定每对城市(i, j)只对应于一对枢纽。约束条件(11.4.4)和(11.4.5)表明如果变量 为1,则变量 和 也为1。也就是说,只有当k 和l 都是枢纽时,i 到j 的货运才可能通过k 和l 。为使此模型完整,我们还需要定义约束条件(11.4.6)和(11.4.7),即这些变量为二值变量。 注意:在约束条件(11.4.3)中,k 可以等于l ,这时意味着运输可能只通过一个枢纽进行中转。如果起点/终点城市都
28、连接到同一个枢纽,则会出现这种情况。此时枢纽间运输成本即为0。,minimize (11.4.1) = (11.4.2) i,jCITIES: =1 (11.4.3) i,j,k,lCITIES: (11.4.4) i,j,k,lCITIES: (11.4.5) iCITIES: 0,1 (11.4.6) i,j,k,lCITIES: 0,1 (11.4.7),11.4.2 模型实现,range Cities = 16;int Nhubs = 2; int QuantCities,Cities=.; int DistCities,Cities=.; float Factor=.;dvar bo
29、olean flowCities,Cities,Cities,Cities; dvar boolean hubCities; dvar float CostCities,Cities,Cities,Cities;,dexpr float TotCost = sum(i,j,k,l in Cities)Quanti,j*Costi,j,k,l*flowi,j,k,l;minimize TotCost; subject toforall(i,j,k,l in Cities)Costi,j,k,l=Disti,k+Factor*Distk,l+Distl,j;sum(i in Cities)hubi
30、=Nhubs;forall(i,j in Cities)sum(k,l in Cities)flowi,j,k,l=1;forall(i,j,k,l in Cities)flowi,j,k,l=hubk;flowi,j,k,l=hubl;,数据文件:,Quant=0 500 1000 300 400 1500 1500 0 250 630 360 1140 400 510 0 460 320 490 300 600 810 0 820 310 400 100 420 730 0 970 350 1020 260 580 380 0; Dist=0 945 605 4667 4749 4394
31、945 0 866 3726 3806 3448 605 866 0 4471 4541 4152 4667 3726 4471 0 109 415 4749 3806 4541 109 0 431 4394 3448 4152 415 431 0; Factor=0.8;,11.4.4 结果,这两个模型能够得到相同的解。为最小化总运费,应使用波士顿和巴黎作为枢纽。亚特兰大和芝加哥都将连接到波士顿枢纽,尼斯和马赛都将连接到巴黎枢纽,这在我们意料之中。这表示,所有来自亚特兰大,波士顿,和芝加哥的货物都将首先汇集到波士顿枢纽。如果货物的目的地是美国的城市,则将直接发送往指定的城市。所有目的地为欧洲
32、的货物都将先运到巴黎枢纽,然后再分送到欧洲的各个城市。从欧洲城市送往美国的货物也将先运到巴黎枢纽,然后运到波士顿枢纽,最终才送到各自的目的地那里。总的运输费用是42,153,794.欧元。,11.5 空运路线规划,在东南亚有一个国家正在遭受广泛的洪灾。在国际援助下,该国政府决定建立一个空运补给系统。不幸的是,在这个国家只有七条还可以使用的跑道,其中有一条在首都。 该国政府决定让飞机从首都起飞,然后访问所有其他六个机场,最后回到首都。下表列出了机场之间的距离。机场A1 位于首都。应采取什么顺序依次到达各个机场才能使总行程最短?,11.5.1 模型的数学表达,为建模此问题,我们用CITIES =
33、1,7表示将要访问的机场集合, 为在机场 和 之间的距离。由于将通过飞机到达各个机场,因此距离矩阵是对称的。我们引入二值变量 ,如果飞机从i 飞到j ,则此变量取值为1,否则为0。我们希望找出的路线应是一个循环,其中每个机场都被访问一次,且只访问一次。在此循环中,到达每个机场i 的飞机只能来自于同一个机场,并且只能去往同一个机场。式(11.5.1)和(11.5.2)即表示出了这些条件。 jCITIES: , =1(11.5.1) iCITIES: , =1(11.5.2),如果我们只使用约束条件(11.5.1)和(11.5.2),则此循环可能被分为若干个子循环,例如从机场1 到机场2,然后再回
34、到机场1。此子循环能够满足上述的两个约束条件,但不是正确解。因此需要避免这种出现子循环的情况。约束条件(11.5.3)即能实现此目的:对于每个机场子集S ,要求S 中的弧的数目必须严格小于S 的基数,这样就避免了这种出现子循环的情况。 如果城市数目为N ,即使N 相对较小,也很难对所有可能出现的子循环(数目为 2 量级)进行尝试。为此我们首先要求解没有约束条件(11.5.3)的此问题,通常能够找到一个包含有子循环的解,然后可以逐步加入约束条件,使子循环消失。此过程将在下一节详细介绍。 S: , 1 (11.5.3),目标函数为(11.5.4),即最小化经过所有城市的循环的长度,即所经过的所有弧
35、的总长度。 minimize (11.5.4) jCITIES: , =1 (11.5.5) iCITIES: , =1 (11.5.6) S: , 1 (11.5.7) i,jCITIES: 0,1 (11.5.8),11.5.2 模型实现与求解结果,int Ncities = 7; range Cities = 1Ncities;int DistCities,Cities =.;dvar int NextcCities; dvar boolean flyCities,Cities;dexpr int TotDist = sum(i,j in Cities:i!=j)Disti,j*flyi
36、,j;minimize TotDist;,subject toforall(i,j in Cities:i!=j)Distj,i=Disti,j;forall(i in Cities)sum(j in Cities:i!=j)flyi,j=1;forall(j in Cities)sum(i in Cities:i!=j)flyi,j=1;forall(i,j,k in Cities:i!=j,数据文件:,Dist=0 786 549 657 331 559 250786 0 668 979 593 224 905549 668 0 316 607 472 467657 979 316 0 890 769 400331 593 607 890 0 386 559559 224 472 769 386 0 681250 905 467 400 559 681 0;,图11.4:最优解,图11.3:不约束的情况,有三个子循环,