基于CPN的空竭服务单重休假 M/G/1 型排队系统建模与分析
目录
1创建CPN模型
1.1函数和变量声明
1.2监控声明
2 创建分层CPN
3 添加monitor
3.1 Predicate谓词函数
3.2 Observer观察函数
3.3 Init function &Stop初始化和停止函数
4CPN Tools工具补充
1创建CPN模型
1.1函数和变量声明
其中:
#val不是var
fun expTime(mean:int)=letval realMean=Real.fromInt mean val rv=exponential(1.0/realMean)infloor(rv+0.5) end;
# variance,不是varaiance
fun NormalTime(mean:real,variance:real)= letval rv=normal(mean,variance)infloor(rv+0.5)end;
1.2监控声明
全局变量longdelaytime为等待时间的最大允许值;
全局变量fileid是在用户自定义的监视中被用到的,它是一个Text-IO.outstream的选择型变量;如果fileid为空,则函数getfid将返回fileid 的文件标示;函数initfile初始化用户自定义的监视在仿真中将要更新的文件,文件的名字是Tran_Log_File.txt并且它将保存在仿真报告的目录里。具体声明函数如下:
globref longdelaytime=200;globref fileid=(NONE: TextIO.outstream option);fun gerfid()=Option.valOf(! fileid);fun initfile()=letval filename=OS.Path.concat(Ourput.gerSimOutputDir),"Trans_Log_File.txt")inOutput.initSimOutDir();fileid:=SOME(TextIO.openOut filename)end
不知道为什么还在报错中:
创建如下CPN模型:
2 创建分层CPN
利用View托盘中的创建组和选择组元素工具,和Hier托盘生成subpage工具,创建子页面:
父页面System:
子页面Arrivals:
子页面Server:
3 添加monitor
监视器中monitor的正确使用!是拖到库所和标签上的!
对于一个给定的模型可以定义多种Monitor,来满足不同的目的,各个Monitor之间可以互相作用。不同的Monitor可以满足不同的目的,可以分为以下几种:
data collector Monitor ,simulation breakpoint Monitor ,writer-in-file monitor和用户自定义monitor :
(1)simulation Break Monitor当特定条件满足的时候结束模拟,两种标准的 Break Monitor可分别用于某一库所的托肯数量达到一定数目或者是某一特定的变迁发生时结束仿真,还可以自定义Break Monitor。
(2)Data collector Monitor用于从模拟过程中提取数字数据或者用来计算模拟过程中提取数据的统计数据作为系统性能评价的数据资料,可以用来计算特定库所托肯的数量以及特定变迁发生的次数,用于计算模型的队列长度,响应时间等性能参数。可以自定义以满足各种需求。
(3)Writer-in-file monitor用来更新在模拟过程中记录信息的文件,可以在文件中输入任何语句,达到对模拟过程的监测。
尽管不同监控器有不同的目的但所有类型的监控器都有相同的特性与功能每个 monitor关联一个子网(一些特定的库所与变迁 )
在CPN Tools中右键Add surrounding places可以在当前monitor中添加相关联的库所和变迁。
但是对应的函数确不会自己更新吗?
下面创建单个Start变迁的监视器:Queue Delay Monitor
自动生成可见代码:
3.1 Predicate谓词函数
谓词函数:当Start变迁发生的时候,该谓词函数被调用﹐并且返回真。
代码为:
fun pred (bindelem)=letfun predBindElem (Server'Start (1,{job,jobs,proctime}))=true | predBindElem_= falseinpredBindElem bindelemend
3.2 Observer观察函数
观察函数:当谓词函数返回真的时候观察函数被调用也就是 Start 变迁发生时。观察函数返回工作在队列中等待的时间,也就是表达式(intTimeO-(#ATjob))。观察函数返回整型值。
fun obs (bindelem)=letfun obsBindElem (Server'Start (1,{job,jobs,proctime}))=(intTime()-(#AT job))| obsBindElem_=~1inobsBindElem bindelemend
3.3 Init function &Stop初始化和停止函数
初始化和停止函数:工作的等待时间,在仿真运行之前不需要监视,停止标志发生时也不需要监视,所以初始化函数和停止函数都返回NONE值。
fun init ()=NONEfun stop (=NONE
成功在output文件中找到数据结果:(牛逼!)
但是我这个结果和论文中结果不一样呢:
估计是这几行代码还报错的原因:(这点算好吧,部分代码报错还是能有结果!)
4CPN Tools工具补充
光环颜色说明:
用撤销Undo(相当于Ctrl+Z)或重做Redo工具可以容易的取消或重复很多对CPN 网层次结构的改变。甚至连网页的拖动都可以撤销!