摘 要
我们就生活中垃圾运输的问题的调度方案予以研究。本文通过对问题的分析和合理的假设,采用规划的理论建立了单目标的非线性规划的数学模型。,运用软件得到了全局最优解,对此类问题的求解提供了一种较优的方案。
题中的问题(1)包含着垃圾量和运输费用的累积计算问题,因此,文中以运输车所花费用最少为目标函数,以运输车载重量的大小、当天必须将所有垃圾清理完等为约束条件,以运输车是否从一个垃圾站点到达另一个垃圾站点为决策变量,建立了使得运输费用最小的单目标的非线性规划模型。运用求解,得出了最优的运输路线为10条,此时运输所花费用为2335.77元。通过分析,发现只需6辆运输车(载重量为6吨)即可完成所有任务,且每辆运输车的工作时间均在4个小时左右。具体结果见文中表3。
问题(2),建立了以运行路径最短为目标的单目标非线性规划模型。从而求出了使铲车费用最少的3条运行路线,且各条路线的工作时间较均衡。因此,处理站需投入3台铲车才能完成所有装载任务,且求得铲车所花费用为202.0元,三辆铲车的具体运行路线见文中表4。文中,我们假定垃圾处理站的运输工作从晚21:00开始,根据各铲车的运输路线和所花时间的大小,将铲车和运输车相互配合进行工作的时间做出了详细的安排见表5。
问题(3),要求给出当有载重量为4吨、6吨、8吨三种运输车时的最优的调度方案。基于第(1)问中的模型,修改载重量的约束条件,用和分别求解,得出两种调度方案,但总的运输费用不变,均为2326.17元;对于方案一,有9条路径,分别需要4吨的运输车1辆;6吨的运输车2辆;8吨的运输车5辆,各运输车具体的运输线路见文中表8。对于方案二,有10条路径,分别需要4吨的运输车1辆;6吨的运输车1辆;8吨的运输车4辆,各运输车具体的运输线路见文中表10。
最后,对模型的优缺点进行了分析,并给出了模型的改进意见,对解决实际问题具有一定的指导意义。
关键字: 垃圾运输的调度;线性规划;最优解
问题的分析
这是一个便利问题,此问题的困难之处在于确定铲车的行走路线,并使得运输车工作时尽量不要等待铲车,才能使得运输车的工作时间满足题目的要求——每日平均工作四小时,为此,应该使铲车跟着运输车跑完一条线路,也就是说,应该使铲车铲完一条线路后再接着铲下一条线路。
第(1)问,对于运输车调度方案的设计,不能仅仅考虑使运输车的行走路线最短,因为此处还存在着垃圾的累积运输的花费问题,因此,我们的目标函数应该是使得所有运输的花费最少。在建模过程中,我们无需考虑投入的运输车台数,只需对各条路径所花费的时间进行和各运输车载重量约束即可,至于投入的车辆数,在各条路径确定后,计算出各路径运输所花费的时间,再根据题目中要求的每辆车平均工作时间为4小时左右进行计算即可。
第(2)问中,对于铲车的调度方案,因其无累积计算问题,因此只需要在已确定的各运输路径的基础上,使得铲车的行驶路径为最短。在此方案中,我们将已确定的各条路径看作为节点,建立使铲车运费最少(亦即路径最短)的非线性规划模型,在此需注意的是,由于垃圾运输为夜间运输,所以每辆铲车的工作时间也受到一定的限制,文中,我们假定铲车的工作时间为从(晚21:00~早6:00),因此每辆铲车的工作时间最多为9个小时,再由所有运输车完成任务所需的总时间判定所需铲车的台数,之后可以根据具体情况进行调整。同时应注意,由于运输车有工作时间的限制,而铲车没有严格的限制(除工作时间不能超过9小时以外),所以,在确定铲车出行的时间时,应保证只可让铲车等待运输车,而不能让运输车等待铲车。
对于第(3)问,是在第一问的基础上将对运输车载重的约束条件从不大于6吨改为不大于8吨,在求得各条路线中,对于垃圾量不大于4吨的路线,调用4吨的运输车;对于垃圾量在(4~6吨)之间的路线,调用6吨的运输车;对于垃圾量在(6~8吨)之间的路线,调用8吨的运输车。
一 模型假设
(1)假设各站点每天的垃圾量是不变的;
(2)假设各站点的垃圾都必须在当天清理完毕;
(3)不考虑运输车和铲车在行驶过程中出现的塞车、抛锚等耽误时间的情况;
(4)不允许运输车有超载现象;
(5)每个垃圾站点均位于街道旁,保证运输车和铲车行驶顺畅;
二 模型的建立及求解
1 符号说明
每天运输前第个垃圾站点的垃圾量;
第个垃圾站点向第个垃圾站点运输的垃圾量;
运输车是否从第个垃圾站点向第个垃圾站点运输的0-1变量;
第辆铲车是否从第条路径向第条路径运输的0-1变量;
第个垃圾站点和第个垃圾站点之间的距离;
第条路径到第条路径的有向距离;
垃圾运输车的单位量货物每公里的运输费用;
垃圾运输车和铲车每公里的空载费用;
铲车通过第条路径所需要的时间(包括在各垃圾站点装车的时间)
假设所需要的铲车的台数
2 模型的建立
2.1 运输车调度方案的模型
对于运输车的调度方案,我们建立单目标规划的非线性模型使得运输费用最小,模型如下。
2.1.1目标函数的建立
考虑使运输费用最小时,目标函数包括两个方面的费用:空载费用和重载费用。其中,空载费用为第37号站点直接到达的其他各点所花的费用;而重载费用为上一个点(除37号站点)到下一个点(包括37号站点)所花的费用,表示如下:
: |
|
2.1.2约束条件的确立
(1)对于各个垃圾站点,只有一辆运输车经过,即每个站点的运进点和运出点均是有且只有一个,即:
|
|
|
其中,
(2)运输车到达某个站点后,必须将此站点的所有垃圾带走:
|
(3)不允许出现自己往自己站点运输垃圾的现象,即当时有:
|
(4)不允许从第37号站点(垃圾处理站)运出垃圾,即:
|
(5)各点的垃圾都必须在当天清理完毕,不允许有滞留:
|
(6)各垃圾运输车不允许有超载现象,即每辆车的载重最多为6吨:
|
2.1.3单目标规划模型
在给出了目标函数和约束条件后,即可得到一个使得运输费用最小的单目标规划模型如下:
: |
(1)
|
2.2 铲车调度方案的模型
此模型的建立基于上问模型的结果,从以上运输车的调度方案得出共有10条路径,在此模型中,我们将10条路径分别看作10个节点,而把垃圾处理站看作为第11个节点(以下将各路径均称作节点),建立了使铲车行驶所需费用最小的模型。在此需要说明的是,由于运输车的路径已经确定,我们只能让铲车跟随着运输车,而不能让运输车在垃圾站点等待铲车。由此可以确定,铲车必须跟随着运输车行走完一条路径,才能转到其他路径继续工作。而对于各路径,其行走方案已定,所以各路径内的费用已经确定。因此,我们需要做的是,找出一种调度方案使铲车在各路径之间的行走所需的费用为最小。
2.2.1目标函数的建立
各路径内的费用已定,因此我们建立以下使铲车在各路径之间行走所需费用最小的目标函数如下:
|
2.2.2 约束条件的确立:
(1)对于1到10号的每个节点,只允许一辆铲车通过,且只通过一次:
|
|
|
(2)所有的铲车必须从第11号节点(垃圾处理站)出发,并最终回到11号节点,即从11号节点发出的铲车数和最终返回11号节点的铲车数均为N:
|
(3)为保证每辆铲车均从11号节点出发最终回到11号节点,且不重复已走的路径,则需控制铲车所走路径均为一个环,即对于每个节点,只要有铲车进入则必有铲车出,不进则无出,进与出的状态保持一致:
|
(4)对于每个节点,不允许出现铲车向自己节点运行的路径:
|
(5)不允许出现铲车的路径为,除11号节点以外,在其他节点相互运行的路径:
|
(6)由于垃圾的运输均在夜间进行,则每辆铲车的工作时间不能大于9个小时(即假定工作时间为从晚21:00~早6:00),另外,由于题目中没有给定铲车的运行速度,不妨假定其平均速度与运输车的平均速度相同,为40公里/小时,的约束条件为:
|
2.2.3铲车规划模型
在给出了目标函数和约束条件后,即可得到一个使得铲车运行费用最小的单目标规划模型如下:
(2) |
|
2.3 载重量不同的运输车调度方案模型
此问在第一问的基础上,通过改变垃圾运输车载重量的大小,从而得到垃圾处理厂在拥有不同载重量的运输车时,采用怎样的运输方案使得所花运输费用最少。此模型的目标函数与第一问中的运输车调度方案模型相同,只是在约束条件上将第(6)个约束条件中的载重最多为6吨变成最多为8吨,
: |
(3) |
从而可求出在拥有不同载重量运输车的情况下,各运输车的调度方案。
模型的求解
3 运输车调度方案模型的求解
利用LINGO10编程,对运输车调度方案的模型(1)进行求解,求得各垃圾站点的运输方案如表2所示,此时,求得将所有垃圾运回到37号站点运输车所需费用为2335.77元。
表2:各运输路径所包含的垃圾站点、运输量及所需时间
路径 |
包含的站点 |
运输垃圾总量 |
每条线路所需时间 |
1 |
37—30—29—27—37 |
5.3吨 |
3小时46分钟 |
2 |
37—28—26—21—25—19—37 |
5.7吨 |
3小时02分钟 |
3 |
37—36—23—33—32—37 |
5.5吨 |
2小时46分钟 |
4 |
37—24—18—35—20—37 |
5.2吨 |
2小时22分钟 |
5 |
37—34—17—16—2—37 |
5.0吨 |
2小时7分钟 |
6 |
37—15—13—7—4—37 |
5.6吨 |
2小时4分钟 |
7 |
37—14—31—5—6—37 |
5.85吨 |
1小时46分钟 |
8 |
37—22—10—37 |
3.3吨 |
1小时23分钟 |
9 |
37—12—8—3—37 |
5.55吨 |
1小时30分钟 |
10 |
37—11—9—1—37 |
4.0吨 |
1小时30分钟 |
从上表可以看出,对于这10条路径上的垃圾总量,有8条都超过了5吨,另两条也超过了载重量的一半,运输车得到了充分地利用,结果非常好。
各运输路径以图示表示如下:
图1:运输车行走路线图 |
由图1可以看出,10条路径中只有2条路径有交叉点,其他路径各自互不干扰,结果很理想。
由题目可知,每台运输车的平均工作时间为4小时,根据此条件对以上10条路径进行规划,发现用6台运输车即可按要求行走完10条路径,所以,处理站只需投入6台垃圾运输车即可完成任务。各运输车行走的路径分别表示如下:
表3:各运输车的行走路径、具体路线及所需时间
运输车编号 |
路径编号 |
行走路线 |
所需时间 |
第一辆 |
2 |
37—28—26—21—25—19—37 |
3小时02分钟 |
第二辆 |
1 |
37—30—29—27—37 |
3小时46分钟 |
第三辆 |
8 |
37—22—10—37 |
4小时9分钟 |
3 |
37—36—23—33—32—37 |
||
第四辆 |
9 |
37—12—8—3—37 |
3小时37分钟 |
5 |
37—34—17—16—2—37 |
||
第五辆 |
4 |
37—24—18—35—20—37 |
3小时52分钟 |
10 |
37—11—9—1—37 |
||
第六辆 |
6 |
37—15—13—7—4—37 |
3小时50分钟 |
7 |
37—14—31—5—6—37 |
由上表可发现,每辆运输车的运输时间均在4个小时左右,相差很少,很好地达到了时间上的要求,且结果很理想。
3.1铲车调度方案模型的求解
利用LINGO10编程,对铲车调度方案模型(2)进行求解,得到了使铲车运费最少的行走路线。此时,需要投入的铲车数为3台,且所有铲车完成任务所需费用为202.0元,各铲车的具体行驶路线及所花费的时间如下表.
表4:各铲车的具体行驶路线及所花费的时间
铲车 |
行走路径 |
具体路线 |
所需时间 |
第一台 |
8,9, 6,5 |
37—22—10—12—8—3—15—13—7—4—34—17—16—2—37 |
5小时22分 |
第二台 |
1,3,10 |
37—30—29—27—36—23—33—32—11—9—1—37 |
5小时50分 |
第三台 |
2,4,7 |
37—28—26—21—25—19—24—18—35—20—14—31—5—6—37 |
5小时36分 |
由上表可以看出3台铲车的工作时间均为5个多小时,相差不大,工作分配地非常合理。
各铲车的行驶路线表示在图上如图2所示:
图2:各铲车的具体行驶路线图 |
3.2铲车及运输车调度方案的具体时间安排
在问题的分析中,我们提到,由于垃圾运输是在夜间进行,因此,我们假定运输车及铲车的工作时间从晚21:00~早6:00,对于运输车调度方案,由于第三辆~第六辆都要运输两条路径上的垃圾,因此,需要确定这4辆运输车具体先行驶哪条路径,而此方案的确定依赖于铲车的行走方案。根据以上求得的各铲车和运输车工作所需时间的多少及铲车应配合运输车进行工作的原则,对他们的工作时间进行安排如下表所示。
表5:铲车及运输车相互配合的具体时间安排
铲车1:
运输路线 |
8 |
9 |
6 |
5 |
||||
包含站点 |
22—10 |
12—8—3 |
15—13—7—4 |
34—17—16—2 |
||||
时间及 车号 |
到达 时间 |
车辆 编号 |
到达 时间 |
车辆 编号 |
到达 时间 |
车辆 编号 |
到达 时间 |
车辆 编号 |
铲车 |
21:31 |
1 |
22:11 |
1 |
23:26 |
1 |
0:58 |
1 |
运输车 |
21:31 |
4 |
22:11 |
3 |
23:26 |
6 |
0:58 |
4 |
铲车2:
运输路线 |
1 |
3 |
10 |
|||
包含站点 |
30—29—27 |
36—23—33—32 |
11—9—1 |
|||
时间 |
到达 时间 |
车辆 编号 |
到达 时间 |
车辆 编号 |
到达 时间 |
车辆 编号 |
铲车 |
22:09 |
2 |
23:12 |
2 |
1:30 |
2 |
运输车 |
22:09 |
2 |
0:20 |
3 |
1:50 |
5 |
铲车3:
运输路线 |
2 |
4 |
7 |
|||
包含站点 |
28—26—21—25—19 |
24—18—35—20 |
14—31—5—6 |
|||
时间 |
到达 时间 |
车辆 编号 |
到达 时间 |
车辆 编号 |
到达 时间 |
车辆 编号 |
铲车 |
22:06 |
3 |
23:42 |
3 |
0:49 |
3 |
运输车 |
22:06 |
1 |
23:42 |
5 |
1:23 |
6 |
以上时间安排均是基于工作时间从晚21:00开始,从上表3和表4可以看出,每辆运输车和每台铲车的工作时间都不超过6个小时,因此,垃圾处理站可根据实际情况将工作开始的时间向前或向后推相应的时间即可。
由表5的时间安排可以确定出各运输车的具体行驶路线及出发、返回时间如表6所示.
表6:运输车的行走路线
运输车编号 |
从37号站点 出发时间 |
行走路线 |
返回37号 站点时间 |
第一辆 |
21:00 |
37—28—26—21—25—19—37 |
00:02 |
第二辆 |
21:00 |
37—30—29—27—37 |
00:46 |
第三辆 |
21:11 |
37—12—8—3—37 |
22:41 |
22:47 |
37—36—23—33—32—37 |
01:33 |
|
第四辆 |
21:00 |
37—22—10—37 |
22:23 |
0:15 |
37—34—17—16—2—37 |
02:22 |
|
第五辆 |
22:51 |
37—24—18—35—20—37 |
01:13 |
01:15 |
37—11—9—1—37 |
02:45 |
|
第六辆 |
22:44 |
37—15—13—7—4—37 |
0:48 |
0:50 |
37—14—31—5—6—37 |
02:36 |
3.3 载重量不同的运输车的调度方案
3.3.1 方案一
运用LINGO对模型(3)进行求解可以得到以下9条运输路径,以问题分析中运输车选择的原则即:对于垃圾量不大于4吨的路线,调用4吨的运输车;对于垃圾量在(4~6吨)之间的路线,调用6吨的运输车;对于垃圾量在(6~8吨)之间的路线,调用8吨的运输车来为各路径选择运输车,具体数据如表7所示。此情况下求得的运输费用为2326.17元。
表7:方案一的各运输各路径、运输的总垃圾量及运输所需时间
运输路径 |
包含的垃圾站点 |
运输总垃圾量 |
运输所需时间 |
1 |
12,10 |
4.2 吨 |
1.33小时 |
2 |
13,8 |
4.1 吨 |
1.38小时 |
3 |
16 |
1.5 吨 |
1.07小时 |
4 |
18,14,31,5,6 |
7.35 吨 |
2.23小时 |
5 |
24,17,3,1 |
4.45 吨 |
2.37小时 |
6 |
28,26,21,25,19,9 |
7.1 吨 |
3.20小时 |
7 |
30,29,27,15,11 |
7.8 吨 |
3.13小时 |
8 |
34,35,20,7,4,2 |
7.2 吨 |
2.45小时 |
9 |
36,23,33,32,22 |
7.3 吨 |
2.93小时 |
由以上各条路径上的垃圾总量的大小来对运输车辆进行选择,根据各路径运输所需时间的大小,对各辆运输车的行驶方案进行规划,得到结果如下表。
表8:不同载重量的运输车对应的方案一的线路安排
车辆 编号 |
车辆 选择 |
经过 路径 |
经过的节点 |
运输总 时间 |
第一辆 |
4吨 |
3 |
37 -16-37 |
1.07小时 |
第二辆 |
6吨 |
1,2 |
37-12-10-37-13-8-37 |
2.72小时 |
第三辆 |
6吨 |
5 |
37-24-17-3-1-37 |
2.37小时 |
第四辆 |
8吨 |
4 |
37-18-14-31-5-6-37 |
2.23小时 |
第五辆 |
8吨 |
6 |
37-28-26-21-25-19-9-37 |
3.20小时 |
第六辆 |
8吨 |
7 |
37-30-29-27-15-11-37 |
3.13小时 |
第七辆 |
8吨 |
8 |
37-34-35-20-7-4-2-37 |
2.45小时 |
第八辆 |
8吨 |
9 |
37-36-23-33-32-22-37 |
2.93小时 |
根据以上数据可得,当有载重量为4吨、6吨、8吨三种运输车时,需要各类载重的运输车辆分别为:对于4吨的运输车,需要1辆;对于6吨的运输车,需要3辆;对于8吨的运输车,需要5辆。
画出此时各运输车的行走路线图如图3所示。
图3:方案一中不同载重量情况下各运输车行走的路线图 |
3.3.2方案二
运用MATLAB编程对模型(3)求解,可以得到另外一种调度方案,共有10条运输路径,所花费用与LINGO求解相同,为2326.17元。各路径的垃圾总量、运输所需时间分别表示如下:
表9:方案二的各路径包含的垃圾站点、垃圾总量及运输所需时间
运输路径 |
包含的垃圾站点 |
运输的总垃圾量 |
运输所需时间 |
1 |
30,29,27,15 |
6.7 |
2.97小时 |
2 |
28,26,21,25,19,14 |
7.5 |
3.2小时 |
3 |
36,23,33,32,22 |
7.3 |
2.93小时 |
4 |
24,18,35,20,31 |
7.1 |
2.53小时 |
5 |
34,17,16,6, |
4.35 |
2.12小时 |
6 |
13,7,4,2 |
5.7 |
1.72小时 |
7 |
12,8,3,1 |
7.05 |
1.67小时 |
8 |
11,10 |
2.6 |
1.33小时 |
9 |
5 |
1.3 |
0.87小时 |
10 |
9 |
1.4 |
0.77小时 |
同方案一,可根据各路径的垃圾总量选择运输车辆,根据各路径运输所花时间对运输车的行走路径进行安排。得到具体的结果如下表10所示:
表10:方案二各运输车的线路安排
车辆 编号 |
车辆 选择 |
经过 线路 |
经过节点 |
运输所 需时间 |
第一辆 |
4吨 |
8 |
37-11-10-37-5-37-9-37 |
3.02小时 |
第二辆 |
6吨 |
5,6 |
37-34-17-16-6-37-13- 4-2-37 |
3.84小时 |
第三辆 |
8吨 |
1 |
37-30-29-27-15-37 |
2.97小时 |
第四辆 |
8吨 |
2 |
37-28-21-25-19-14-37 |
3.2小时 |
第五辆 |
8吨 |
3 |
37-36-23-33-32-22-37 |
2.93小时 |
第六辆 |
8吨 |
4,7 |
37-24-18-35-20-31-37- 12-8-3-1-37 |
4.2小时 |
对于方案二,由以上数据可得:当有载重量为4吨、6吨、8吨三种运输车时,需要各类载重的运输车辆分别为:对于4吨的运输车,需要2辆;对于6吨的运输车,需要1辆;对于8吨的运输车,需要4辆。相比较来说,对于两种方案,方案二的结果较好,虽然运输路径较方案一多一条,但是需要的车辆数却比方案一要少一辆,且运输车的利用率较高。
相应的各辆运输车的行走路线图如下:
图4:方案二中不同载重量情况下各运输车行走的路线图 |
四 结果分析
由于题目中没有给出司机的工资额,因此文中只考虑了垃圾的运输费用。但实际生活中,对于垃圾处理站来说,垃圾的运输所需花费不仅包括运输费用还包括付给司机的工资。运输路径越长,运输所需要的时间就越长,所需要的运输车辆越多,从而需要更多的司机,因而花费更大。因此,在给出了司机工资额的情况下,目标函数中还包括付给司机的工资。另外,此时目标函数不再是单目标函数,而是双目标函数。第二个目标函数是使得运输车行驶的路径最短。
五 模型评价
模型的优点
(1)此问题为典型的NP难问题,规划模型的规模较大,共有2000多个变量,直接求解比较困难。由于在设计算法时采用了一些技巧,将变量减少到800多个,从而求出了最优的结果。
(2)模型中将各约束条件均考虑在内,对问题的理解较全面,因此求出的结果为最优。
(3)克服了NP难问题中很难得到最优解的问题,通过对算法的技巧性设计,使得此问题得以圆满的解决
模型的缺点
此问题在建模中存在很多难点,因此模型中只考虑了,对于一个垃圾站点,一旦有运输车到此运输,则必须将所有垃圾带走,而不能分批次运输,从而导致第8和第10条路径的总垃圾量分别为3.3和4吨,运输量太少的情况,运输车不能得到充分地利用。
六 参考文献
韩中庚.数学建模竞赛·获奖论文精选与点评.北京:科学出版社,2007.
谢金星,薛毅.优化建模与LINDO/LINGO软件.北京:清华大学出版社.2006.
Winston,W.L.运筹学·应用范例与解法.北京:清华大学出版社.2006.
9.附录
附件1:运输车调度方案的程序
sets:
jiedian/1..37/:s,m;
link1(jiedian,jiedian):x,u,d;
endsets
data:
a=0.4;
b=1.8;
s=?;
d=?;
enddata
min=F;
!运输费用;
F=@sum(jiedian(t)|t#le#36:a*d(37,t)*u(37,t))+@sum(link1(i,j):b*x(i,j)*d(i,j));
!运输时间;
!T=@sum(link1(i,j):d(i,j)*u(i,j)/40)+1/6*@sum(link1(t,k)|t#le#36:u(t,k))+@sum(jiedian(t)|t#le#36:d(37,t)*@sum(jiedian(i):u(t,i)-u(i,t)))/40;
!37号节点没有垃圾运出;
@for(jiedian(j):x(37,j)=0);
!最终垃圾全部被运到37号节点;
@sum(jiedian(i)|i#le#36:x(i,37))=51;
!定义0-1变量;
@for(link1:@bin(u));
!不允许各节点自己往自己运输垃圾;
@for(jiedian(i)|i#le#36:x(i,i)=0);
!每个站点只允许一辆车在此处运出垃圾;
@for(jiedian(i)|i#le#36:@sum(jiedian(j):u(i,j))=1);
!每个站点只允许一辆车在此处运进垃圾;
@for(jiedian(i)|i#le#36:@sum(jiedian(j):u(j,i))=1);
!运出量等于运进来的加上该站点原有的垃圾量;
@for(link1(t,i)|t#le#36:x(t,i)=u(t,i)*(@sum(jiedian(j):x(j,t))+s(t)));
!每辆车的载重不超过6吨;
@for(link1(i,j)|i#le#36:x(i,j)<=6);
@for(jiedian(i)|i#le#36:u(1,i)=0);
@for(jiedian(i)|i#le#36:x(1,i)=0);
@for(jiedian(i)|i#le#36:u(2,i)=0);
@for(jiedian(i)|i#le#36:x(2,i)=0);
@for(jiedian(i)|i#le#36#and#i#ne#1:u(3,i)=0);
@for(jiedian(i)|i#le#36#and#i#ne#1:x(3,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#3:u(4,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#3:x(4,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#3#and#i#ne#6:u(5,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#3#and#i#ne#6:x(5,i)=0);
@for(jiedian(i)|i#le#36:u(6,i)=0);
@for(jiedian(i)|i#le#36:x(6,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#5#and#i#ne#6:u(7,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#5#and#i#ne#6:x(7,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#4:u(8,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#4:x(8,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#2:u(9,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#2:x(9,i)=0);
@for(jiedian(i)|i#le#36:u(10,i)=0);
@for(jiedian(i)|i#le#36:x(10,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#2#and#i#ne#9#and#i#ne#10:u(11,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#2#and#i#ne#9#and#i#ne#10:x(11,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#4#and#i#ne#9#and#i#ne#10#and#i#ne#8:u(12,i)=0);
u(13,5)=0;x(13,5)=0;
@for(jiedian(i)|i#le#36#and#i#ge#4#and#i#ne#9#and#i#ne#10#and#i#ne#8:x(12,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#10:u(13,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#10:x(13,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#10#and#i#ne#31:u(14,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#10#and#i#ne#31:x(14,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#14:u(15,i)=0);
u(15,5)=0;x(15,5)=0;
@for(jiedian(i)|i#le#36#and#i#ge#14:x(15,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#7:u(16,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#7:x(16,i)=0);
@for(jiedian(i)|i#le#5#and#i#ne#2:u(16,i)=0);
@for(jiedian(i)|i#le#5#and#i#ne#2:x(16,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#7:u(17,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#7:x(17,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#10#and#i#ne#14#and#i#ne#16#and#i#ne#20#and#i#ne#31:u(18,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#10#and#i#ne#14#and#i#ne#16#and#i#ne#20#and#i#ne#31:x(18,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#8:u(20,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#8:x(20,i)=0);
@for(jiedian(i)|i#le#36#and#i#ne#10:u(22,i)=0);
@for(jiedian(i)|i#le#36#and#i#ne#10:x(22,i)=0);
!;
@for(jiedian(i)|i#le#36#and#i#ge#11:u(19,i)=0);u(19,11)=0;
@for(jiedian(i)|i#le#36#and#i#ge#11:x(19,i)=0);x(19,11)=0;
@for(jiedian(i)|i#le#36#and#i#ge#21#and#i#ne#25#and#i#ne#35:u(21,i)=0);u(21,15)=0;u(21,17)=0;u(21,18)=0;
@for(jiedian(i)|i#le#36#and#i#ge#21#and#i#ne#25#and#i#ne#35:x(21,i)=0);x(21,15)=0;x(21,17)=0;x(21,18)=0;
@for(jiedian(i)|i#le#36#and#i#ge#14#and#i#ne#15#and#i#ne#22#and#i#ne#32#and#i#ne#33:u(23,i)=0);u(23,5)=0; @for(jiedian(i)|i#le#36#and#i#ge#14#and#i#ne#15#and#i#ne#22#and#i#ne#32#and#i#ne#33:x(23,i)=0);x(23,5)=0;
@for(jiedian(i)|i#le#36#and#i#ge#21#and#i#ne#25#and#i#ne#31#and#i#ne#35:u(24,i)=0);u(24,15)=0;u(24,11)=0; @for(jiedian(i)|i#le#36#and#i#ge#21#and#i#ne#25#and#i#ne#31#and#i#ne#35:x(24,i)=0);x(24,15)=0;x(24,11)=0;
@for(jiedian(i)|i#le#36#and#i#ge#15#and#i#ne#19#and#i#ne#20#and#i#ne#31:u(25,i)=0);u(25,11)=0; @for(jiedian(i)|i#le#36#and#i#ge#15#and#i#ne#19#and#i#ne#20#and#i#ne#31:x(25,i)=0);x(25,11)=0;
@for(jiedian(i)|i#le#36#and#i#ge#22#and#i#ne#25#and#i#ne#31#and#i#ne#35:u(26,i)=0);u(23,17)=0; @for(jiedian(i)|i#le#36#and#i#ge#22#and#i#ne#25#and#i#ne#31#and#i#ne#35:x(26,i)=0);x(23,17)=0;
@for(jiedian(i)|i#le#36#and#i#ge#16#and#i#ne#19#and#i#ne#22#and#i#ne#31:u(27,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#16#and#i#ne#19#and#i#ne#22#and#i#ne#31:x(27,i)=0);
u(28,29)=0;u(28,23)=0;u(28,30)=0;u(28,33)=0;u(28,36)=0;
u(29,17)=0;u(29,18)=0;u(29,23)=0;u(29,24)=0;u(29,26)=0;u(29,28)=0;u(29,30)=0;u(29,34)=0;u(29,36)=0;
u(30,24)=0;u(30,28)=0;u(30,34)=0;u(30,36)=0;
@for(jiedian(i)|i#le#36#and#i#ge#7:u(31,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#7:x(31,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#4#and#i#ne#9#and#i#ne#10#and#i#ne#11#and#i#ne#22:u(32,i)=0); @for(jiedian(i)|i#le#36#and#i#ge#4#and#i#ne#9#and#i#ne#10#and#i#ne#11#and#i#ne#22:x(32,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#13#and#i#ne#22#and#i#ne#32:u(33,i)=0);@for(jiedian(i)|i#le#7#and#i#ge#5:u(33,i)=0); @for(jiedian(i)|i#le#36#and#i#ge#13#and#i#ne#22#and#i#ne#32:x(33,i)=0);@for(jiedian(i)|i#le#7#and#i#ge#5:x(33,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#9#and#i#ne#16#and#i#ne#17#and#i#ne#20#and#i#ne#31#and#i#ne#35:u(34,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#9#and#i#ne#16#and#i#ne#17#and#i#ne#20#and#i#ne#31#and#i#ne#35:x(34,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#9#and#i#ne#20#and#i#ne#31:u(35,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#9#and#i#ne#20#and#i#ne#31:x(35,i)=0);
@for(jiedian(i)|i#le#36#and#i#ge#16#and#i#ne#19#and#i#ne#22#and#i#ne#23#and#i#ne#31#and#i#ne#32#and#i#ne#33:u(36,i)=0);
for(jiedian(i)|i#le#36#and#i#ge#16#and#i#ne#19#and#i#ne#22#and#i#ne#23#and#i#ne#31#and#i#ne#32#and#i#ne#33:x(36,i)=0);
附件2:铲车调度方案的程序
model:
data:
N=3;
enddata
sets:
number/1..N/:tt;
jiedian/1..11/:t;
luojing(jiedian,jiedian):d;
variable(jiedian,jiedian,number):u;
link(jiedian,number);
endsets
data:
t=?;
d=?;
enddata
!目标函数;
min=@sum(variable(i,j,k):d(i,j)*u(i,j,k));
!除11号节点外每个圈只有一个入点;
@for(jiedian(j)|j#ne#11:@sum(link(i,k):u(i,j,k))=1);
!除11号节点外每个圈只有一个出点;
@for(jiedian(i)|i#ne#11:@sum(link(j,k):u(i,j,k))=1);
!每个圈都以11号节点为起点;
@for(number(k):@sum(jiedian(j):u(11,j,k))=1);
!每个圈都以11号节点为终点;
@for(number(k):@sum(jiedian(i):u(i,11,k))=1);
!每个圈中任一点都不从自身到自身;
@for(link(i,k):u(i,i,k)=0);
!每个圈所用时间不超过9小时;
@for(number(k):@sum(luojing(i,j):d(i,j)*u(i,j,k)/40)+@sum(luojing(i,j):t(j)*u(i,j,k))<9);
!变量u为(0-1)变量;
@for(variable:@bin(u));
!闭和路径约束;
@for(number(k):@for(jiedian(t):@sum(jiedian(j):u(t,j,k))=@sum(jiedian(i):u(i,t,k))));
!输出每个圈所需时间时间;
@for(number(k):tt=@sum(luojing(i,j):d(i,j)*u(i,j,k)/40)+@sum(luojing(i,j):t(j)*u(i,j,k)));
@for(variable(t,i,k)|t#ne#11#and#i#ne#11:u(i,t,k)+u(t,i,k)<=1);