第七章:CPLEX在公交乘务排班问题中的应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Q["T1"]+Q["T2"]+Q["T3"]+Q["T4"]<=t["T1"]*m["T1"]+t["T2"]*m["T2"]+t["T3"]* m["T3"]+t["T4"]*m["T4"]; t["T1"]*m["T1"]+t["T2"]*m["T2"]+t["T3"]*m["T3"]+t["T4"]*m["T4"]+(t["T5"]1)*m["T5"]<=Q["T1"]+Q["T2"]+Q["T3"]+Q["T4"]+Q["T5"]; Q["T1"]+Q["T2"]+Q["T3"]+Q["T4"]+Q["T5"]<=t["T1"]*m["T1"]+t["T2"]*m["T2"]+ t["T3"]*m["T3"]+t["T4"]*m["T4"]+t["T5"]*m["T5"]; t["T1"]*m["T1"]+t["T2"]*m["T2"]+t["T3"]*m["T3"]+t["T4"]*m["T4"]+t["T5"]*m[ "T5"]+(t["T6"]1)*m["T6"]<=Q["T1"]+Q["T2"]+Q["T3"]+Q["T4"]+Q["T5"]+Q["T6"]; Q["T1"]+Q["T2"]+Q["T3"]+Q["T4"]+Q["T5"]+Q["T6"]<=t["T1"]*m["T1"]+t["T2"]* m["T2"]+t["T3"]*m["T3"]+t["T4"]*m["T4"]+t["T5"]*m["T5"]+t["T6"]*m["T6"]; } execute DISPLAY { writeln("t = ",t); }
minimize sum(o in Times) t[o]; subject to { (t["T1"]-1)*m["T1"]<=Q["T1"]; Q["T1"]<=t["T1"]*m["T1"]; t["T1"]*m["T1"]+(t["T2"]-1)*m["T2"]<=Q["T1"]+Q["T2"]; Q["T1"]+Q["T2"]<=t["T1"]*m["T1"]+t["T2"]*m["T2"]; t["T1"]*m["T1"]+t["T2"]*m["T2"]+(t["T3"]1)*m["T3"]<=Q["T1"]+Q["T2"]+Q["T3"]; Q["T1"]+Q["T2"]+Q["T3"]<=t["T1"]*m["T1"]+t["T2"]*m["T2"]+t["T3"]*m["T3 "]; t["T1"]*m["T1"]+t["T2"]*m["T2"]+t["T3"]*m["T3"]+(t["T4"]1)*m["T4"]<=Q["T1"]+Q["T2"]+Q["T3"]+Q["T4"];
例: 下面是某条线路的基本情况:
1、该线路的首末班车时间 冬令(12月~3月):6:20~18:10,夏令(4月~11月): 6:15~18:20 2、该线路发车间隔 平时高峰期(6:00~8:30, 11:30~13:30, 6:30~18:00) : 4~8分钟/班, 平时非高峰期:8~10分钟/班; 节假日:5~10分钟/班 3、该线路的运行时间 非高峰期:80~85分钟/班;高峰期:100~120分钟/ 班
问题的基本元素和各元素的基本属性:
1)公交线路:具有出发站、出发时刻、到达站、 到达时刻、中途停站等基本属性; 2)乘务员类型(组):包括司机、售票员等属性; 3)乘务规则:包括间休时间、工作时间、休息时 间、乘务周期、月工时等乘务值乘规则。 4)目标函数:乘务成本最小、需要的乘务员数量最 少等。 5)约束条件:乘务员的工作时间必须满足乘务规则; 每个线路、每个班次都必须有乘务员值乘;乘务员 劳动负衡均衡等约束条件。
二、公交乘务排班优化问题的数学模型及 其在CPLEX中的建模与求解
问题一 (首先考虑非节假日的最少班次问题) 1、数学模型的建立(1) 根据高峰期分布,将5 月非节假日一天的工作时间分为6个时段(如下图 所示),第i( i =1,2,3,4,5,6)个时段的时 长用Qi表示,发车间隔用mi表示,该时段内发车 班次数用ti表示。取合适的mi使得ti的总和最少。
目标函数是为了寻求一天内的发车班次最少; 约束条件1和2是为了确保每个时段的发车时间不少于 该时段的时长,; 约束条件3和4是各个时段发车间隔范围的约束。
(2)用Q表示节假日一天的工作时长,发车间隔用 m表示,则例1中节假日最少班次的数学公式为:
2、模型的实例编码语言 如果只建立一个mod文件的话,假如命名为 “paiban1.mod”,例1中非节假日排班模型的 OPL建模语言可以是: {string} Times ={"T1", "T2", "T3", "T4", "T5", "T6"}; float Q[Times] = [135, 180, 120, 180, 90, 20]; float m[Times] = [8, 10, 8, 10, 8, 10]; dvar int+ t[Times] in 0..50;
execute DISPLAY { writeln("x = ",x); }
2、模型的实例编码语言(2) 如果建立mod文件和数据文件分开,假如命名为“paiban3.mod”,此模型的语言可以是: {string} Categories =...;//每个司机所有可能的排班情况 tuple paiban {int j;int k;} paiban paibans[Categories]=...;高峰班次数 int gaofeng=...; int pingfeng=...;//平峰的班次数 dvar int+ x[Categories];//决策变量是每种排班情况的司机数 minimize sum(o in Categories) x[o];//以司机数最小为目标 subject to {sum(o in Categories) x[o] * paibans[o].j== gaofeng; sum( o in Categories ) paibans[o].k * x[o] == pingfeng; } 数据文件为: Categories ={"C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", "C11", "C12", "C13", "C14", "C15", "C16", "C17", "C18", "C19"}; paibans=[<0,1>, <0,2>,<0,3>,<0,4>,<0,5>,<1,0>,<1,1>,<1,2>,<1,3>,<1,4>,<2,0>,<2,1>,<2,2>,<2,3>,<3,0>,<3,1>,<3,2>, <4,0>,<4,1>]; gaofeng=44; pingfeng=38;
一、非节假日 , 1、数学模型的建立 对于非节假日,问题一已经求解出一天内高峰班次为44,非高 峰班次为38。 故所有司机被安排的高峰班次之和为44,即:
来自百度文库a
j 1
s
s
j
xj
44
所有司机被安排的非高峰班次之和为38,即:
b
j 1
j
x j 38
由于高峰班次运行时间最少为100分钟,非高峰班次运行 时间最少为80分钟,司机每天上班时间不超过8小时(480 分钟),即:
变量及符号说明: T1: T2: R1 : R2 : S: xj : 非节假日所有公交车运行时间之和; 节假日所有公交车运行时间之和; 非节假日一天内需要的最少司机人数; 节假日一天内需要的最少司机人数; 非节假日不同值乘情况数; 被安排为第j情况的司机数;
a j : 非节日一天内一位司机承担第j种情况的非高峰班次数; b j : 非节假日天内一位司机承担第j种情况的高峰班次数; ci : 节假日一天内第i个司机承担的班次数。
规定: (1)司机每天上班时间不超过8小时; (2)司机连续开车不得超过4小时; (3)每名司机至少每月完成120班次。 问题一:针对五月份的节假日和非节假日,分别 求出每日最少班次总数; 问题二:阐述你对上述规定的理解,并根据你的 理解建立适当的数学模型,合理地设计五月份该 线路的司机排班方案。(给出需要的司机数,及 司机的值乘班次)
6:15
8:30
11:30
13:30
16:30
18:00 18:20
5月非节假日时段划分
则例1中五月份非节假日排班的数学模型可以是:
ti mi Qi t m m Q i i i i s.t. 8 mi 10 4 mi 8 i 1, 2,3, 4,5, 6 i 1, 2,3, 4,5, 6 i 2, 4, 6 i 1,3,5
3、运行配置与求解 在所在OPL项目下面新建一个运行配置文件,命名为“配置2”, 将以上代码的mod文件添加进这个运行配置中,再右键,立即 运行则可以对这个问题进行求解。 求解后的结果如下: // solution (optimal) with objective 17 x = [0 1 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 11] 该结果给出了一天需要的最少司机人数为17人,同时给出了一 个可行的排班方案,即17位司机中,有1位采用第2种排班情况, 有5位采用第5种排班情况,有11位采用第19种排班情况。 问题的引申: 得到的排班方案能够保证需要的司机人数最少,但是并不能保 证排班方案最优。因此,在确保司机人数为17人的基础上,可 以继续优化排班方案。
针对节假日,全天的发车间隔取最大为10min,根据公式可 得最少班次为72.5,即73班。
问题二:阐述你对上述规定的理解,并根据你的理 解建立适当的数学模型,合理地设计五月份该线路 的司机排班方案。(给出需要的司机数,及司机的 值乘班次)
提示:在非节假日,司机值乘的班次有高峰期和非高峰期 之分,所以排班方案应该给出司机承担的高峰期班次和非 高峰期班次。可以首先求出满足排班规定的所有高峰期班 次数和非高峰期班次数组合。
100 a j 80 b j 480
0 aj 5 0 bj 6
一天内所有公交车运行时间之和:
T 1 38 80 44 100
一天所需的司机数R1有:
R1 T 1 / 480
R1 16
根据 a j 和 b j 的取值范围,可知在一天内的值乘任务有且
CPLEX在公交乘务排班问题中的应用
一、公交乘务排班问题的概述
公交乘务排班问题属活动资源的优化利 用问题。一般是根据给定的乘务任务、乘务 规则等条件,考虑一定的优化目标,对乘务 员(组)的出乘时间、地点,担当的乘务任务、 时刻,退乘时间、地点等做出具体安排,以 确保一定周期内的所有乘务任务被执行。
3、运行配置与求解 在所在OPL项目下面新建一个运行配置文件,命名 为“配置1”,将以上代码的mod文件添加进这个运 行配置中,再右键,立即运行则可以对这个问题进 行求解。 求解后的结果如下: // solution (optimal) with objective 82 t = [17 18 15 18 12 2] 据此,得到该线路非节假日的最少班次排班如下:
j 1 j 1
S
S
仅有以下19种情况,即S=19:
xj代表被安排为第j种情况的司机数。 构建数学模型如下:
a
j 1
s
s
j
xj
44
b
j 1
j
x j 38
x j 0 且为整数 j 1,2,, s
2、模型的实例编码语言(1) 如果只建立一个mod文件的话,假如命名为“paiban2.mod”,此模型的OPL建模语言可以是: {string} Categories ={"C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", "C11", "C12", "C13", "C14", "C15", "C16", "C17", "C18", "C19"}; int a[Categories] = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4]; int b[Categories] = [1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 0, 1, 2, 3, 0, 1, 2, 0, 1]; dvar int+ x[Categories] in 0..50; minimize sum(o in Categories) x[o]; subject to { sum( o in Categories ) a[o]*x[o] == 44; sum( o in Categories ) b[o]*x[o] == 38; }