《优化技术实验报告》(附全部可运行代码)校车排版问题建模与分析-CPLEX与MATLAB混合编程

一、问题描述

为有效减少学生在旅途中接触人流造成新馆传播的风险,同时提高学生对学校的归属感,学校每年都会安排大巴车送学生前往高铁站以及飞机场。然而,学生们车票的发车时间比较分散,而学校能够安排的车辆有限。如何安排每趟车的发车时间,使得能够运送尽可能多的学生前往相应车站,并减少学生到站后的等待时间,是一项复杂的优化问题。为了更好的安排车辆,拟对该问题进行建模分析,以更科学合理的规划班车的发车时间。在这个问题中,我们假设学校共有20辆大巴车,共计2000名学生需要前往各自的目的地。

二、模型建立

(一)整数规划数学模型

为了更好的表述模型,定义符号如下:
在这里插入图片描述

决策变量为:
在这里插入图片描述

那么,问题的优化目标可以表示为,运送最多的学生前往其相应的目的地:
在这里插入图片描述

约束条件可以表示为:

(1)对于每个学生来说,只能有一个时刻出发,或者不出发。
在这里插入图片描述
(2)对于t出发前往高铁站和机场的车辆来说,每趟车最多乘坐45人,最少乘坐25人。值得注意的是,为了模型的简便, D e s t i n a t i o n i Destinatio{{n}_{i}} Destinationi=0表示目的地为高铁站, D e s t i n a t i o n i Destinatio{{n}_{i}} Destinationi=1表示目的地为机场。
在这里插入图片描述

(3)车辆只在7点钟以后才发车
在这里插入图片描述
(4)对于所有的学生,其等待时间应该在30分钟到2小时之间。必须提前30分钟到达,做好准备。
在这里插入图片描述
(5)车辆数量约束。对于前往高铁站的车辆来说,由于单趟只需要30分钟,因此外出车辆数量等于前一时刻派出的车辆。对于前往机场的车辆来说,单趟需要1小时,往返需要2小时,因此外出车辆等于前面三个时刻排除车辆的总和。对于任意时刻,所有的车辆数相加必须小于学校拥有的总车辆数。
在这里插入图片描述

(二)约束规划数学模型

在这一节中,我们尝试构建上述问题的约束规划模型。在整数规划模型的基础上,引入区间决策变量 s t u d e n t s students students,其定义如下:

dvar interval students[i in Student] optional size
(destination[i]*timeToairport+(1-destination[i])*timeTotrain);

该变量表示每个学生前往相应目的地的区间。因此,等待时间可以表示为
在这里插入图片描述
相应的,目标函数需要更改为:
在这里插入图片描述

在整数规划模型中,我们引入了决策变量 x i t {{x}_{it}} xit来表示学生i乘坐t时刻发车的车前往目的地,在约束规划模型中,引入的区间决策变量可以大大简化其他约束条件的表述,但是我们还需要增加如下约束,其他约束与整数规划模型保持一致。
在这里插入图片描述

三、数据获取

在问题中,我们已经假定了学校共有20辆车和2000名学生,需要获取的数据有所有学生的目的地以及其购买的车票的发车时间,一般来说,学校会在放假之前,统计学生的预计出发时间,并以此来安排车辆的发车班次等。对于本次实验,我们拟通过随机生成的方式来产生这些数据。

对于发车时间,我们可以假定在下午12点以及晚上18点发车的学生人数最多(想吃过午饭或者吃过晚饭再出行),那么我们可以构建一个具有双峰的正态分布函数。即出发时间服从以下分布:

d e p a r t T i m e ∼ N ( 24 , σ 2 ) + N ( 36 , σ 2 ) 2 departTime\sim \frac{N(24,{\sigma }^{2})+N(36,{{\sigma }{2}})}{2} departTime2N(24,σ2)+N(36,σ2)

对于学生的目的地来说,我们可以假定前往高铁站与前往机场的人数比为6:4(选择高铁出行的人数更多)。使用如下Matlab代码随机生成本问题的数据:


r=0.5;mu1=24;sigma1=3;mu2=36;sigma2=3;n_stu=2000;

x=zeros(1,n_stu);y=zeros(1,n_stu);

for i=1:n_stu

r1=rand;

x(i)=round((mu2+sigma2*randn)*heaviside(r1-r)+(mu1+sigma1*randn)*heaviside(r-r1));

if rand\>0.4

y(i)=0;

else

y(i)=1;

end

end

因此,我们可以获得以下的出行数据分布图。
在这里插入图片描述
图1 学生车票发车时间及乘车地点分布情况

四、实验分析

(一)实验结果分析

在本次实验中,我们假设了学校共有20辆大巴车参与运送任务,共有2000名学生需要前往相应的目的地。首先,我们使用了整数规划方法对上述模型进行求解,主程序如附录所示。

表1 实验结果

车辆数量高峰发车数量能运送的总人数最小载客率最大载客率平均载客率
207198544.4%94.8%61.4%

表2 未乘车人员情况分析

编号1266179741147134413451387155419001941
目的地1000110110
预计发车时间17461614171715171646

结果如表1和表2所示。在高峰出行段,发往高铁站方向共有5趟车,高峰出行发生在11:30。这与我们预想的较晚。此外,这种情况下我们发现,客车的载客率其实是不高的,平均只有61.4%,座位相对宽松,客车资源利用率较低。此外,我们对未能乘车的人员进行了分析,发现其预计的车票发车时间全部小于17(8:30)或者大于46(23:00)。由于客车最早发车时间为7:30,在这种约束条件下,如果这些学生登上早班车,其到达目的地后准备时间不足,不能满足约束。因此,只能通过自己乘坐其他交通方式前往。
在这里插入图片描述
图2 学生出发时间及到达时间分布

在这里插入图片描述
图3 班车发车时间及发车数量分布

图2和图3分别展示了学生出发时间分布以及预计的班车发车时间和发车数量分布图。从图2可以看出,学生的到达时间分布与图1中所示学生车票的发车时间分布较为接近,这也印证了我们所提模型的正确性。另外,我们可以发现,前往机场的班车在19:00为末班车,这是因为,未能登车的其他学生,预计的发车时间为46(23:00),如果登上末班车,那么其等待时间为3小时。而我们设置了所有学生的等待时间小于2小时的约束。可以预测的是,如果将最大等待时间约束改为3小时,那么能运送的学生数量将提高。

值得注意的是,我们还提出了约束规划模型,并且根据相关模型编写了约束规划的CPLEX程序,如附录所示。通过实验,其结果与整数规划一致,在此不再赘述。

总体来说,实验结果符合我们的预期,在满足所有约束条件的情况下,优化结果可以在一定程度上真实反映学校的情况。

(二)车辆数量对运输学生的影响

为了研究学校车辆数量对本次运送任务的影响,我们保持其他变量不变,调整车辆数量变量,进行多次实验。其结果如表3所示。

表3 不同车辆数量下最优结果展示

车辆数量高峰发车数量能运送的总人数最小载客率最大载客率平均载客率
207198544.4%94.8%61.4%
197198544.4%85%58.6%
186198544.4%77.3%60.4%
176198544.4%98.5%63%
164198544.4%100%75.1%
155198544.4%94.4%60.4%
147198544.4%87.8%63.4%
137198544.4%86.4%61.6%
124198544.4%94.8%70.7%
114198544.4%96.7%72.3%
105198544.4%100%72%
94198544.4%100%75.6%
83198544.4%100%84.3%
73198550%100%93.1%
63181945.7%100%94.5%
53161851.1%100%96.3%
43140244.4%100%93.4%
32112357.8%100%94.7%
2177455.6%100%95.6%

从表3中可以看出,当车辆数量在8-20之间时,问题的结果随着车辆数量的变化没有发生明显的改变。这是因为,车辆数量在8辆以上时,能够完整的运送全部满足约束的学生前往相应的目的地。在车辆数量减少的过程中,平均载客率明显提升。

当车辆数为6时,载客人数出现了明显的降低,从1985人减到了1819人。可以看出,车辆数为6已经无法运送全部学生前往相应的目的地。在此之后,随着车辆数的降低,能运送的学生总人数、平均载客率均会出现明显变化。图4现实了当学校车辆数为6时,相关的结果数据分布图。通过与图2和图3比较不难发现,为了在有限的条件下让更多学生到达目的地,学生们的出发时间变得较为集中,同时客车的载客率也达到了94%以上,较为拥挤。综合学生的体验和学校的资源分配,我们通过本次实验建议学校分配9辆大巴车进行运送任务(能全部完成运送任务,载客率75.6%)。

在这里插入图片描述
在这里插入图片描述

图4 车辆数为6时结果数据展示

五、总结

本次实验探究了我校学生放假前往高铁站、飞机场的运输方法。首先我们构建了该问题的整数规划模型,并结合所学知识,在整数规划模型的基础上,构建了约束规划模型。接着,通过随机模拟的方法生成了一系列数据,包括学生购买车票的发车时间以及学生前往的地点等。最后,通过实验分析,发现车辆数在9时,既不会浪费宝贵的客车资源,又能够全部运送学生前往目的地且学生们的体验较佳。整体来说,实验结果符合预期,贴近实际,模型的正确性以及程序的正确性得到了验证。

六、附录(如需其他代码,可评论私信回复邮箱)

(一)整数规划主程序

int	n_stu	= ...;
int	n_bus	= 6;
int	n_t	= 48;

range	Student = 1..n_stu;
range	T	= 1..n_t;


int	timeTotrain		= 1;
int	timeToairport		= 2;
int	destination[Student]	= ...;
float	departTime[Student]	= ...;

dvar int+	NdepartToTrain[T];
dvar int+	NdepartToAirport[T];
dvar int+	NbackFromTrain[T];
dvar int+	NBackFromAirport[T];
dvar int+	NoutTotrain[T];
dvar int+	NoutToairport[T];
dvar boolean	x[Student][T];
dvar int+	waitTime[Student];

dexpr int	total_stu	= sum( i in Student, t in T ) x[i][t];
dexpr int	total_wait_time = sum( i in Student ) waitTime[i];

maximize total_stu;//-total_wait_time; 


subject to {
constraint1:
	forall( i in Student ) sum( t in T ) x[i][t] <= 1;

	forall( t in T )
	{
		sum( i in Student ) ( x[i][t] * (1 - destination[i]) ) >= 20 * NdepartToTrain[t];
		sum( i in Student ) ( x[i][t] * (1 - destination[i]) ) <= 45 * NdepartToTrain[t];
		sum( i in Student ) ( x[i][t] * (destination[i]) ) >= 20 * NdepartToAirport[t];
		sum( i in Student ) ( x[i][t] * (destination[i]) ) <= 45 * NdepartToAirport[t];
	}

constraint2:
	forall( t in 1..14 ) /* 早上7点以后才发车 */
	{
		NdepartToTrain[t] == 0;
		NdepartToAirport[t] == 0;
	}

constraint3:
	forall( i in Student, t in T )
	{
		(x[i][t] == 1) => (t + destination[i] * timeToairport + (1 - destination[i]) * timeTotrain + 1 <= departTime[i]);       /* 达到时间约束 */
		(x[i][t] == 1) => (t + destination[i] * timeToairport + (1 - destination[i]) * timeTotrain + 4 >= departTime[i]);       /* 达到时间约束 */
		(x[i][t] == 1) => (waitTime[i] == departTime[i] - (t + destination[i] * timeToairport + (1 - destination[i]) * timeTotrain) );
	}

	forall( i in Student ) ( (sum( t in T ) x[i][t]) == 0 ) => (waitTime[i] == 0);

constraint4:  /* 车辆总数 */
	forall( t in 3..n_t )
	{
		NbackFromTrain[t] == NdepartToTrain[t - 2];
		NoutTotrain[t] == NdepartToTrain[t - 1];
	}

	forall( t in 5..n_t )
	{
		NBackFromAirport[t] == NdepartToAirport[t - 4];
		NoutToairport[t] == NdepartToAirport[t - 3] + NdepartToAirport[t - 2] + NdepartToAirport[t - 1];
	}

	forall( t in 5..n_t )
	{
		NBackFromAirport[t] + NbackFromTrain[t] + NoutTotrain[t] + NoutToairport[t] + NdepartToAirport[t] + NdepartToTrain[t] <= n_bus;
	}
};

execute {
	var OutputFile = new IloOplOutputFile( "x.txt", false );
	for ( var i = 1; i <= n_stu; i++ )
	{
		for ( var j = 1; j <= n_t; j++ )
		{
			OutputFile.write( x[i][j], ' ' );
		}
		OutputFile.writeln();
	}

	var OutputFile = new IloOplOutputFile( "NdepartToTrain.txt", false );
	for ( var j = 1; j <= n_t; j++ )
	{
		OutputFile.write( NdepartToTrain[j], ' ' );
	}


	var OutputFile = new IloOplOutputFile( "NdepartToAirport.txt", false );
	for ( var j = 1; j <= n_t; j++ )
	{
		OutputFile.write( NdepartToAirport[j], ' ' );
	}

	var OutputFile = new IloOplOutputFile( "waitTime.txt", false );
	for ( var j = 1; j <= n_stu; j++ )
	{
		OutputFile.write( waitTime[j], ' ' );
	}
}

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运筹不帷幄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值