当前位置:文档之家› 第七章:CPLEX在公交乘务排班问题中的应用

第七章:CPLEX在公交乘务排班问题中的应用


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人的基础上,可 以继续优化排班方案。
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
例: 下面是某条线路的基本情况:
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分钟/ 班
二、公交乘务排班优化问题的数学模型及 其在CPLEX中的建模与求解
问题一 (首先考虑非节假日的最少班次问题) 1、数学模型的建立(1) 根据高峰期分布,将5 月非节假日一天的工作时间分为6个时段(如下图 所示),第i( i =1,2,3,4,5,6)个时段的时 长用Qi表示,发车间隔用mi表示,该时段内发车 班次数用ti表示。取合适的mi使得ti的总和最少。
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和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;
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; }
3、运行配置与求解 在所在OPL项目下面新建一个运行配置文件,命名 为“配置1”,将以上代码的mod文件添加进这个运 行配置中,再右键,立即运行则可以对这个问题进 行求解。 求解后的结果如下: // solution (optimal) with objective 82 t = [17 18 15 18 12 2] 据此,得到该线路非节假日的最少班次排班如下:
CPLEX在公交乘务排班问题中的应用源自一、公交乘务排班问题的概述
公交乘务排班问题属活动资源的优化利 用问题。一般是根据给定的乘务任务、乘务 规则等条件,考虑一定的优化目标,对乘务 员(组)的出乘时间、地点,担当的乘务任务、 时刻,退乘时间、地点等做出具体安排,以 确保一定周期内的所有乘务任务被执行。
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); }
相关主题