管系统仿真与GPSSJAVA
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
若是,则可在该模块语句前使用 dboff语句
然后重新编译和运行模型。
• }}
5.1.3 模型初始化与用户定义的模型类成员变量
用户在模型类定义的成员变量,在模型类的范围内 是全局变量。如果这些变量在模块操作数表达式中作为 只读变量被引用,则模型初始化操作不会对其有任何影 响。
但是,如果这些变量在模块操作数表达式中存在赋 值的写入操作,那么仿真模型在初始化过程中,有可能 已经改变了全局变量的值。如果在模型运行时,要使用 其初始值,则必须在模型类的run方法中调用 start 语句 来启动一轮模型的运行前,重新为其赋初始值。请参见 模型 Demo5_1。
5.1.2 与模型初始化有关的控制语句
GPSS/JAVA对模型的初始化中, 模型的每一模块语句都要被执行一次。 若模块有操作数,那么操作数的求值 可能会引发如下问题:
void init(){
… ref.simulate(); … } 被调度对象构造方法 所调用完成模型初始化
问题1 :随机数序列被干扰(随机数发生器被generate以外的 模块语句的操作数调用) --- 初始化完毕后重置随机数发 生器种子值,然后开始模型输入操作
问题2 :操作数表达式中若出现标准属性,由于模型没有开 始运行,这些属性值均为初始值,可能引起算术异常。
--- 由系统控制语句setDebugOff 或模块控制语句 dbon 与dboff 解决
5.1.2 与模型初始化有关的控制语句
(1)系统控制语句setDebugOff
1) 作用:模型初始化时,将模型所有模块设置为非调试状态。对模 块操作数表达式求值产生的异常不作处理,继续模型初始化的进
操作
模块为-1,下一要进入该模块,移动时间为0+抽样值),放入未来事件链
3.模型的输入操作之前,未来事件链为空;输入操作完成后,未来事件链
不再为空;根据未来移动时间的从小到大的顺序,从其链头至其链尾,
运行
依次放置由各个generate模块各自产生的一个动态实体。
部分
是一个系统状态修正和时钟修正操作的循环过程,循环结束的条件是 模拟终止计数器的当前数值是否小于或等于 0。模拟终止计数器初始 值由start语句a操作数控制,而当前值由terminate模块a操作数控制。
实现时钟修正操作的伪代码
(4)动态实体属性标记:
[编号,未来移动时间,当前所在模块,下一进入的模块,优先权,装配集] 例如,[2,94.0,-1,8,0,2]
(5)模型输入操作完成后
绝对时钟当前时间为 0 未来事件链的状态为 [1, 21.0, -1 ,1, 0, 1] [2, 94.0, -1, 8, 0, 2] 当前事件链为空
5.1 模型初始化
5.1.1 模型初始化过程
void init(){
模型的初始化在Diaodu类对象构造方法中实现,主要完}成…以re下f.s操im作ul;ate(); … (1)对系统所有全局变量赋初始值。 (2)在一个初始化循环中,依次执行模型每一模块语句的初始化部分,完成
以下操作
1)对每个模块语句操作数作语法检查。 2)为每一模块语句编号,依据模块的先后顺序依次编号,并确定每一编号
(2)模块控制语句 dboff
1) 作用:模型初始化时,将模型的某一模块设置为非调试状态;对该模块操
作数表达式求值产生的异常不作处理,继续模型初始化的进程。
2) 操作符与操作数:
dboff()
dboff语句应在模型的case标号与模块语句之间调用, 例如:
• public void simulate(){
5.2 模型的输入操作
1. 模型输入操作过程
Init()
初始
对模型各模块做语法检查和编号,生成一个generate模块编号数组等
化
1.根据模型初始化时所获得的信息,可以在一个循环中,使模型所有
generate模块的输入子模块被依依执行。 start()
输入
2.将由generate模块产生的第一个动态实体,标记各种属性后(当前所在
北京市高等教育精品教材 《管理系统仿真与GPSS/Java》
第五章 GPSS/Java 仿真调度程序
第5章 GPSS/Java 仿真调度程序
GPSS/JAVA 仿真调度 程序实现了建模方法的 内部算法。其核心部分 封装在名为 Diaodu 的 类中。
调度程序主要实现的操 作是:对模型进行初始 化、完成模型的输入、 修正时钟和修正系统的 状态、启动和控制模型 的运行。
5.2 模型的输入操作
产生两组均匀分布的整型随机数各5个:
在初始化时,case 30 执行了 一次n++操作,故在模型运行 unifor前mI,nt(需in重t r新,int设l,i置nt nh 的)为初标值准为随 1
机函数,使用 r 号随机数发生器,产生 一整型随机数,其值在 l 至 h 范围内。 print(int line,String name,double)为 一操作模块语句,向输出文件以不换行或 换行方式输出一个字符串和一个实型数值。
•
switch(nextBlock){
•
case 10:
generate(16,5);
•
case 20: dboff(); advance(14,6);
•
case 30:
terminate(1);
•
case 40:
end();
• }}
5.1.2 与模型初始化有关的控制语句
(3)模块控制语句dbon
1 作用:模型初始化时,将模型的某一模块设置为调试状态;对该模块操作
数表达式求值产生的异常作报错处理,模型初始化的进程被终止。
2 操作符与操作数
dbon()
dbon语句应在模型的case标号与模块语句之间调用,例如:
• public void simulate(){
•
switch(nextBlock){
5.2 模型的输入操作
模型程序Demo5_1.java的输出结果:
r1 =21.00 r3 =17.00 r4 =18.00 r5 =20.00
s1 =18.00 s3 =16.00 s4 =17.00 s5 =19.00
r6 =18.00
s6 =19.00
其中,r代表到达间隔时间,s代表加油所需时间,n (取值1至5)代表编号。
例如 r1和s1分别表示1号动态实体(1号顾客)的到
达间隔时间和加油所需时间。
5.2 模型的输入操作
问题的模型程序
setModel间接调用init() void init(){
ref.simulate(); }
仅执行每 个模块语 句的初始
化部分
3.结果 产生的两组随机数如下:
模型初始化后模块被顺序编号 1 generate(uniformInt(4,12,24)); 2 queue(line); 3 seize(station); 4 depart(line); 5 advance(uniformInt(6,12,20)); 6 release(station); 7 terminate(); 8 generate(94); 9 terminate(1);
动态实体沿模型路径移动,当停止移动的三个条件之一发生时,动态 实体要么被放至未来事件链,要么被放回当前事件链,要么被排出模 型。
5.3.2 时钟修正
模型输入操作完成后,调度程序便开始执行时钟修正的操作。模 型第一个时钟修正的操作,实际上是将未来事件链具有最小未来 移动时间的动态实体移入模型(进入产生其的generate模块)并 根据此移动时间来修正时钟时间。 所有时钟修正都执行如下操作过程: (1)根据未来事件链(FEC)头第一个动态实体所标记的未来移 动时间修正模拟时钟。 (2)将该动态实体由FEC移至CEC,按该动态实体的优先权水平 排列,作为相同优先权组的最后一员。 (3)检查FEC是否有其它动态实体的未来移动时间与时钟当前时 刻相同,若有,则依次移至CEC,采取相同的排队规则。 (4)检查 FEC 若无动态实体的未来移动时间与时钟当前时刻相 同,则时钟修正结束,开始系统状态的修正。
5.3 时钟修正与系统状态修正
5.3.1 GPSS链的概念
(1)未来事件链(FEC ) Future Event Chain
未来事件链放置某些动态实体,这些动态实体在模拟时钟未来某一 确定时刻发生运动。满足这一条件的动态实体仅有如下两种情况:
1) 动态实体计划在未来某一确定时刻进入generate模块
通常模型应设置为调试状态(缺省 为调试状态),如果产生初始化
•
case 10:
generate(16,5); 的出错提示信息,确认是否是
•
case 20: dbon(); advance(14,6); 模块操作数求值产生的算术异常,
•
case 30:
•
case 40:
terminate(1); end();
即模型 输入与 首次 时 钟修正
即系统 状态修
正
完成模型的初始化 操作,该方法被 setModel语句间
接调用
模型输 入操作
首次时 钟修正
第5章 GPSS/Java 仿真调度程序
5.1 模型初始化 5.2 模型的输入操作 5.3 时钟修正与系统状态修正 5.4 调度程序的组织与模型运行的控制 5.5 动态实体优先权与priority模块
5.3.1 GPSS链的概念
(2)当前事件链(CEC Current Event Chain )
当前事件链放置某些动态实体。这些动态实体符合如下条件: 1) 在模拟时钟当前时刻能够在模型中移动 2)在模拟时钟当前时刻暂时受阻停止移动,未来移动时间不能确 定,一旦受阻条件不存在,立即可以移动。
在当前事件链上,动态实体的未来移动时间属性被标记为ASAP(as soon as possible),代表条件允许随时可以移动。 动态实体在当前事件链按优先权水平排列,优先权高,排在前端, 在同一优先级水平内,先来者排在前面。
5.2 模型的输入操作
2.举例说明 假设有一加油站,各类车辆到达间隔时间和加油所 需时间皆为均匀分布,车辆的平均到达间隔时间为 12-24分钟,每辆车加油平均需要12-20分钟,模 拟94分钟,输出未来事件链和当前事件链(以后定 义)信息。 (1)产生两组均匀分布的随机数序列各5个,分别
代表5辆车到达加油站的间隔时间和对应的加 油所需时间(时间取整数值)。
2)动态实体进入advance模块,在未来某一确定时刻进入该 advance模块的紧后模块
在未来事件链上,动态实体是按照其未来移动时间的先后顺序,自 其链头至其链尾排列的。一个动态实体被放入未来事件链时,必须 将其插入正确的位置,即其前端的动态实体的未来移动时间应小于 或等于该动态实体的未来移动时间,而其后端的动态实体的未来移 动时间应大于该动态实体的未来移动时间。
所对应的case标号。生成一个一维数组中。数组下标对应模块编号,下 标元素值对应case标号。 3)如果当前执行的是generate模块,则将其对应的模块编号记录在一个数 组中,下标为generate模块的序号,元素值为其模块的编号。 4)使用一数组标记需要在以后操作中进行特殊处理的模块。 5)捕捉有关的异常 (3)当模型的end模块语句被执行时,初始化循环结束。 (4)初始化随机数发生器。
5.2 模wenku.baidu.com的输入操作
动态实体属性标记:
[编号,未来移动时间,当前所在模块,下一进入的模块,优先权,装配集] 例如,[2,94.0,-1,8,0,2]
模型输入操作:
执行模块1(generate)的输入操作部分 执行模块8(generate)的输入操作部分
模型输入操作后:
绝对时钟当前时间为 0 未来事件链的状态为:
GPSS/JAVA 在模型的 run() 方法中,通过 setModel 语句创建调 度程序对象并开始模型 的初始化操作。通过第 1个start 语句开始模型 的输入操作和运行。
setModel 被调用
模型输入操 作与首次时
钟修正
第1个 start 被
调用
时钟修正和 系统状态修 正交替进行
第5章 GPSS/Java 仿真调度程序
程。
2) 操作符与操作数: setDebugOff()
setDebugOff语句作为系统控制语句应在模型的run方法中,先于 模型控制语句使用,例如:
•
public void run(){
•
setDebugOff();
•
setModel(this);
•
start(1);
•
}
5.1.2 与模型初始化有关的控制语句
输入操作 完毕后,未来链的状态为: