clock_revise();}final_print_out();
//时钟修正//仿真结果打印输出
下图表示了GPSS/JAVA的运行逻辑
初始化
程序1.设定仿真开始时间2.初始化系统状态建立各种链表
3.系统结构与设计
GPSS/JAVA中全部的类都被封装在四个包中:调度类所在的包(gpss_java.dispatch.*),封装了所有操作模块的包(gpss_java.operation.*),封装了所有资源实体的包(gpss_java.resource.*),封装了公共接口和链操作模块的包(gpss_java.common.*)我们建立模型的时候只需要把我们的模型放在主类里,然后在主类中引入这四个包即可.调度类所在的包(dispatch):这个包中封装了一个类,即调度类(dispatch.class),调度类负责控制仿真模型的运行逻辑.它由构造方法dispatch(),系统模型的初始化方法init(),时钟修正方法clock_revise(),完成当前链扫描方法scan_stage(),还有完成整个系统调度功能的start()方法等组成.构造方法的作用是创建一个与仿真模型所在的文件(主类文件)有相同文件名的文本文件,用来记录我们在仿真过程中得到的仿真结果,同时执行系统初始化方法,在初始化方法中完成公共接口中全局变量的赋值,对用户的模型文件进行初始化扫描,初始化扫描对用户构建的模型的每个模块逐次扫描,对模型中的资源实体分配内存,并进行初始化处理,同时对用户模型进行错误检查,如果用户模型没有错误,那么在初始化进行完毕之后,在我们的仿真模型中就建立了永久实体(资源实体),这样我们的系统模型就建立起来了,可以对以后到达的临时实体(动态实体)进行服务,在初始化方法的最后,调用clock_revise()方法,调整系统时间为第一个动态实体到达的时间,然后就调用start()方法,系统开始模拟.现面这段程序表示GPSS/JAVA的运行逻辑voidstart(intcount){Common.start_count=count;//循环控制变量赋初值while(Common.start_count>0){intqq=Common.start_count;if(scan_stage()==COMM.FINISH)//扫描当前链
初始化程序初始化程序初始化程序
1.修正时钟2.扫描当前链
1.确定下次事件的类型和时间2.推进仿真时钟
1.更新系统状态2.产生未来事件整理未来链
仿真是否结束仿真是否结束是否:循环控制变量仍然大于0
1.计算仿真结果2.打印仿真
报告图1GPSS/JAVA的运行逻辑
Common类里的静态全局变量start_count就是循环控制变量,只要start_count大于0,系统模型就会不停的执行当前链扫描和时钟修正.这正是"时钟推进,事件调度"思想的体现.clock_revise()完成的任务有二:一是把模拟时钟调整为未来事件链上前端动态实体的移动时间,二是把未来链上移动时间为当前模拟时钟的动态实体依次摘下来,按照不同的优先级顺序插入到当前链上.scan_stage()方法的作用是对当前链进行扫描:顺次扫描当前链上的每一个动态实体,使他们依次通过模型,在这个过程中,它们或被放入未来链(遇到advance模块)或通过terminate()模块被排出模型.当当前链上所有的动态实体都不能移动,说明当前时刻该发生的事情都发生过了(此时,scan_stage()方法的返回值为1,恰好等于COMM.FINISH)于是,就开始执行调整时钟的方法,clock_revise(),于是,一次循环结束,又开始执行下一次的循环,直到循环变量的值小于等于0为止.资源实体包(gpss_java.resource.*):资源实体包中封装了系统中的永久实体.所谓系统就是由相互联系,相互作用的实体组成的.一个系统中的实体无非就两种,
2
即永久实体和临时实体.在GPSS中,临时实体就是动态实体,其余的实体都是永久实体,在GPSS中,我们把现实系统中的永久实体抽象为设备实体(Facility),存储实体(Storage)排队实体(Queue)逻辑开关实体,,(Switch),函数实体(Function)和表实体(Table).1○设备实体(Facility)用来模拟现实系统中的单服务台服务实体:比如理发馆的理发师,医院的医生,超市的收银员,银行的取款机等,他们都属于单服务台服务实体;我们在单服务台实体类里封装了两个方法,Seize()和Release(),Seize()表示某动态实体试图占用设备实体,在它占用设备实体期间,其它动态实体只能在Seize()的紧前模块排队等待;Release()表示释放设备实体,当他释放了设备实体后,Seize()紧前模块的动态实体才能进入设备实体接受服务.通过Seize()和Release()这两个我们可以统计出设备实体的忙闲状况,设备实体的占用率等指标.2○存储实体(Storage)用来模拟多服务台服务实体:如火车站的售票处(有多个售票窗口,窗口的数据即为存储实体的容量),医院的挂号处(有多个挂号窗口),火车站的候车室(可通过模拟计算出候车室的最佳容量),呼叫中心接线员的数量等.Storage类里有个构造方法,用来设置并行服务窗口的数量和定期并行服务实体的名字.多服务台实体这个类里也封装了两个方法:Enter()和Leave(),Enter()表示在存储实体容量没满的情况下动态实体可以进入存储实体接受服务,