垃圾回收物流仿真系统设计.docx
《垃圾回收物流仿真系统设计.docx》由会员分享,可在线阅读,更多相关《垃圾回收物流仿真系统设计.docx(20页珍藏版)》请在冰豆网上搜索。
垃圾回收物流仿真系统设计
文件编码(008-TTIG-UTITD-GKBTT-PUUTI-WYTUI-8256)
垃圾回收物流仿真系统设计
第十一章垃圾回收物流仿真系统设计
垃圾回收物流系统介绍
城市某一区域,共有7个居民小区,每个小区有一个固定垃圾投放处,两个垃圾箱分别投放完全废弃垃圾和可回收利用垃圾;每天有专门公司(垃圾处理公司)派运输车收集垃圾,将垃圾从居民区运送之中转站,再由中转站运至目的地—垃圾处理中心。
仿真程序研究如何设计物流系统,能够使收集系统在满足时间约束、载重约束的条件下,使垃圾处理公司的物流总成本最低。
系统配置的项目主要有车辆载重量、随车工作人员数、客户满意度。
本节内容可以参看随书光盘models/垃圾回收仿真文件夹下的,模型运行结果参看此目录下的文件。
数据信息
仿真系统涉及的数据信息如下:
地理及需求信息
各个收集点所有的人口数、距离垃圾转运站、公司停车场的距离信息如表所示。
各收集点之间以及停车场和转运站之间的距离信息如表所示。
表收集点信息
收集点
名称
收集点居民数people(i)(千人)
距离停车场距离distance(ip)(km)
距离垃圾转运站距离distance(it)(km)
Dump001
6
16
Dump002
16
27
Dump003
26
24
Dump004
38
36
Dump005
28
26
Dump006
16
14
Dump007
10
8
表点间距离
路径起点
路径终点
距离(km)
符号
Tran_station
Corppark
11
Distance(pt)
Dump001
Dump002
10
Distance(12)
Dump002
Dump003
10
Distance(23)
Dump003
Dump004
12
Distance(34)
Dump004
Dump005
10
Distance(45)
Dump005
Dump006
12
Distance(56)
Dump006
Dump007
6
Distance(67)
与收集车辆有关的信息
固定成本[price(i)]:
收集车辆的购买费用;
可变成本[cost(i)]:
车辆的行驶费用、维护费用和雇员工资;
行驶速度:
分为空车行驶速度[unloadspeed(i)]和载重行驶速度[loadspeed(i)];
收集时间[loadtime(i)]:
在垃圾收集点收集垃圾所需的时间
卸载时间[unloadtime(i)]:
在转运站卸载垃圾所需的时间
具体信息如表所示:
表收集车辆信息
车辆
名称
载重
t
固定成本
万元
可变成本
元/km
载重速度
km/h
空载速度
km/h
人员
人
人员工资
元/天.人
收集时间
min
卸载时间
min
车1
X1
2+X1
X1
60
72
P1
60
3+y*6/P1
3+X1*6/P1
车2
X2
2+*X2
X2
60
72
P2
60
2+y*8/P2
2+X2*6/P2
说明:
车1用来收集不可回收垃圾;车2用来收集可回收利用垃圾;
X1,X2为现有两种车的吨位数,X1取值:
3,4或5吨;X2取值:
;2;;
y为每次收集的垃圾量,单位--吨;
P1,P2为两种车可配备的随车工作人员数(可以是1,2,3)。
与垃圾相关的信息
人均垃圾量:
平均每人每天产生的垃圾数量;
垃圾比例:
各种垃圾成分所占比例。
假设人均垃圾量服从均值为天的埃尔郎分布,垃圾成分分为两类:
一类为可重复利用资源,一类为无用需销毁垃圾,两者比例为1:
2。
收集垃圾的成本函数
现在假设仿真一年365天的垃圾回收工作,决定两种型号的车配置何种吨位以及随车工作人员数,垃圾回收物流成本(TotalLogisticCost,TLC)最低。
TLC=车1成本+车2成本
车I所耗成本=I的固定成本+I的可变成本+I的服务时间成本+I的人员成本
即:
TLC=CC1+CC2
CC[i]=X[i]+V[i]+S[i]+P[i]*365*60
S[i]=(runtime[i]-240)*m
S[i]为垃圾回收的服务时间成本,m为收集时间对服务时间成本的惩罚因子。
垃圾回收公司在十二点之前收集完毕,社会效应好,给予奖励;在十二点后完成,社会满意度低,影响公司信誉,成本增加。
runtime[i]为垃圾车将垃圾全部回收完成的最终时间,也即垃圾车每天的运行时间;
系统逻辑结构
此垃圾回收物流系统的逻辑结构分为五个子模块:
垃圾产生模块、叫车模块、收集模块、收工模块、数据处理模块。
垃圾产生模块每天收集工作开始时,系统根据小区的人数、人均垃圾量、两种垃圾量的比例,通过爱尔朗随机分布函数,随机产生各个小区的两种垃圾数量,分别存放入各个小区的两个垃圾箱内。
叫车模块在垃圾存放入各个小区的两个垃圾箱过程中,根据每种垃圾的总量以及每种垃圾车的载重量,生成叫车的次数。
收集模块叫车次数确定之后,车辆根据需求,沿着最短路径依次收集垃圾。
在收集过程中,在一个垃圾点,如果垃圾车收集满了或当天的收集工作全部完成,车辆驶向垃圾中转站,进行卸载操作;如果垃圾车未满,则驶向下一最近垃圾收集点继续收集。
收工模块当天的收集工作全部完成之后,车辆驶向公司停车场,当天收集工作完毕。
数据处理模块每天车辆收工时,
仿真模型的建立
根据系统逻辑结构和数据信息,我们建立具有7个垃圾收集点、一个垃圾转运站的WITNESS垃圾回收仿真模型。
具体步骤如下:
元素定义Difine
建立仿真模型时,首先定义仿真模型中所需的元素,并设计它们的可视效果。
我们将设计的元素分为两类――实体元素和逻辑元素,名称如下。
表实体元素列表:
元素名称
类型
说明
dumpa
(1)~dumpa(7)
Part
七个小区不可回收的垃圾
dumpb
(1)~dumpb(7)
Part
七个小区可回收利用的垃圾
dumpcart
(1)
Vehicle
专门回收dumpa的垃圾回收车
dumpcart
(2)
Vehicle
专门回收dumpb的垃圾回收车
buffera
(1)~buffera(7)
Buffer
各小区不可回收垃圾的垃圾箱
bufferb
(1)~bufferb(7)
buffer
各小区可回收利用垃圾的垃圾箱
Corppark
Track
公司停车场,
Transfer_station
Buffer
垃圾转运站
road(i,j)
Track
由节点实体i向节点实体j方向的道路
road(j,i)
track
由节点实体j向节点实体i方向的道路
Geta
(1)~geta(7)
Track
车辆将通过它们来进行垃圾a的回收
Getb
(1)~getb(7)
Track
车辆将通过它们来进行垃圾b的回收
表逻辑元素—变量列表:
变量名称
类型
说明
people(7)
integer
各小区的居民数量
capacitycart
(2)
integer
两种垃圾车每次可收集的垃圾数量,即载重量
ndemand
(2)
integer
每天对两种垃圾车的需求次数
labor
(2)
integer
两种垃圾车的随车工作人员数
Salary
Real
工作人员每天工资
price
(2)
Real
两种垃圾车的购买价格
costrate
(2)
Real
两种垃圾车的运行费率
unloadspeed
(2)
Real
两种垃圾车的空载速度
loadspeed
(2)
Real
两种垃圾车的实载速度
loadnum
(2)
integer
两车辆到达垃圾收集点可收集的垃圾数量
nfree
(2)
integer
两车辆剩余载重能力
Nparts7)
integer
每一垃圾收集点在特定仿真时点剩余垃圾量
loadtime
(2)
Real
两车辆收集垃圾所需的时间
unloadtime
(2)
Real
两车辆卸载垃圾所需的时间
runtime(2,3)
Real
存储车辆的时间参数,runtime(k,1)存储仿真钟的当前数值,runtime(k,2)存储车辆k在当天的运行时间,runtime(k,3)存储车辆k在仿真过程中总的运行时间
Timeweigh
Real
时间惩罚因子
timecost
(2)
Real
时间惩罚成本
sumcost
Real
目标函数objfun中用于统计系统运行的总费用
定义一个实数型逻辑函数objfun(),用于计算和统计系统运行一年365天所花费的总费用。
元素显示display
各个元素的显示设置如图所示。
图垃圾回收物流仿真系统可视化界面
元素详细设计
在该子模块中定义随着仿真钟的推进,装载垃圾的逻辑条件。
该系统的工作班次制度采用每天工作8小时,每一仿真时间等价于现实时间一分钟。
为了实现系统的仿真运行,需要对系统中的元素进行详细设计。
系统初始化程序设计(initializeactions),通过选择系统菜单model/initializeactions…菜单项,得到初始化程序编辑框,输入如下程序:
personum
(1)=
personum
(2)=
personum(3)=
personum(4)=
personum(5)=
personum(6)=
personum(7)=
!
给各小区的人数赋初值,单位:
千人
FORnum=1TO7
meandump(num)=*personum(num)*1000
NEXT
!
分别生成每天七个小区产生垃圾的均值
setcapacityofdumpcart1tocapacitycart
(1)
setcapacityofdumpcart2tocapacitycart
(2)
!
分别设定两个车辆的载重量,由变量数组capacitycart
(1)和capacitycart
(2)决定。
unloadtime=0!
卸载时间
FORnum=1TO7
moddemanda(num)=0
moddemandb(num)=0!
决定叫车次数的变量
NEXT
FORnum=1TO4
roadchoicea(num)=0
roadchoiceb(num)=0!
最短路径控制变量
NEXT
FORnum=1TO3
runtimea(num)=0
runtimeb(num)=0!
车辆运行时间控制变量
NEXT
intervaltime=1440!
每天的分钟数
timeweigh=5!
时间惩罚因子
laborneeda=1
laborneedb=1!
两辆车随车工作人员数
!
对变量赋初始值
各个小区垃圾的详细设计
表垃圾元素详细设计列表
Name
Firstarrival
Interarrival
Lotsize
To
Dumpa1
1440
ERLANG(meandump
(1)/3,3,1)
PUSHtobuffera1
Dumpa2
1440
ERLANG(meandump
(2)/3,3,2)
PUSHtobuffera2
Dumpa3
1440
ERLANG(meandump(3)/3,3,3)
PUSHtobuffera3
Dumpa4
1440
ERLANG(meandump(4)/3,3,4)
PUSHtobuffera4
Dumpa5
1440
ERLANG(meandump(5)/3,3,5)
PUSHtobuffera5
Dumpa6
1440
ERLANG(meandump(6)/3,3,6)
PUSHtobuffera6
Dumpa7
1440
ERLANG(meandump(7)/3,3,7)
PUSHtobuffera7
Dumpb1
1440
ERLANG(meandump
(1)/3,3,8)
PUSHtobufferb1
Dumpb2
1440
ERLANG(meandump
(2)/3,3,9)
PUSHtobufferb2
Dumpb3
1440
ERLANG(meandump(3)/3,3,10)
PUSHtobufferb3
Dumpb4
1440
ERLANG(meandump(4)/3,3,11)
PUSHtobufferb4
Dumpb5
1440
ERLANG(meandump(5)/3,3,12)
PUSHtobufferb5
Dumpb6
1440
ERLANG(meandump(6)/3,3,13)
PUSHtobufferb6
Dumpb7
1440
ERLANG(meandump(7)/3,3,14)
PUSHtobufferb7
垃圾名称
*
一天的分钟数
Meandump为通过各小区人数计算出来的变量数组
决定垃圾的存放
*决定每天各个小区的垃圾依次产生,以便于生产叫车次数。
运输车辆详细设计
表运输车辆详细设计列表
Name
Unloadspeed
Loadspeed
to
Dumpcart1
1.2
1.0
PUSHtocorppark
(1)
Dumpcart2
1.2
1.0
PUSHtocorppark
(2)
车辆名称
空载速度(km/min)
实载速度
生成时,放入公司停车场的车位
垃圾箱详细设计
设计垃圾放入垃圾箱时的活动,也即每个垃圾箱的“actionsoninput”中的程序。
oninput:
IFMOD(NPARTS(buffera1),cartcapacity
(1))=1
CALLdumpcart1,get1,road7_t,1
VSEARCHroad0_1,corppark,road1_2,road1_0,road2_3,road3_4,road4_5,road5_6,road6_5,road6_7,road7_t,roadt_7,road1_0,road3_6,road6_3,road7_0,road0_7,road2_1,geta1,geta2,geta3,geta4,geta5,geta6,geta7,getb1,getb2,getb3,getb4,getb5,getb6,getb7
ENDIF
moddemanda
(1)=MOD(NPARTS(buffera1),cartcapacity
(1))
程序解释:
第一行:
判断当buffera1中的垃圾的数量同车辆1的载重量取余为1时,发生if…endif之间的活动;
第二行:
叫车dumpcart1,该车将在路径get1上装载垃圾,在路径road7_t上卸载垃圾,优先级为1;
第三行至第五行:
在所有路径上搜索车辆dumpcart1;
第七行:
汇总非整车垃圾的数量,带到buffera2中继续计算并叫车。
Buffera2~buffera7的actionsoninput:
IFMOD(moddemanda(i-1)+NPARTS(buffera(i)),cartcapacity1)=1
CALLdumpcart1,geta(i),road7_t,0
VSEARCHroad0_1,corppark,road1_2,road1_0,road2_3,road3_4,road4_5,road5_6,road6_5,road6_7,road7_t,roadt_7,road1_0,road3_6,road6_3,road7_0,road0_7,road2_1,geta1,geta2,geta3,geta4,geta5,geta6,geta7,getb1,getb2,getb3,getb4,getb5,getb6,getb7
ENDIF
moddemanda(i)=MOD(moddemanda(I-1)+NPARTS(buffera(i)),cartcapacity1)
i表示本垃圾箱的序号,为2,3,4,5,6,7;
第一行:
将其上一个垃圾箱的非整车垃圾数量同本垃圾箱中的垃圾数相加,然后与车辆一的载重量取余,当结果为1时,叫车。
垃圾箱bufferb1~bufferb7的“actionsoninput”同垃圾箱buffera1~buffera7的“actionsoninput”处理逻辑完全一样,只需要将buffera改为bufferb、dumpcart1改为dumpcart2、moddemanda改为moddemandb、geta改为getb即可。
两点间运输路径上的程序设计
下面以road2_3为例,加以说明其逻辑流程。
其它路径类似,可以在路径的generaldetail中的outputto中加以查看。
IFVEHICLE(road2_3,1)=dumpcart1
IFNPARTS(buffera3)>0
PUSHtogeta3
(1)
ELSE
PUSHtoroad3_4
ENDIF
ELSEIFVEHICLE(road2_3,1)=dumpcart2
IFNPARTS(bufferb3)>0
PUSHtogetb3
ELSE
PUSHtoroad3_4
ENDIF
ELSE
Wait
ENDIF
第一行到第六行:
决定车辆dumpcart1到达路径road2_3末端时,它的运行路径。
如果此时垃圾箱buffera3中有垃圾,则车辆dumpcart1驶向路径geta3,进行垃圾收集(第二行到第四行);如果垃圾箱buffera3中没有垃圾,则车辆dumpcart1驶向路径road3_4。
第七行到第十二行:
决定车辆dumpcart2到达路径road2_3末端时,它的运行路径。
如果此时垃圾箱bufferb3中有垃圾,则车辆dumpcart2驶向路径getb3,进行垃圾收集(第八行到第十行);如果垃圾箱bufferb3中没有垃圾,则车辆dumpcart2驶向路径road3_4。
如果是其他情况,等待(第十三行到第十四行)。
路径get系列的设置
在Get系列(Geta1~geta7,Getb1~getb7)路径中设置车辆的装载(loading)程序和条件,它们的设定以及程序的处理流程基本相同,下面举geta2加以说明。
其中装载数量(loadnum)和装载时间(loadtime)在generaldetail页的actionsonfront中设定;装载程序和条件在loadingdetail页中进行设定。
Generaldetail页的actionsonfront程序如下:
IFNFREE(dumpcart1)>=NPARTS(buffera2)
loadnum=NPARTS(buffera2)
ELSE
loadnum=NFREE(dumpcart1)
ENDIF
loadtimea
(1)=3+loadnum/1000*loadindexa/laborneeda
dayloadtimea=dayloadtimea+loadtimea
(1)
程序解释:
第一行至第五行:
如果车辆dumpcart1的空余容量NFREE(dumpcart1)不小于垃圾箱buffera2中的垃圾数量,则收集数量loadnum为垃圾箱buffera2中的所有垃圾;否则,收集数量loadnum为车辆的空余容量。
第六行:
计算本次收集所需的时间loadtimea
(1),它是本次垃圾收集量、随车工作人员数以及收集时间系数的函数。
图路径geta2中的loading详细设计图
路径geta2中的loadingdetail页框的设定如图所示。
在选中loadingenabled(能够装载)前的复选框后,将会出现该界面上的其他内容。
TransferMode(装载模式)有三种:
if、call、always。
我们选择条件模式if,在条件condition:
框中输入条件表达式NPARTS(buffera2)>0,即当垃圾箱buffera2中的垃圾数量大于零时,能够装载;装载数量等于Quantityto框中的变量loadnum的值;装载的时间需要TimetoLoad框中的变量loadtimea
(1);装载的源在InputLoadingRule规则中进行设定,为“PULLfrombuffera2”,从垃圾箱buffera2中收集。
road7_t的设定
车辆每次到达路径road7_t的末端时,都要进行卸载处理,所以对路径road7_t的详细设计项目包括卸载所需的时间,卸载模式等。
通过路径road7_t的Generaldetail页的actionsonfront中设定卸载所需的时间,程序如下:
IFVEHICLE(road7_t,1)=dumpcart1
unloadtime=3+6*NPARTS(dumpcart1)/1000/laborneeda
dayunloadtimea=dayunloadtimea+unloadtime
ELSE
unloadtime=2+6*NPARTS(dumpcart2)/1000/laborneedb
dayunloadtimeb=dayunloadtimeb+unloadtime
ENDIF
程序解释:
第一行至第三行,根据函数VEHICLE()的结果,如果到达车辆是dumpcart1,就通过车辆dumpcart1中所装载的垃圾数量NPARTS(dumpcart1)、车辆dumpcart1的随车工作人员数laborneeda来确定卸载时间unloadtime(第二行),然后统计车辆dumpcart1的总的卸载时间dayunloadtimeb(第三行)。
第四行至第七行,否则,也就是到达的车辆是dumpcart2,就通过车辆dumpcart2中所装载的垃圾数量NPARTS(dumpcart2)、车辆dumpcart2的随车工作人员数laborneedb来确定卸载时间unloadtime(第五行),然后统计车辆dumpcart2的总卸载时间dayunloadtimeb(第六行)。
图是路径road7_t设置中的另一项内容,就是车辆卸载的