GPSS(Geneal Purpose Simulation System)是使用比较广泛的面向离散模型的模拟语言。该语言特别适用于处理出现等待行列的系统,它提供了多种形式的实体、块语句、定义语句、控制语句、模拟操作语句等等,可以实现高难度的程序设计。
“GPSS的全部目的就是为了预测现实世界中复杂系统的行为——过去许多代价高昂的项目之所以失败是因为对最终的结果缺乏精确的预见。” GPSS的研制者在介绍GPSS时如是说。
一个简单的例子编辑本段回目录
下面先从一个简单的例子出发,对GPSS的建模过程进行一个总体概略的介绍。随后将详细介绍GPSS的运行环境、界面和模块体系结构,并对GPSS的建模观点进行评述,最后再以一个研究示例说明GPSS在实际研究中的应用。
假设顾客去理发店理发。店里只有一个理发员JOE,顾客排队等着,前一个理完发,后一个就可以去理。设顾客平均18分钟来一个,不过有士6分钟的偏差,也就是说在12分钟到24分钟之内,即12,13,…,24分钟都等可能有顾客到来。理发员理发时间是16土4分钟,下面是模拟系统的运行情况。
GENERATE 18,6 顾客在(18f6)分钟的时间间隔到来
QUEUE LINE 顾客排入名为 LINE的队中
SEIZE JOE 或JOE闲,找他理发,否则停在队中
DEPART LINE 离队
ADVANCE 16,4 理发花了(16±4)分钟
RELEASE JOE 理发完毕离开
TERMINATE 顾客离开系统
START 25
END
首先,在每个GPSS程序的开始,有一个控制语句:S[MU-LATE。它表示一个模拟过程的开始,同样,在整个程序的最后,有一个END控制语句,与SIMULATE相对应,表示模拟过程的结束。
这个进程说明从GENERATE所产生的顾客进入理发店,找JOE理发,理完后离开理发店。JOE开始时是闲的。有人找J(3E理发,如果他是闲的,他就为顾客理发;如果他是忙的,就让顾客排人LINE中。当JOE为顾客理完发,他就变闲。因为GENERATE的功能是源源不断地产生顾客,当JOE变闲时,在LINE排头的顾客就周而复始地让JOE为他服务。其具体过程如下:
模拟开始时,GPSS处理器产生一个到达间隔时间T1,在T1个时间单位之后,GENERATE程序块将建立第一个动态实体(即第一个需要理发的顾客),并立即进入下一个程序块,即 QUEUE LINE程序块,也就是说排队等候理发师。当动态实体离开GENERATE程序块时,GPSS处理器将产生第二个到达间隔时间T2,然后在T2个时间单位之后,GPSS处理器将在GENERATE程序块中建立第二个动态实体,并立即进入 QUEUE LINE程序块。建立过程以这样的方式继续下去。
动态实体一离开 GENERATE程序块,就立即进入 QIJEUELINE程序块,当一个动态实体进入QUEUE程序块时,GPSS;处理器就记录下它进入了某一具体的队,并记录下开始等待的时间。在模拟中,动态实体排的队可以多于一个,每个队须有各自不同的名字,LINE即是这样的一个名字。不过无论给定的名字是什么,GPSS处理器将认定其为1号队。
当动态实体进入 QUEUE LINE程序块以后,它立即准备进入下一个程序块,即 SEIZE JOE程序块。在现实中,一个到达的顾客希望能尽快理发,如果他到达时JOE有空,他将马上开始理发。但是,如果他到达时,JOE正忙于给另一位顾客理发,他只能等待,相当于排人一个队列中,直到上一位顾客理完发。
在现实中,JOE在某一时间内仅能为一位顾客服务,即他要么是闲着,要么是忙着,而忙的时候只能属于一位顾客。而当另一个动态实体希望进入 SEIZE JOE程序块时,必须具备的前提条件是 JOE正在闲着,否则的话,该实体只能是先在队列中排着,直到JOE由忙变闲为止。如果有更多的实体到达,它们一样也得排在队列依次等待。当 JOE变闲时,由队头的实体先利用资源,这样就使 JOE又由闲变忙,而队中的其他实体被暂时阻止进入而继续等待。这样,就可以模拟一个先来先服务的队。
动态实体通过 SEIZE JOE程序块后立即进入 DEPART LINE程序块。当一个动态实体进入这个DEPART程序时,GPSS处理器记录下它已离开符号名为LINE的队,并记下它结束等待状态的时间。根据每个动态实体开始等待和结束等待的时间,GPSS处理器可以计算队中每个动态实体的等待时间。
在通过DEPART LLINE程序块以后,动态实体进入 ADVACE16,4程序块,即我们例中的真正理发阶段。一个ADVANCE程序块使GPSS处理器能够在允许动态实体推移到下一个程序块之前保持某一时间周期。用这样的方法模拟一个顾客理发所用去的时间。当一个动态实体进入ADMCE程序块时,GPSS处理器产生一段占有时间,这段时间是在12到20个时间单位内随机出现的,即相当于从12,13,… ,19,20中等可能地选择其中任意一个时间。
当动态实体离开 ADVANCE程序块时,它马上进入 RELEASEJOE程序块。这个程序块和 SEIZE JOE是相对应的,当动态实体通过RELEASE程序块时,设备JOE的状态由“忙”变为“闲”,即意味着排在队 LINE首部的实体可以进入 SEIZE JOE程序块了。
在动态实体通过 REALEASE JOE程序块后,它进入 TERMI-NATE程序块,它可以终止程序运行。
在程序中的START 25语句,表示本过程将要产生25个理发人,即当有25个活动实体经过TERMINATE模块后,模拟立刻终止。
框图编辑本段回目录
GPSS语言同其他高级语言一样,在编制程序时可以利用框图工具。尤其在编制较为复杂性系统的程序时,提前绘制相应的程序框图是非常必要的。如图列出了GPSS中常用模块的框图示例。
在后面较复杂的例子中,读者将会获知框图在表示系统模型中的各子系统的方便性。
运行编辑本段回目录
本教材是以GPSS/H为教学的基本系统,GPSS/H是在DOS系统下运行的 GPSS版本。我们来介绍一下在 DOS环境下执行 GPSS程序的过程。
(1)进入系统。假如具有 GPSS系统的子目录是 C:\GPSS,则进入 GPSS/PC的步骤如下:
(2)执行程序。进入GPSS系统以后,就可以执行已经编好并存在磁盘上的GPSS程序。执行GPSS时,可将模拟的结果存储在磁盘上,然后再利用文本编辑器去查看,这样可以将模拟的结果存储在磁盘上从而使用户能更清楚地查看及在重新编辑后打印出来。此时结果并不在显示器上显示。例如,我们执行一个EXERI.GPS:
当命令执行完毕,在当前目录下生成一个与EXERI.GPS同名的文本文件,后缀名为.LIS,可直接查看。
也可采用这样的方法来执行命令;
标准输出编辑本段回目录
在用户没有进行特殊的设计时,GPSS语言总是自动地给出一个标准输出。标准输出中包括了各类用户常用的一系列统计数据和模型模拟主要状态的记录。在一般情况下,这种标准输出可以满足用户的需要。当然,如果用户有一些特殊的要求,GPSS语言允许用户自行设计输出,包括统计表格等。
GPSS标准输出主要由扩充程序表、装配模型、模块状态及计数表以及统计表4大部分组成,各部分主要内容如下图。
1.扩充程序表
这个表和我们输人计算机的程序表相同,只是同时给各个语句加上了序号,特别是对各个模块也另加了模块序号。我们从图中也可看出,GPSS语言中的控制语句都是语句,而不是模块,所以并不给它们分配模块序号。
2.装配模型
GPSS语言标准输出中的装配模型表,它将原来以符号名出现的地方用数字代替。如符号名JOE被数字代替,GPSS处理器将它作为扫描时遇到的第一个设备名,同样,符号名LINE也被数字1代替,因为它是GPSS处理器遇到的第一个队名。这些有效的内容组成了GPSS语言标准输出的第二部分。
3.模块状态表
模块状态表,即GPSS语言标准输出的第3部分。它可看做为模拟停止这一时刻状态的“快速摄影”。在这一时间上,绝对时钟读数为472.095 3,它表示25个动态实体通过程序框图需要472.095 3个时间单位。
当前程序块计数器表示模拟停止时各个程序块中的动态实体数。我们可以看到有一个动态实体在 2号程序块内,即在 QUEUE LINE程序块中,所以其他程序块中是空的。
总程序块计数器表明自从模拟开始后曾经进入程序块的总的动态实体数,在图中我们看到有26个动态实体进入1号和2号程序块,而进入3号到7号程序块的动态实体只有25个。
4.统计表
统计表是GPSS语言标准输出的第4部分,这一部分给出设备JOE和队LINE的统计数。从图中可看出,在模拟期间有25个动态实体占有了设备JOE,每个顾客的平均占有设备的时间为16.116时间单位,而设备JOE的平均利用率为0.853,总共有26个动态实体进入队LINE,以及在队内任一时间内没有多于一个动态实体。队的平均含量是0055个动态实体,每个动态实体的平均等待时间是0.993时间单位,26个动态实体中有15个等待时间为零,这些实体占进入队的动态实体总数的57.7%,而不包括这些“零进入”实体(等待时间为零)的其他实体平均等待时间为2.346个时间单位。
GPSS语言中的标准输出的基本格式和内容就是以上介绍的这几种。
常用模块及语句编辑本段回目录
1.语句格式及符号
粗略地说,GPSS把现实系统看成是几个进程相互作用的结果。它把现实系统的组成元素分成两类,一类叫活动实体,一类叫资源实体。活动实体可以产生也可以消失。活动实体来到系统,向资源实体申请服务,接受服务进行某些活动,所有活动进行完毕就消失了。资源实体是向活动实体提供服务的,它不能产生也不会消失,不同的资源实体有不同的特性。一个进程是某些活动实体系统的全过程。这个过程典型地包括这样的一系列活动:到达系统、排队、申请服务、得到服务而占有资源实体一定时间、服务完毕离开系统,或由于其他原因而相互作用。GPSS还有特定的记录排队及有关服务的不同信息的机制。活动实体是系统的主动因素,它激发了动作的进行。建模的第一步是找出向系统提出服务要求的主动者,提供眼务的设施,分析系统动作的变化过程。然后以主动者为“龙头”,将它动作的全过程用进程描述出来。GPSS的块语句简练地描述很多典型的活动。
首先介绍一下GPSS语句格式及四个简单概念。
GPSS模型是由语句构成的。GPSS语句采用固定格式,每句80列,1个语句分为3个部分。第1部分从第2列到第7列;第:3部分从第8列到第18列;第3部分从19列到71列。此外,第1列是注释行标记,若第1列上有“*”号表示该行为注释行;第72列是继续行标记,如果继续行标记上有除空格外的字符,则表示下一行的内容应继续与本行相连接;第73列至第80列为行标识,留作程序语句排序号。
有3类主要语句;块语句、说明语句、控制语句。块语句是可执行语句,用于描述进程的细节。GPSS中大约有50个块。
块语句的第1部分为地址区,用户可以为地址命名。命名地址是块的标识符,也可以用块的实际序号作为地址。
块语句的第2部分为操作区,它由主操作码及辅操作码组成,主操作码用英语概括地描述这个块语句的主要特征。一般地,这个操作码应该是一个动词,而到达的活动实体是主语,操作对象是宾语。辅操作码辅助说明操作的类型或条件。
块语句的第3部分是参数列。它们具体详细地描述了操作对象,操作对象是资源实体或标准数字属性及其他。此外参数列中也有表示操作方式的参数。参数列可以是空的,最多包括9个参数,分别称为第1个参数或A场或A字段,第2个参数或B场或B字段,…,直到第9个参数或1场或1字段。
说明语句是不可执行的,它说明某些必须说明的资源实体的特征,为随机数置初始乘子或为资源实体赋初值。说明语句的第1部分一般是被说明的资源实体的名字;第2部分是资源实体的类型;第3部分是这个被说明的实体的特征。它也是用参数列的形式表示,类似于块语句,但参数个数很少,最多只有4个。
控制语句是控制执行的。一般第1部分是空的;第2部分是控制码,是控制动作本身;第3部分是控制属性说明,详细说明控制的有关方面。第3部分也用参数列的形式,参数列类似于块语句,但参数个数很少,最多只有4个。
再介绍语句中出现的一些简单概念。
(1)实体标识符。
用户为实体命名的字母数字串,以字母打头,由3个~5个字母或数字组成,用来惟一标识系统中各种实体(包括资源实体及块实体)。
(2)运算符集合,见下表
2.基本实体
按GPSS各模块的功能,或者按管理系统内各类设备及人的不同功能,我们可以将GPSS语言中涉及到的基本实体分成如下两类。
(1)活动实体。
活动实体(TRANSACTION ENTITLES)是被模拟的现实系统的一个组成元素。它来到系统又离开系统,同时引起一些事件并利用系统的资源。很多客观对象都可被模拟为活动实体。例如,电话系统的一次呼叫(它来后等待转接线,接通后消失),装配线上的工件(工件等待工人装配,装配完毕后作为成品运走),到港的船只(等待装载满后出港),都可以比做活动实体。希望用GPSS模拟的系统必须有活动实体。
一个活动实体有3种产生方式。第一种用GENERATE块生成;第二种用SPLIT块产生某个活动实体的同类复制件,该复制件也作为一个活动实体;第三种当系统很大很复杂时,有的活动实体在系统中活动了一定时间后,不再需要继续活动,可以暂存在磁带或磁盘中,在需要的时候可用JOBTAPE语句从磁盘或磁带中把先前存入的活动实体读出。
一般地,在一个系统中可同时存在的活动实体的最大数是100。若系统太大,可以用REALLOCATE或$MAXTRP。NS改变它。
活动实体生成后,按进程所指定的次序顺序地从一个块语句进到另一个块语句,相当于执行一系列事件,有几个块语句能更改这个顺序。如 TRANSFER可以引出各种分叉;LOOP使之循环一定的次数;GATE、TEST等块语句根据某些系统状态值(即此刻标准数字属性)把活动实体引导到某些特定的通路上去。
一个活动实体总是继续不断地力图从一个块流动到另一个块中去,只有下列三个原因之一会阻碍它的前进。
(a)进入某块的条件不成熟,例如要进入的某个资源实体(例如某个FACILITY)处于忙态。
(b)ADVANCE块使之滞留在一个给定的时间。
(c)活动实体离开模型系统,可能是由于被TERMINP。TE销毁,或者是ASSEMBLE将他与其他同类复制件合并。当正在运行的活动实体不能再顺着进程指令向前流动时,GPSS就调度另一个条件成熟的可以运行的实体,重复这个尽可能向前流的原则。
实体有时要用属性(ATTRIBUTE)说明其特性;有时需要用参数(PARAMETER)保存信息。
可以用属性来区别不同类的活动实体,或同一类实体中的个别实体,或同一个活动实体在不同活动阶段的情况。
实体属性包括:优先级(或优先数、优先权(PRIORITY))、标记时刻(MARK TIME)、渡越时间(TRANSIT TIME)及同类复制件集总数(ASSEMBLE SETNUMBER)等。
优先级的范围从0到127,GENERATE的第5个参数可以在活动实体进入系统时赋予它优先级。第5个参数是空的,则进入系统时它的优先级为0,PRIORITY块可以在进程中赋予它优先级。
MARK TIME记录活动实体产生时刻的时钟的值,但用 MARK块可以把活动实体过 MARK块的时钟值记人MARK TIME中。
渡越时间等于现在时钟值减去 MARK TIME中的值,所以渡越时间等于活动实体从MARK(或从进入系统)时刻到目前为止所渡过的时间。
从GENERATE出来的活动实体成为同类复制件的第一个成员。之后,如果用SPLIT块,则可复制新的成员,称原活动实体为“父母”成员。复制件还可以再复制下去,成为“子女”、“子女” 的“子女”,有一条链将它们连起来,从第一个开始到其后的,最后的又连回来。尽管它们连接在一起,但它们可以独立地流动。ASSEM-BLE块可以将两个以上的同类复制件合成一个活动实体,其他的活动实体就消失了。
实体的参数存储着实体的局部值。它可以区分实体类,也可以区分同类实体中的个别实体。有4类不同的参数:全字长参数、半字长参数、字节参数、浮点型参数。全字长参数存放一549 755 813 887到一f-549 755 813 887的整数;半字长参数存放一32 767到十32 767的整数;字节型参数存放一127到十127的整数,若超界,则存放在该数除以 128后的余数。用 ASSIGN对这些参数赋值。
系统中的活动实体在不同的时刻激起不同事件,依时间的先后进行这些活动是很合理的。然而可能有若干个事件同时发生,为确保活动实体以正确的次序运动,需要将活动实体连成链(CHAIN)。活动实体必须是下列链的成员之一。为了便于后面的讨论,此处先说明事件是如何顺序地进行调度的。
(a)当前事件链(CURRENT EVENTS CHAIN),简称 CEC。在系统当前时刻即可流动的活动实体链成CEC,链中事件依时间先后排序;在同一时间事件中依优先数排序;如果有几个活动实体的优先数相等,依先到先出排列(FIFO)。每个CEC链中的活动实体都处在以下两个状态之一。活动态(ACTIVE),在当前时钟值,这个活动实体就可以活动;被耽搁状态(DELAYED),这个实体按时刻表排列可以活动了,但是被进入的块的条件还不满足,所以GPS.S调度程序不能调度它,只好暂缓执行,直到条件成熟时再令其向下流动。此时活动实体要连在某个实体的某种延迟链中。
(b)未来事件链(FUTURE EVENTS CHAIN),简称 F’EC,由预定在未来时间活动的活动实体构成,它们按将要发生活动的时间先后排序,先发生的排在前头,同时发生的按优先级来排序,同优先级的按FIFO排序。
(c)用户链(USER CHAIN)。用户根据本身的需要通过 LINK指出的某些活动实体的顺序,形成一条用户链。一个活动实体连人用户链后,GPSS调度程序就不管它了。UNLINK可以把活动实体从用户链上摘下来,排入当前事件链上去。
(d)等待匹配链(MATCHING CHAIN)。类似由 ASSEMBLE块阻碍其活动的活动实体就连在该链中。
(e) 被阻塞链(IN******T*HMN),也称延迟链(*E]-*YCHAIN)。当某个活动实体要进入某个设施,但该设施又被别的活动实体占据了,或者由于某种其他原因不能进入,则活动实体就排在等待某原因的被阻塞链上。例如,等待占据了的单设施,等待未占据的
单设施等都形成被阻塞链。
以下为全部的被阻塞链:
(i)单设施被占用(U);
(i i)单设施未被占用(NU);
(iii)单设施被强占(I);
(iv)单设施未被强占(NI);
(v)单设施可用(FV);
(v i)单设施不可用(NFV);
(vii)单设施未被要占用它的那些活动实体占用(FNUT);
(viii)单设施未被要占用它的那些活动实体强占(FNIT);
(ix)复设施空(SE);
(x)复设施不空(NSE)
(xi)复设施满(SF);
(xii)复设施不满(SNF);
(xiii)复设施可用(SV);
(xiv)复设施不可用(SNV);
(xv)ENTER块被阻塞链(即复设施可用,但空位不够);
(xvi)等待逻辑开关置位(LS)
(xvii)等待逻辑开关复位(LR)。
(2)资源实体。
资源实体(RESOURSE ENTITIES)是系统的另一类组成元素。它不会产生、.增加或减少,但活动实体激发的事件,会使之状态产生变化。
(a)设施实体(EQUIPMENT ENTITIES)。
设施实体是向活动实体提供服务的,共有3种:单设施、复设施、逻辑开关。
(i)单设施(FACILITY)。
单设施是每个时刻只能向一个活动实体提供服务,它可以处于忙态或闲态。当它向一个活动实体提供服务,则处于忙态。也可以说它被活动实体占据的或被活动实体抓住了。这时若有活动实体也要求进入,则不可能。欲进入(SEIZE)的实体需要挂在被阻塞链上,形成一条等待此单设施空闲的延迟链。占据了单设施的活动实体离开后,另一个才可以进入。但有较高优先级的活动实体可以强占一个单设施。例如,若一个理发员只可以为一个顾客理发,则顾客是活动实体,理发员是单设施。如果后来的顾客有较高的优先级,则他可以强占正在工作的理发员,驱逐原来被理发员服务的顾客,使其人队头等待,而让理发员为自己服务(PREEMPT)。
(ii)复设施(STORAGE)。
复设施的容量是大于等于1的数。必须用说明语句STORAGE说明它的容量,否则就认为它的容量无限大。复设施容量大小可以设想为一些空位置,它向一个活动实体提供服务时(ENTER),容量就减小某个给定的正整数。当剩下的容量不够向一个活动实体提供时,活动实体就要等待它的容量够了以后,才可以被复设施接受服务。
当某个活动实体归还复设施空位时,复设施的容量增加某个给定的正整数值。但如果LEAVE要求退出的空位多于它已占据着的空位,则应给出出错信息。
例如,对一个可以停100辆车的停车场,假设车是活动实体,停车场是容量100的复设施。如果已有100辆车停在其中,则它就全被占据了;如果有50辆车停在其中,则它还可以提供50个位置。它共有101种不同的状态。
对一个可以装500升油的油箱,设初始时,油箱装满了油,每次使用 5升油,每次加 300升油,则油箱可以被认为是复设施,其容量是500升。而一次用油事件(ENTER)使之减少5升;一次加油事件(I。EAVE)使之增加 300升。但当此油箱中油少于 5升时,不能用它加油;当它的油多于200升时,就不能向它加油了。
(iii)逻辑开关。
逻辑开关作为一种状态向活动实体提供服务。这有两种状态:0和1。例如,一个锁可以被看做为逻辑开关,关闭和开放。活动实体到来,将逻辑开关置位、复位或翻转,但它不阻滞这个活动实体。活动实体可以继续前进。与逻辑开关有关的语句有LOGIC,它为逻辑开关置状态。
(b)统计实体(STATISTICS ENTITIES)。
统计实体用于收集、显示运行中的某些统计数据。统计实体包括队(QUEUE)和表(TABLE)。
(i)队(QUEUE)。
这个“队”是名词的队,它用来记录活动实体进入不了单设施或复设施时,排队等待的有关信息,如队长、等待时间等等。
(ii)表(TABLE)。
表用于记录某种频率分布。有如下类型:到达速率、相差到达速率、标准数字属性、自变量差及队延迟时间等。
3.标准数字属性
GPSS语言开辟了一批存储单元,为模型模拟存储信息,称它们为标准数字属性(STANDARD NUMERICAL ATTRIBUTIES)。它们从各个侧面反映模型系统的实际状态,有的反映系统全局方面的变量,如时钟值、终止计数器值;有的反映种类实体的属性值,如某队队长。
系统的静态可由系统的组成实体及实体的属性来表征,所以,标准数字属性正是系统静态描述的数据结构。由于有了标准数字属性,建模者与计算机对系统状态的具体描述有了共同的语言,因为对每个表征状态的量双方都有一个可以识别的共同的名字。
因此标准数字属性一般都可以作为事件作用的对象,标准数字属性正是块语句的操作对象。
根据建模者的设计,系统的活动实体及系统的资源实体都是确定的,所以具体的标准数字属性都是可以罗列出来的。例如,系统中有两个FACILITY,贝u FI,FZ,FRI,FRZ,FCI,FCZ,FVI,FVZ,FTI,FTZ分别指明1号单设施正在使用的情况,2号单设施正在使用的情况;1号单设施不在使用的情况,2号单设施不在使用的情况,等等。在系统事件发生的瞬间这些内容可能发生变化。
由此可见,GPSS程序与一般高级语言程序不同。GPSS程序的数据结构不必由编程者明显地写出来,他们无须写到数据项名一级,只要在程序中描写到实体名一级就够了。根据编程者所列举的所有实体,GPSS编译系统按固定的规则生成标准的实体属性数据项名。这些数据项的型自然也是由GPSS编译并定义的。
以下把 BURROUGH机器上的 GPSS使用手册中的全部标准数字属性罗列出来,并说明各个实体的标准数字属性、助记名及其含义。
所谓助记名是从计算机程序的角度出发标识该单元的变量名(数据项名),这个变量名可以用作块语句的实参。以下列举助记变量名的尾标只用实体的序号表示,但在程序中还可以用$号加上实体本身的名字表示。GPSS能自动转换成系统实体序号。例如,对于单设施JOE,如果它在系统中的序号为1,则FI及F$JOE的含义是一样的,都是指JOE是否处于忙态(实体的序号甚至可用间接地址表示)。
活动实体、资源实体及块实体的标准数字属性较易理解,GPSS的另两个主要的系统变量、时钟和终止计数器需多加以说明。它们是重要的标准数字属性。
GPSS中有两个时钟,一个叫绝对时钟,用AC1表示;一个叫相对时钟,用C1表示。时钟只取整数值,时钟值只有与单位相结合才能真正表示时间的量。设时钟值为15,如果单位是分,则表示15分;单位是年,则表示15年;单位是0.1分,则表示1.5分。
第一个活动实体起码要求时钟值为l时产生,所以任何事件的最小时间为1。
GPSS的时钟跳格走。它不像机械表那样连续缓慢地走,经过每分每秒每时刻。只有出现了使系统状态变化的具体事件,才会使GPSS的时钟跳到发生变化的时刻上去,而这个时刻是用整数表示的,所以当精度不够时,建模者就要将时间单位取小一些。
绝对时钟从零开始,一个事件一个事件地步进,永远也不回头,直到模拟的终点。控制语句RESET可以倒拨相对时钟回到零,为了便于统计,每次进行一个新模拟实验时,可以把相对时钟拨到零。因此,绝对时钟从零开始不断地增大直到模拟完全结束。控制语句RE-SET可安排每个具体的模拟实验,并在每次具体实验开始时,把相对时钟置零。因此相对时钟在一个具体实验中从零逐渐变大,在第二次具体实验开始时又回到零。
终止计数器用于控制模拟结束。控制语句START为终止计数器置数(所置的数存于它的A参数中)。在模拟进行中,活动实体退出系统(用 TERMINATE),把终止计数器减去一个整数(此数存在于TERMINATE的第一个参数中,若它为空则代表零),直到终止计数器为零时,一次模拟实验就结束。
4.标准逻辑属性和布尔表达式
为了存储某些实体状态的逻辑值,GPSS还定义了一些布尔型的存储单元,称之为标准逻辑属性。它们的数量很少,在此简单地罗列。表 7—3中的实体序号 j可用$sym代替,其中 sym是实体状态的标识符。
布尔表达式将在以后的语句中出现,与这些标准逻辑属性有关。此处先介绍什么是简单的布尔表达式。首先,标准逻辑属性是布尔表达式。第二,所有的标准数字属性(浮点型的除外)是布尔表达式。如果其值非0,则其布尔值为1;如果其值是0,则其布尔值为0。第三,两个数字属性比较操作运算构成一个布尔表达式,结果是一个布尔值。
复杂的布尔表达式可由上述简单布尔表达式用布尔运算符复合而成。递归地,布尔表达式的布尔运算结果也是布尔表达式。例如:
LS3*LR4+CI“G”300
是一个布尔表达式。它表示逻辑开关3置位并且逻辑开关4复位或者相对时钟值大于300时取真值,否则取假值。
5.语句中的若干记号
为了把语句讲述清楚以及使书写简单,以下定义了一些记号,并给予说明。
(1)sym 表示标识符,由字母打头,3~5个字符组成的字母数字串。它用以标识实体,由用户为标识一个具体实体而设计。也称实体名,如块标识、块名、设施标识、设施名等。
(2)实体类型 下表中的字母作为实体类型。
(3)参数集合。
k 整数
sym 实体名
SNA j实体的标准数字属性,结果为一个数
SNA$sym sym的标准数字属性,结果为一个数
SNA*SNAj 间地址,j实体的某标准数字属性的值是一个序号,求此序号的实体的标准数字属性,结果为一个数
表达式 以前表述的 k,sym,SNA,SNA$sym,SNA。SNA为元素,用算术运算符连接成算术运算的式子,结果为数
例如:
8 表示第8号实体
JOE 表示某个实体名
Q7 表示队7的长度,此值指出某实体的序号
S$SEAT 表示名为SEAT的复设施当前含量,此值指出某个实体序号
FN*PHZ 表示以当前活动实体的字长参数2的值为序号的参数的值,此值表示某实体序号
NS+PF4 用块8的当前含量加上活动实体全字长参数4的值,得到一个值,以此结果为某实体的序号
(b)PSAI={K,SNAj,SNA,$ sym ,SNA ,*SNAj(表达式)}
PSIA的结果只能是一个数,不能是一个实体名,这个数就是某实体的序号,即PSIA中包括的与PAI包括的元素基本相同,只是在PSIA中不包括sym。所以在此不—一列举,参见PSI即可。
(C)Px={PH,PB,PL,PF}
它们代表活动实体的各种类型的标识。具体含义如下:
PH 半字长参数PB 字节型参数
PF 全字长参数PL 浮点型参数
(d)PSZ={hPx,SNA Px,SNA*SNA Px,(表达式)Px}
它由两部分组成。前半部 k,SNA等,如 PSIA的含义;后半部称为后缀,如Px的含义一般表示活动实体的某个具体的确定类型的参数,有时也可以表示某类参数的个数。
例如,Q7PH表示以队7的长为序号的半字长参数,设Q7=3,表示第3号半字长参数或半字长参数3,有时也可以表示3个半字长参数。
(e)Xx={XF,XH,XB,XL}单存数单元的类型的集合,
其中
XF 全宇长单存数单元 XH 半字长单存数单元
XB 字节型单存数单元 XL 浮点型单存数单元
(f)Mx=(MH,MB,MX,ML } 矩阵存数单元类型的集合,其中
MH 半字长矩阵存数单元 MB 字节矩阵存数单元
MX 全字长矩阵存数单元 ML 浮点矩阵存数单元
(g) 布尔表达式
(h)参数后缀 参数后缀用“士”表示,意思是从空的、有“十”号的、有“一”号的三者中任选一种。空表示替代型式,“十”表示累加型式,“一”表示递减型式。
(i)FN@某个函数,用@替代某个可以求出的值。它的完整的具体型式可以是F州,或SNA$sym,或FN。SNN,或FN * SNA $ sylll。
(4)辅操作码的集合(MO)。
(a)MO1={G,GE,E,L,LE,NE}分别代表大于、大于等于、等于、小于、小于等于、不等于。
(b)MOZ={U,NU,I,NI,FV,FNV},其中
U 单设施正在被使用 NU 单设施未被使用
I 单设施被中断 NI 单设施未被中断
FV 单设施可用 FNV 单设施不可用
(C)MO3={SNE,SF,SNF,SV,SNV},其中
SNE 复设施不空 SF 复设施全满
SNF 复设施不满 SV 复设施可用
SNV 复设施不可用
(d)MO4={LS,LR},其中
LS 逻辑开关置位 LR 逻辑开关复位
(e)MO5=(MIN,MAX},其中
MIN 求最小 MAX 求最大
6.常用说明语句
(1)FUNCTION说明语句。
其功能是定义函数,有两种形式:用户定义的函数和解析函数。
用户定义的函数的基本格式如下:
sym(或 k) FUNCTION A,B,C
, / , / ,…, ;/ ,
其中: sym 表示函数名
K 表示函数序号
A 可为 SNA、SNA$sym、SNA。SNA,表示自变量
B 表示函数类型
Cj j点连续数字型
Dj j点离散数值型
Lj j点,自变量自然数,因变量数字,点列数值型
Ej j点,离散属性型,自变量为数值,因变量为标准数字属性
Mj j点,自变量为自然数,因变量为标准数字属性,点列标准数字属性型
Sj j点,自变量为数值,因变量为实体名,点列实体型
C 当 B为 Sj时,C为实体类型,表示因变量的实体可能的类型,单个或几个(一串用逗号分开),其余类型为空
第二行的点对表示自变量与因变量相对应的情况。
例如:
RATE FUNCTION RNZ,C3
0.0,0.0/0.19,2.5/0.59,16.1
这是一个3点连续型函数,当自变量RNZ分别为0.0,0.19,0.59时,因变量RATE分别为0.0,2.5,16.1。自变量在中间值时,取线性插值。
8 FUNCTION PH1,D4
—2.0,16/一1.3,11/0.7,9/12.0,0
这是一个4点离散型函数。当自变量PH1取(一∞,一2.0」时,函数8取16;PH1取(一2.0,一1.3」时,函数8取11;PHI取(一1.3,0.7)时,函数8取9;PH1取(0.7,12.0]时,函数8取0。
对于自变量XF$KEY取某值,函数4取相应的值。如XF$KEY—2,FN4—0.5。
FAST FUNCTION RNI,E #
0.2,S$UNIT/0.7,F$UNIT/1.0,Q$LINE
当 RNI在(0,0.2]中时,FAST为 S$UNIT;当 RNI在(0.2,0.7j 中时,FAST为 F$UNIT;当 RNI在(0.7,1.0] 中时,FAST为 Q$LINE。
EQUAL FUNCTION XH3,S4,Q,S,T1,ONE/2,NEXT/2.5,OUT/3,DCTR
这是一个4点实体名函数。当XH3在(0,1]中时,EQUAL为 ONE;XH3在(1,2] 中时,EQUAL为 NEXT;XH3在(2,2.5]中时,EQUAL为 OUT;XH3在(2.5,3] 中时,EQUAL为 DCTR。
此处的函数值是变量名。这些变量名可以是组名,也可以是设施名,还可以是表名。
例如:若 XH3—2,贝u SEIZE FN$EQUAL,代表 SEIZENEXT;而 QUEUE FN$EQUAL代表 QUEUE NEXT。
IFUNCTION PFZ,M3
,Q$LINE/,Q$WAIT/,U$BLUE
这是一个3点离散标准数字属性函数。当PF2为1,2,3时,函数 1的值分别为 Q$LINE,Q$WAIT,U$BLUE。
本格式如下:
sym(或 k)FUNCTION A,B,C其中:
sym 标识函数名
k 标识函数序号
A RNI到RNS之一,表示自变量
B 标识函数类型
UNIFORM 均匀分布
EXPON或EXP 指数分布
POISSON或 POI 泊松分布
NORMAL或NOR 正态分布
C 标识上述分布的均值,或其他最必要的参数,用逗号分隔。具体格式团编译不同而异。当有此类语句出现时,再予以解释
例如:
UFORM FUNCTION RNZ,UNIFORM,1,10
UFORM到 10之间均匀分布,其自变量是RNZ。
EXPON FUNCTION RN3,EXPON,1
函数名为EXPON,是指数分布函数。自变量为RN3,均值为1。
FUNCTIONRNI,POISSON,50
表示函数1是泊松公布的,自变量为RNI,均值为50。
7 FUNCTION RNS,NORMAL,16.2
函数 7是正态分布函数,方差是 16.2,自变量是 RNS。
(2)INITIAL说明语句。
其功能是赋初值,基本格式如下:
INITIAL A,B
其中:A 可为SNA或SNA。SNA,其标准数字属性一般为矩阵存数单元,单存数单元及逻辑开关
B 如为数,则表示赋的值;如为空,则隐含为逻辑开关置位
例如:
INITIAL XF10,8
为全字长单存数单元SF10赋8。
INITIAL LSI——LSS
为 LSI到 LSS之间的逻辑开关置位。
INITIAI MXI—MX3(l—2,3一5),一1
把 MXI到 MX3的所有矩阵的第 1行至第 2行的第 3列到第 5列的单元赋值一1。
INITIAL XH$SVEI—XH$SVE6,10/工S3/l-510一LS12
把从SVEI到SVE6的半字长单存数单元都赋10,把1石3及LS10到 LS12都置位。
(3)RMULT说明语句。
其功能是置初始乘子,基本格式如下:
RMULT A,B,C,D,E,F,G,H
其中A—H分别是RNI到RNS的初始乘子,初始乘子数就是奇数,位数因机器而异。
例如:
RMULT 7254321,,,,,,,,9143271
(4)STORAGE说明语句。
其功能是给复设施变量定义,基本格式有两种:
第一种格式:
sym(或 k)STORAGE A
其中:sym 表示复设施名
K 表示复设施序号
A 表示复设施的容量
例如:
SEAT STORAGE 10
表示复设施SEAT容量为10。
第二种格式:
STORAGE AI,BI/AZ,BZ/A3,…
例如:
STORAGE SS,100/SI—S4,300
表示1—4号复设施容量为300,5号复设施容量为100。
7.常用块语句
(l)ADVANCE块语句。
其功能是表示时间的步进,基本格式如下:
ADVANCE A,B
其中:A 平均滞留时间或相乘系数
B 表偏差:如为数,表示滞留时间为AB;如为函数,则表示滞留时间为A*B
例如:
ADVANCE 10,6
活动实体滞留时间为10士6,即在〔4,10〕之间。
ADVANCE PH4,FN$RATE
活动实体滞留时间为PH4乘以函数RATE。
ADVANCE QT2
活动实体滞留时间等于到现在为止每个活动实体在队2中平均停留时间。
ADVANCE
活动实体穿过这个块,没有停留时间。这样就是为了有一个可以收容活动实体。因为有的活动实体进不到下一块,可能妨碍上一个块的执行。
例如:
GENERA”fE 10,6
SEIZE JOE
当JOE忙时,如果恰好是新的活动实体产生的时候,那么这个活动实体不能离开GENERATE块,所以阻滞了现在及以后适时地产生活动实体。这对正确地产生活动实体是不利的,应在其中加上一个空的 ADVANCE。这个空的 ADVANCE收容进入不了JOE的活动实体。例如:
GENERATE 10,6
ADVANCE
SEIZE JOE
(2)ASSIGN块语句。
其功能是表示参数的赋值,基本格式如下:
ASSIGN A,B,C,D
其中: A 表示序号或范围
B 若C为空,则为赋予参数A的值;若C为函数,则将B。C赋予参数A
C 函数名
D A参数类型
它为进入的活动实体的D类型的A参数赋值B或B*C。
例如:
ASSIGN 7,S$PARK,,PF
复设施PARK的当前容量放在进入的活动实体的全字长参数7中。
ASSIGN 11+,XHS,FLOW,PL
函数 FLOW与半字长存数单元 5的积,加上进入的活动实体的浮点参数11,其和存入参数11中。
相当于下面一系列操作:
进入的活动实体的半字长参数 3减去 Q$WAy,差存入参数3中。
(3)DEPART块语句。
其功能是活动实体离开队列,基本格式如下:
DEPART A,B
其中:A 表示队名
B 表示移去的单位数,为空时表示移走一个单位
活动实体进入该块后把队A中的B个单位取走。移走的单位数与进入队的个数可以不等,但如果大于人队的个数,则出现错误。
例如:
DEPART MX7(1,5)
表示进入的活动实体从以存于矩阵存数单元7的1行5列的内容为序号的队中,取出一个活动实体。
QUEUE LLL,2
……
DEPART LLL,6
QUEUE块让活动实体进入队LLL中2个单元,DEPART块却让它取去6个单元。如果在这以前没有QUEUE块,令活动实体进入队LLL,则出错。
DEPART LINE,XL7
假设存于浮点存数单元7的数是4,则从队LINE中取走4个单元。
(4)ENTER块语句。
其功能是使活动实体进入复设施,基本格式如下:
ENTER A,B
其中:A 表示复设施名
B 表示复设施中的空位置数,如为空,则表示l活动实体使用复设施A的B个空位置。
例如:
ENTER PARK
活动实体占用了复设施PARK的一个单位
STORAGE S$BARK,5
……
GENERATE,,,10
……
ENTER BARK,4
复设施BARK的容量被定义为5,第1个活动实体占用了4个单位,以后的活动实体也要占用4个单位。如果前面的活动实体尚未退出,则只剩1个单位,不能被后一活动实体使用(空位不够)。所以,后一个活动实体只能进入复设施BARK的延迟链。
STPRAGE S1——S5,10
……
ASSIGN 2,FN3, ,PH
ASSIGN 3,FN4, ,PH
ENTER PH2,PH3
……
LEAVE PH2,PH3
复设施1至5的容量定义为10。设FN3=有,FN4=l,则活动实体的半字长参数2为3,半字长参数3为1。这样,进入复设施3时占用了五个单位,离开复设施3时释放了1个单位。
(5)GATE块语句。
其功能是检测设施,基本格式如下:
GATE MO A,B
其中:MO 可以取 MO2,MO3,MO4,M,NM
MOZ 这时A表示单设施名
MO3 这时A表示复设施名
MO4 这时 A表示逻辑开关名
M 指有与A中的块匹配的活动实体
NM 指没有与A中的块匹配的活动实体
A 表示块名,这应是一个MATCH块,查匹配链看有无活动实体已在等待A块中的活动实体
B 表示块名,检查不成功的出口,若空则停留在本块
进入的活动实体检查A设施是否满足MO条件。如果满足条件则向下一块去;否则,到B所指的块中去。如果B空,停留在GATE中。
例如:
* MODEL SEGMENT 1
GENERATE 16.7
GATE LR CLOSE ,SHUT
…
TERMINATE
*MODEL SEGMENT 2
GENERATE 480
LOGICS CLOSE
TERMINATE
模拟开始时,逻辑开关处于RESET的状态,所以MODELI的活动实体可以通过GATE块直接下到下面一个块。当时钟值到480时CLOSE变为 SET所以 MODELI的活动实体就转向 SHUT
GATE M MTCHI, NOMCH
活动实体进入GATE块之后,就扫描检查等待匹配链,看有无活动实体在名为MTCHI的块中等待与它匹配。若没有进来的活动实体就到NOMCH块去;否则就到下一块去。如果进来的活动实体是它的同类复制件中惟一的一个成员,则出现运行错误。
(6)GENERATE块语句
这是最重要的一个块,它产生所有的活动实体。其基本格式如下:
GENERATE A,B,C,D,E,F,G,H,I产生实体
其中:A 实体产生的平均间隔时间,隐含值为零
B 实体产生的间隔时间方差,隐含值为零;如B为数,则活动实体的产生时间范围为A士B;如果B为一个函数,则活动实体的产生时间间隔是由A的值乘以B函数的值决定的
C 活动实体首次到达时间,隐含值为零
D 活动实体最大生成数,隐含值为理论无限
E 产生的活动实体的优先级
F 至 I某类型参数的个数,分别设立全字长(PF)、半字长(PH)、字节型(PB)和浮点型参数(PL),每类参数最大个数为255,如果此四项均空,隐含仅有12个半字长参数。若有任一参数定义,则后面未定义的类型均为零个
例如:
GENERATE 350,200,,,,6PF,SPH,SPL
表示活动实体生成的时间间隔为[150,550],每个活动实体有6个全字长、8个半字长、5个浮点型参数
GENERATE 60,FN$ARIVE,10,7,3PB,SPF
表示第一个活动实体在第10个时间单位到达,到达的时间间隔为60倍函数ARIVE的当前值,即60。FN$ARIVE。每个活动实体的优先级为7,每个活动实体有3个字节型参数和8个全字长参数。
INITIAL XF$TIME,25
…
GENERATE XF$TIME,50
因为单存数单元TIME的初值为25,所以产生间隔为25士50。不过此例中间隔时间出现负值,因而会在运行中出现错误。
GENERATE,,,100,,0 PF
在时间0时(实际运行时只能在时间值为1时)生成100个无参数的活动实体。
(7)LEAVE块语句。
其功能是离开复设施,基本格式如下:
LEAVE A,B
其中: A 表示复设施名
B 表示A的单元数
进入的活动实体释放复设施A的B个单元。
例如:
LEAVE 4,15
活动实体进入后释放了复设施的15个空位。
ENTER OVEN,3
LEAVE OVEN,5
第一名活动实体占用了复设施OVEN的3个空位;第M名活动实体要释放OVEN的5个空位。如果中间没有其他活动实体又占用***N的空位,第二句会产生运行错误。
GENERATE , , , 2
…
ENTER OVEN,3
ADVANCE 10
LEAE OVEN,5
如果产生的两个活动实体,在一个还未离开复设施时另一个也占用了复设施,则它们占据了OVEN的6个空位。当一个活动实体进入LEAVE,它释放OVEN的5个空位。同时,第二个活动实体也到了 LEAVE,它也想释放 OVEN的 5个空位。但此时 OVEN只有一个位置被占用,所以引起了运行错误,程序将终止。
(8)LINK块语句。
其功能是将活动实体排人用户链,基本格式如下:
LINK A,B,C
其中: A 表示用户链名
B 为FIFO,则表示将进入的活动实体放入链的尾为LIFO,则表示将进入的活动实体放在链头,先进后出
为PSZ,为某类型参数,依活动实体这个参数大小,由大至小排入用户链,解链时大的先出
C 表示块名,如为空,则表示活动实体无条件入链
当用户链指示器置位时或C为空时,LINK将进入的活动实体从当前事件链中摘下,排人用户链A。若C不空,在用户链指示器复位时,活动实体不进入用户链,而到C所指示的块中去。初始时或用户链空时,用户链复位,用户链中有活动实体就置位。B是用户链结构。
例如:
LINK UCHN,FIFO,GOTO
GOTO
SEIZE FAC1
……
UNLINK UCHN,GOTO,1
第一个活动实体进入 LINK时,UCHN用户链的指示器是复位(RESET),所以活动实体直接到GOTO的块上去。同时把用户链的指示器置位(SET),以后它将处于置位态,除非链变为空时,才又再次复位。所以以后的活动实体到后,要排人UCHN的用户链中。当有活动实体到UNLINK块时,它将UCHN的第一个块解下来,送到GOTO处。
LINK 5,SPH
所有进入的活动实体无条件地按它的半字长参数8的大小,链人用户链中。
(9)LOGIC块语句。
其功能是置逻辑开关,基本格式如下:
LOGIC MO A
其中:MO 为S时,表示把A置为SET态,即置位
为R时,表示把A复位为RESET态,即复位
为I时,表示把A翻转,即原为SET变RE-SET,原为 RESET变 SET
A 表示逻辑开关名
例如:
LOGIC S 1
把逻辑开关1变为SET。
LOGIC R STORE
把逻辑开关STORE变为RESET。
(10)LOOP块语句。
其功能是控制循环,基本格式如下:
LOOP A,B
其中: A 为某类型参数,参数存循环次数
B 表示块名,即循环起点块
控制进入的活动实体在B到本块之间循环A次。
例如:
ASSIGN 1,3,,PH
ASSIGN 2,6,,PH
SLOOP ASSUGB 2+,1,,PH
QUEUE PH2
SEIZE PH2
DEPART PH2
ADVANCE FN $ ATIME
RELEASE PH2
ELOOP LOOP IPH , SLOOP
CONT
活动实体的半字长参数1中存有循环次数3,半字长参数2从6开始逐次加 1,它们是队号、设施号,所以活动实体从SLOOP到ELOOP重复3次。第一次PH2=7,第二次PH2=8,第三次PH2=9。结束后,实体到块CONT中去。
(11)MARK块语句。
其功能是标记当前时间,基本格式如下:
MARK A
其中: A 为某类型参数,它代替MARK TIME,活动实体进入 MARK块,把当前时钟值记于此为空,由把当前时钟值记入 MARK TIME中,即把当前时钟时间记入 A中。
例如:
MARK
把当前的时钟值记人活动实体的 MARK TIME属性中。
MARK 4PF
把当前时钟值记人活动实体的全字长参数4,此后它将成为MARK TIME属性。
MARK FC$CLERK$PH
CLERK是一个单设施,活动实体进入 MARK时,设 CLERK被活动实体抓住的次数为2,由当前时钟值存入半字长参数2中,作为 MARK TIME。
(12)PREEMPT块语句。
其功能是强占单设施,基本格式如下:
PREEMPT A,B,C,D
其中: A 表示单设施名
B 为PR时,如果单设施己被其他优先级低的活动实体强占,则进来的活动实体可以强占它为空时,如果单设施已被其他活动实体强占,则进来的活动实体不可以强占它
C 表示块名,指出被赶走的活动实体的去向。3。果D为非空,则C必须说明。如果被赶出的活动实体既不在未来事件链中,也不是刚从ADVANCI:块中出来已进入当前事件链,则不必理会C
D 为某类型参数,确定一个存值参数。如果被赶出的活动实体在未来事件链中,则此活动实体离开块的时间减CI应记在D中
例如:
PREEMPT FAC6
只要单设施FAC6现在没有被活动实体强占,进来的活动实体就强占它,而从SEIZE进来的活动实体就被赶走了。如果活动实体是从PREEMPT进来的,则进入的活动实体应在FAC6的延迟链NI中等待。
PREEMPT FAC6,,NEXT
含义同上,只是从SEIZE进来的活动实体现在到NEXT块中去了。
PREEMPT PH6,PR
设进入活动实体的半字长参数6的值为20,则若现在的单设施20被优先级的活动实体占据着,那么进入的实体强占它,并把那个低优先级的活动实体放在强占列中。如果单设施20由一个优先级高的活动实体强占着,则进来的活动实体排人NI链。如果活动实体不可用,则新进的活动实体放人FV中。
(13)PRIORITY块语句。
其功能是赋优先数,基本格式如下:
PRIORITY A
其中: A 表示要赋的优先数
(14)QUEUE块语句。
其功能是排队,基本格式如下:
QUEUE A,B
其中: A 表示队名
B 表示占据的个数,默认为1
进入的活动实体排人队A,且占据B个位置,活动实体可以同时进入5个以下的队。
例如;
QUEUE LINE
进入实体排人队LINE,占了一个位置。
QUEUE 6,CH。PFI
进入实体排人队6,如果它的全字长参数1值为2,用户链2中有5个活动实体,则排进来的活动实体占5个位置。
QUEUE XH16,S$PARK
如果进入时,半字长单存数单元16存有数8,复设施PARK的容量为2,则活动实体排人队8,并占两个位置。
(15)RELEASE块语句。
其功能是释放单设施,基本格式如下:
RELEASE A
其中:A 表示单设施名
如果单设施A本来就是空着的,则执行语句时出现错误。
例如:
SEIZE CLERK
……
RELEASE CLERK
释放单设施 CLERK。
SEIZE 7
……
RELEASE 9
如果无活动使单设施9忙,则释放单设施9是错误的。
SEIZE PH4
……
RELEASE PH4
如果从SEIZE到RELEASE,PH4的值没有变,设它为3,则表示释放单设施3。
(16)RETURN块语句。
其功能是退还强占的单设施,基本格式如下:
RETURN A
其中; A 表示要退还的单设施名
例如:
RETURN OVEN
曾被强占的单设施OVEN被退还。
RETURN PH4
设进入活动实体的半字长参数4为6,此名使单设施6被退还。
(17)SAVEVALUE块语句。
其功能是送值,基本格式如下:
SAVEVALUE A,B,C
其中: A 表示单存数单元
B 要送的数
C 表示单存数单元类型
向单存数单元A送值B。
例如:
SAVEVALUE 14,CI,XH
把组1的成员个数存于半字长单存数单元14中。
SAVEVALUE 3—6十,PH23,XF
全字长存数单元3、4、5、6分别累加半字存数单元23中的值,再存入全字长存数单元3、4、5、6中去。
XF3=XF3+PH23
XF4=XF4+PH23
XF5=XF5+PH23
XF6=XF6+PH23
ASSIGN 7,10,PF
…
SAVEVALUE PF7 -,FN*PF7,XF
因为活动实体的全字长参数7存着10,所以此名相当于F7=PF7—FN10,即单存数单元7的值等于其原有值减去函数K的当前值。
(18)SEIZE块语句。
其功能是抓住单设施,基本格式如下:
SEIZE A
其中:A 表示单设施名
进入活动实体抓住单设施A,即使它变忙。如果A本身就是忙态或是不可用,则活动实体应挂在相应的延迟链中,并停于它的前一块。
例如:
SEIZE TRUCK
当活动实体进入此块而单设施TRUCK不忙,则活动实体抓住TRUCK,使之变忙。如果 TRUCK忙,那么活动实体置于 TRUCK的FNV延迟链上,并停于它前面的一块中。
SEIZE PH3
活动实体的半字长参数就是不为零的数,作为它进入的单设施的号;否则出错。
GERERATE,,,2SEZE 10
第一个活动实体抓住了单设施10,如果它不释放单设施10,那么第二个活动实体就抓不住它,挂在等待它不忙的链FNV上。
(19)SELECT块语句。
其功能是选择实体,基本格式如下:
SELECT MO A,B,C,D,E,F
其中:MO 可为MO1—MO5
A 表示某类型参数,找到的实体序号存在此
B 表示实体名,指明检查实体下限
C 表示实体名,指明检查实体上限
D 为数,用于MO1(比较运并符)作为对比值为空,用于 MO5(求最大或最小)
E 为助记名,表示对 MO1、MOS与 B、C配合表示何种实体的何种属性为空,表示对应MO2,MO3,MO4
F 表示块名,标识找不到时的出口
例如:
SELECT SF 6PH,8,MAN,,,ALT
查找 8到 MAN中所有复设施,找到第一个被占满的(SF),将其序号存入半字长参数6中。如果找不到,就去ALT。注意MAN的序号应大于8。
SELECT MAX 3PF,1,10,,Q
查1到10号队中最长最大的,其结果存入全字长参数3中。
SELECT E 7PH,FACS,FAC13,15,FC
查从FACS到FAC13的单设施中哪个首次被活动实体占据过15次,将其序号存入半字长参数7中。
(20)SPLIT块语句。
其功能是产生同类复制件,基本格式如下:
SPLIT A,B,C,D,E,F,G
其中: A 复制个数
B 块名,表示同类复制件的去处
C 某类型的参数,为这些同类复制件指定记排序号的参数
D,E,F,G 某类型参数个数,分别指出各类型参数的个数
生成进入活动实体的A个同类复制件,去B处,用C指出排序参数,其中D到G场指出复制件的参数个数。
例如:
GENERATE 150,25,,1,,1,1PF,5PH,4PL
…
ASSIGN 1,11,,PF
ASSIGN 2-5,8,,PH
…
SPLIT 2,NEXT,1PF,8PF,2PH,2PB
第一个块产生的一个活动实体有1个全字长参数、5个半字长参数、4个浮点型参数。赋值后,PFI=11,PH2=PH3=PH4=PH5=8,其他参数值为零。到SPLIT块时,生成了两个同类复制件。它们分别有8个全字长参数、2个半字长参数、7个字节型参数。产生后到NEXT块。生成同类复制件后,PFI是这三个同类复制件的排序参数。父件的PF1=12,两个子同类复制件的PFI分别为13及14,其他参数值同父件,但个数不同于父件。
SPLIT 5,ALTBL
复制了5个同类复制件,参数个数同父件,值与父件相同。生成后到ALTBL块去。
(21)TERMINATE块语句。
其功能是使到达的活动实体消失,并使终止计数器减去A的值,基本格式如下:
TERMINATE A
其中:A 表示使到达的活动实体消失,并令TGI减去此数,默认为零
例如:
GENERATE 50
…
TERMINATE1
START 6,2
END
每50个时间单位产生一个活动实体,到TERMINATE块时就消失了,并使终止计数器(初始时是6)减1。当终止计数器为零时模拟就结束了,它也使打印控制器(初始值为2)减1。当打印控制计数器为零时,GPSS将按标准打印输出。
GENERATE 16,FN$EXPON
…
TERMINATE
GENERATE 4800
TERMINATE 1
SATART1
END
第一类活动实体每隔16*FN$EXPON时间产生一个。它离开系统而消失时,不使终止计数器减1,而第二类活动实体在4 800时产生,到系统后立即消失。而使终止计数器减1,从而结束模拟。
(22)TRANSFER块语句。
其功能是引导进入的活动实体流向不同的块中,基本格式如下:
TRANSFER A,B,C,D
其中:参数A是转向模式,以下分别介绍其不同用法。
a)当A为分数时,表示M路按比例转向模式。
B 块名,当前随机数值大于A的去向
C 块名,当前随机数值小于等于A的去向
D 空
例如:
TRANSFER.723,FIRST,LAST
表示72.3%的活动实体去LAST,剩下的去FIRST
TRANSFER.XH3,HAM,BACON
表示取半字长单存数单元3中的三位数字形成一个分数。如果XH3—17,则1.7%的活动实体去BACON,其余的去HAM。
b)当A为空时,表示无条件转向模式。
B 块名,表示进入实体无条件地转向此块
例如:
TRANSFER ,50 表示转到块50中去
TRANSFER ,BLK4 表示转到BLK4中去
TRANSFER ,XH4 表示转到半字长单存数单元4所指的地址上去,如果XH4=3,即转到块3
(c)当A为BOTH时,表示两种可能转向模式。
进入的活动实体首先进入块B。若这块不可进入,则转向块C。
B 块名,表示首先转入地址
C 块名,表示备选转入地址
(d) 当 A为 ALL时,表示全区段可能转向模式。
进入的活动实体首先试图进入块B,如不可能,逐个向下间隔D块试图转人,直到块C。哪块进不去,就停在本块中。B、C、D中有一个是空,即出错。
B一块名或序号,表示起始转入块
C 块名或序号,表示终止转入块
D 表示增量
例如:
TRANSFER ALL,ONE,NINE,2
表示从块ONE起,看能否进入,若不能,序号加 2;若能进,在NINE块之前就进去,否则就停在这里。如果ONE的序号为1,NINE为9,则依次希望进入1,3,5,7,9,如果进不去,就等待在TRANSFER中,直到有块可进入为止。
(e)当A为PICK时,表示随机挑选模式,在B块和C块中平等地随机挑选。
B 块名或序号,表示起始转入块
C 块名或序号,表示终止转入块,如果B不小于C,则认为出错
(f)当A为 FN时,表示函数模式。
B 函数名
C 数字,表示进入活动实体要转到B加C上
例如:
TRANSFER FN,XPON,15
设函数XPON的值为3,则活动实体转人块18。如果进不去,停于此块。
(g)当 A为 Px时,表示参数模式。
B 表示参数序号
C 表示增量
例如:
TRANSFER PB,3,6
表示如果当PB3—2时,则转到块8上去。
(h)当A为SBR时,表示子程序模式无条件地转到B所指的子程序中去,C指定一个参数,存返回地址。
B 块名,表示活动实体要进入的子程序入口
C 某类型参数,指出活动实体的某个参数,其中存本句的地址
例如:
GENERATE 375,160,500
…
FIRST TRANSFER SBR,CNERL,4PH
NEXT QUEUE PROC1
…
SECND TRANSFER SBR,CNTRL,4PH
NEXT2 QUEUE PROC2
…
CNTRL QUEUE TESTQ
ENTER TESTR
DEPART TESTQ
ADVANCE 30,7
TEST G PH1,100,REUECT
LEAVE TESTR
RETRN TRANSFER PH,4,1
这是一个生产线上元件工作流程控制。每个加工步骤结束以后。元件就送到检验处检查,查完后再回主生产线。活动实体的PH4中存有转向语句的地址,所以从块RETRN返回的地址都是PH4的值加1,即每次返回到调用语句的后一句。
子程序中检查阶 TESTQ,检查员是 TESTR,检查时间是 30士人 条件是PHI大于 100。
注意,GPSS子程序就是一段GPSS程序。它不会自动返回,只能用记录的开工返回一个变动的地址。
(23)UNLINK块语句。
其功能是解用户链,基本格式如下:
UNLINK MO A,B,C,D,E,F
其中:MO 表示比较运算符
A 表示用户链名,标识被解的用户链名
B 块标识,表示被解的活动实体的去向
C 表示被解的活动实体的个数
D 为空,表示从用户链的链头开始解链,此处E必须是空的为BACK,表示从用户链的链尾开始解链,此处E必须是空的为BVJ,表示活动实体的属性影响这个布尔变量的值。逐个查用户链上的活动实体。凡是使这个布尔变量值为真的,可以解下来。此时E必须是空的为PSZ,表示用户链中被比较的参数,此时E应有值。按辅助操作码所规定的来判断活动实体是否满足条件,满足条件的被解下来,此时E应该给出。否则就是活动实体的同名参数的当前值作为比较值
E 标识作为辅助操作码所指条件的被比较值
F 表示块名,当没有合乎条件的活动实体时,从用户链中取出进入活动实体的出口,空则表示下一块。如果解链动作成功,则进入活动实体到下一块
例如:
UNLINK 5,NEXT,ALL
把用户链5的所有活动实体都解下来,送往NEXT块,进入活动实体到下一块去。
UNLINK。CHNI.ALTBL,10,,,BLKA
把用户链CHNI的10个活动实体送往块ALTBL,进入活动实体到 BLKA去。
UNLINK 2,LOOP,5,BACK
把用户链2的倒数第5个活动实体解下来,送LOOP中去,进入的活动实体到下一块去。
UNLINK USERC,UNLIK,3,6PF,Q$STAGE
把名为USERC的用户链中PF6等于队STAGE的长度的活动实体的前三个解下,送到块UNLIK中去。
UNLINK 4,CIRCL,ALL,BV$TEST
把用户链 4中所有使 BV$TEST为真的活动实体都送到块CIRCL中去。
8.常用控制语句
(1)CLEAR控制语句。
其功能是清空模型中除A所指的元素之外所有统计单元及各种实体的标准数学属性的当前值,基本格式如下:
CLEAR A
其中: A 指出不清除的范围
例如:
CLEAR XFI——XFS,XF10
除XFI,XFZ,XF3,XF4,XFS,XF10之外的所有存值单元都被置为零。
CLEAR XH3,MXI,MX3——MXS
除XH3,MXI,MX3,MX4,MXS外的全部存值单元和矩阵j$被清空。
CLEAR XFI,XHI,XF3
该语句为非法,实体必须按类型分组,应为 CLEAR XFI,XF3,XHI。
CLEAR MBI,MBll,MB7
该语句无效,矩阵号必须按升序排列。
CLEAR
表示整个系统的各单元的值都清空,即置零。
(2)END控制语句。
其功能是表示GPSS运行结束,基本格式如下:
END
(3)RESET控制语句。
其功能是统计单元的值,但不清空表示工作状态的值,基本格式如下:
RESET A
其中:A 表示不受 RESET影响的实体或范围。
例如:
RESET
表示整个系统被重置
RESET F6,F10,SI——S4,QI
除单设施6,10,复设施1,2,3,4,队1外,系统其他实体均被重置,指定的实体不受影响。
(4)SIMULATE控制语句。
其功能是表示程序编译后要立即进行模拟,基本格式如下:
SIMULATE A,B
其中: A 表示模型最多在机器中进行A个时间单位,A空则表示无限
B 为SAVE,则模型进行到A个时间单位还未能完成时,把模型存入磁盘如为空,则不存入磁盘
(5)START控制语句。
其功能是控制模拟过程的终止或部分输出内容,基本格式3
START A,B,C,D,E
其中: A 表示亚于终止计数器的数
B 为NP,则停止一切标准报告的输出为空,财正常输出
C 生成输出报告的计数间隔。GPSS可以实现按一定的间隔抽点打印,C就是打印间隔的计数器的初始化。当C为零或负值时,GPSS就会产生标准输出
D 为任何字母数字,打印活动实体的5条键作为标准输出之一为空,不打印活动实体的任何一条链EM拟时钟到此数值时终止模拟
例如:
START 10,NP,,,1000
终止计数器置10,当它变为0时或时间单位到1000时,模拟结束,结束时无输出。
START,,,C
终止计数器置1,在模拟结束时,活动实体的5条链内的信息作为标准输出打印出来。
START 100,10
终止计数器置100,打印控制器置10,如果模拟中有一个TER-MINATE语句,则 10个活动实体进入 TERMINATE以后引起打印,而100个活动实体进入它之后模拟结束。
六、GllSS语曹的建楼观点
1.四定时间的模拟
我们再回到例7—l,如果要模拟理发店一天的工作情况,那还
得再启动一个记时进程:
GENERATE 48厂 记时者480分钟后到达系统
TERMINATE 记时者离开系统并使终止器减 1
这个控制模拟结束的进程比较简单,在480分钟时,记时者把终止计数器中的数减1(终止计数器初值为1),终止计数器值为0时,模拟结束。
在模型的最后有控制具体执行的两个语句:
STATE 在终止计数器中置1,并使模拟开始运行END 表示整个程序结束
所以本例完整程序如下:
SIMULATE
GENERATE 18,6
QUEUE LINE
SEIZE JOE
DEPART LINE
ADVANCE 16,4
RELEASE JOE
TERMINATE
*PROGRAM SEGMENT TO CONTROL LENGTH
OFSIMULATION
GENERATE 480 TIMER ARRIVES AFTER 480
TIME UNIT
TERMINATE 1
START 1
AND
从本例中,我们可以粗略地看到GPSS模型的最基本特征。一个GPSS模型包括一些活动实体和资源实体。本系统有两个活动实体:顾客和计时者。有两个资源实体:理发员JOE和队LINE,理发员是FACILITY(也称为单设施),队是QUEUE,其中活动实体是主动者。另外,我们用一个进程来描述一类括动实体在系统中变化和运动的过程,本例中有两个过程:一个是顾客过程,另一个是记时考过程。
进程内(除GENERATE外)的所有块语句,都是被活动实体
进入而激活后才进行的一系列动作。活动实体相当于语句的主语,块本身相当于句子的谓语。所有的块语句(包括GENERATE)描述一项基本的活动,语句本身的英语比较清楚地描写活动的基本内容。后面的参数列说明了活动涉及的资源实体、活动的特征参数。这些参数相当于是宾语、补语或状语。
建模者只需明显地用块语句描述进程,而活动实体并没有直接出现在模型中。进程的第一句必然是GENERATE,它生成具体的活动实体。活动实体有具体的活动实体与概念的活动实体之分。一个概念的活动实体对应许多个具体的活动实体。由进程所描述的就是一个概念的活动包。不空进程的第二句及其后语句是用块语句表示的典型活动,由一个具体的活动实体进入一个块语句,激励它动作,就成为一个具体的事件。例如,本例中的一个顾客让理发员JOE开始为他理发(SEIZE JOE)。
资源实体相当于块语句中的宾语,它是很具体的,它直接出现在模型中,建模者可为它命名。
下面分析上述系统的具体工作情况。GENERATE产生的顾客将源源不断地来到系统。先看第一个顾客的情况。假设他叫张三。在第一17分时,张三到达系统(GENERATE)。在第17分时,张三排人队LINE(QUEUE LINE)。在第 17分,张三找到 JOE(SEIZE JOE),同时张三离队LINE(DEPART LINE)。张三占着JOE,让JOE给他理发大约16分钟(ADVANCE)。张三离开,不影响终止计数器。再看第二个顾客,称他为李四。李四在张三之后15分钟到达系统。所以他在第31分钟到达系统,同时排到队中。他去找JOE理发,侄.JOE在给张三理发,所以让李四等候。在第33分时,JOE闲下来。JOE才为李四理发。李四离开队,请JOE为他理发。理发花了17分钟,即第50分才理完,离开系统,同样李四走时,不能更改终止计数器。第三、第四个顾客都有类似的活动。
从建模者的角度来说,一个顾客一个顾客地考察系统的变化,在逻辑上是清楚的。但从时间的角度看,刚才的叙述有些不太合理。弘:三的情况要讲到第33分时才算讲完。其实在第31分时李四已来了。并排在队里了。系统的状态在17分时有一系列变化。从没顾客变为来了一个张三,张三排队,张三找JOE,张三离队;系统在31分时又有一系列变化,从没有顾客排队变为来了李四,李四排队,李四找
JOE,JOE忙,他等在队里。第33分时又有一系列变化,张三理发完毕走了,李四出队,找JOE为他理发—…·所以要看系统状态的变化。以时间先后为主线,把事件都串起来是一种好的方法。GPSS调度程序采取这种方法。把事件发生的时间先后串起来,再从排头到排尾逐个地处理它们,这样做对计算机来说也是方便的,因为计算机每次只处理一个事件。
GPSS编译用调度程序控制运行。建模者只需大概了解,无须编写调度程序。调度程序中有两个重要的系统变量:时钟和终止计数器。
控制语句START,向终止计数器送数,启动模型开始运行。时钟变动是一条主线,当某些事件可以发生就让它们发生。这些事件发生就改变了系统的状态,该发生的事件都处理完毕,时钟就前进一步。每个具体活动实体从TERMINATE离开系统时,把终止计数器的值减掉某个大于或等于零的数。终止计数器为零时,模拟结束。
由于要以时间为主线把事件都串起来,所以从作用时间的角度看,GPSS块中有两个块是比较特殊的,它们是GENERATE和AD-VANCE。GENERATE按建模者要求离散地产生活动实体,这种要求使活动实体的产生有了时间间隔。ADVANCE使活动实体在AThVANCE块中停留一段时间,所以这段时间中活动实体就不能激励其他块语句,称这两块为非零时间作用块。而其他的块改变系统状态时所花的时间为零,则称为零时作用块。由于这些非零时间作用块使每个具体事件按活动时间排序时,能成为一个事件发生时间不断增加的序列。
假设第3位顾客在第52分钟时才到达系统。本模型部分事件链(截止到52分时)如下表所示。
顾客排队活动记录表
时钟时间 |
活动实体 |
动作 |
对象 |
17 |
张三 |
到达 |
|
17 |
张三 |
排入 |
LINE |
17 |
张三 |
占有 |
JOE |
17 |
张三 |
离开 |
LINE |
31 |
李四 |
到达 |
|
31 |
李四 |
排人 |
LINE |
33 |
张三 |
才被允许离开ADVANCE块 |
|
33 |
张三 |
释放 |
JOE |
33 |
张三 |
离开系统 |
|
33 |
李四 |
占有 |
JOE |
33 |
李四 |
离开 |
LINE |
50 |
李四 |
才被允许离开ADVANCE块 |
|
50 |
李四 |
释放 |
JOE |
50 |
李四 |
离开系统 |
|
52 |
王五 |
到达 |
|
从这里我们可以看到在一些离散的时点上,系统状态发生突变,按时间的先后展现系统变化,先发生的事先处理,后发生的事后处理。这是一种很合理的调度原则。但是有些事件是同时发生的。例如,在第 17分时,张三排人 LINE,占有 JOE及离开 LINE是三个同时发生的事件。好在按顾客进程的安排,每个顾客要先排人队,再占有JOE,再离开LINE。它们所以同时发生是因为事件中的块是零时间作用块。这种同时事件的调度比较容易。
但有些事件就没有排好序。例如赵六在第67分时进店,而王正在第67分时刚好理完发。它们分别是GENERATE和RELEASE产生的,是两个不同块对应的具体事件,是两个顾客的具体事件碰巧同时发生。计算机采用随机抽取的办法处理这两个同时发生的事件,所以有两种处理方式。第一种方式,先处理“赵六在第67分时进店”,排入LINE,因JOE忙,等候。但模拟时钟并不变动。计算机接着处理“王五”,在第67分钟时他理完发离开JOE,离开系统。这些事件都结束以后,模拟时钟还不能变动。由于JOE由忙变闲,所以赵六可以找JOE来理发,离开队LINE……。第二种方式,计算机先处理“王五在67分钟时理完发”,离开JOE,离开系统,再处理“赵六在67分钟进店”,排入队LINE。但JOE不忙,就让JOE为他理发,同时离开队LINE。虽然计算机可以按两种顺序处理事件,但结果却是一样的。处理以后,系统的状态相同,都是王五走了,赵六让JOE理发。所以有时随机抽取不影响模拟的结果,而我们要介绍到的有的未排序的同时事件用随机抽取执行的原则会影响模拟的结果。
虽然每个顾客进理发店都进行着类似的进程,但从时间的角度,各个事件是按照排好的顺序穿插地进行。计算机不是处理完张三的所有事才处理李四的事,而是按时间先后交替处理张三、李四等不同人的事件。
此外,除了顾客进程还有一个关门人进程。按建模者的要求,第480分钟时关门人来到系统(GENERATE)。关门人没停在系统中,他立即就离开系统,此事件也排在本程序的事件表中。在480分钟时调度执行此事件,把终止计数器减1。当终止计数器的值为零,模拟停止。
每个事件都会改变系统的状态,如张三进入队LINE,则队长增加l。每个事件都类似地更改相应的标准数字属性。模拟结束时,GPSS就把系统的状态都统计好并打印出来。
2.更符合实际的例子——进程交作
是否能完全模拟实际情况呢?假如在第480分钟时,还有一位顾客正好在接受理发。另外,除他之外,还有一些人。排在队中等候,这样的话,这些人就白等了,那位顾客也得明天再来继续理发。
现在我们试图改进模型,以便模拟更切合实际情况。到下班时间不马上关门,先挂上锁并告知顾客不准再进了。等到已在店内的人都理完发,这天的模拟结束。
为了模拟“在关门后只出不进”,我们用了一个逻辑开关(LOGIC SWITCH)LOCK,它有两种状态 SET和 RESET。
试用下面的模型:
SIMULATE
GENERATE 18,6 顾客在(18+6)分钟的时间间隔到来
GATE LR LOCK 查看LOCK是否为SET,即店内是否已经挂锁不让进了,只有在没关门的情况下,顾客才能入(RESET)
TRAN QUEUE LINE 顾客排入名为LINE的队列
SEIZE JOE 如果JOE闲,找他理发,否则停在队中
DEPART LINE 离队
ADANCE 16,4 理发花了(16+4)分钟
DONE RELEASE JOE 理发完毕离开
TERMINATE 顾客离开系统
GENERATE 480 关门人480分钟后到系统,挂锁
LOGIC S LOCK 使LOCK处于SET状态
TEST E N$TRAN,N$DONE
关门人查店内顾客都理完发后才去关门
TERMINATE 1 关门人离开系统,使终止计数器减1
START 1 终止计数器初始值为1
END
在例子中我们看到一同时事件,例如同一具体活动实体的不同事件可能同时发生,同类活动实体的两个不同的具体活动实体的不同事件可能同时发生。此外,还有不同类的活动实体中的事件也可能碰巧同时发生,如果建模者没有指定处理方式,有时就会模拟出不同的结果。例如,有可能顾客何福在480分时来到店里,关门进程规定的关门人正好这个时候也来到。如果先执行“关门人到来,挂锁牌”,那么何福就进不来。如果先执行“何福进店”,他就会排到队里,可以去理发。GPSS需要为某些没有排序的但同时进行的进程排序提供一种手段。活动实体的优先数就是这样一种手段,一般来说,如果没有特别说明,则活动实体的优先数就是零。但建模者可以通过GPSS语句使活动实体有一定的优先数,有两个语句可以为活动实体赋优先数。一个是GENERATE的第5个参数,使活动实体到达系统时就具有参数原有的优先数。另一个是块语句在进程中通过PRI()RITY赋给进入的活动实体一个优先数。
假如把本段模型第一句换成:
GENERATE 18,6,,,1
那么顾客有优先权1,则新模型就模拟与关门同时进来的顾客能够先进门的情况。
此外,在这个模型中多了一个资源实体——锁,它是一个逻辑开关。关门人挂上锁,顾客进不去,关门人要等到所有进店的人部理完发才去关门。顾客与关门人进程的相互关系比上例的两个进程的关系更加密切。通过两个资源实体,锁LOCK和理发员JOE这两个进程相互影响,互相牵制。它们共同作用相互配合,模拟系统复杂的动态。
由此可见,本例顾客进程与关门人进程从很多方面有相互关系。一是关门人挂锁影响顾客进入,二是顾客进入与理发结束的匹配,影响关门人去锁门,结束模拟。
原则上同一模型的进程之间是要相互影响的,否则就成为两个模型而不是一个模型了。进程的相互影响可以通过进程中共同涉及的资源实体来实现,也可以通过涉及系统变量(如终止计数器)来体现,还可通过优先数来体现。因为同一个模型的所有进程的所有事件都排在同一个事件表中,而同时事件是按优先数排序的,并且同时事件执行的顺序会影响模拟的结果。
从以上二例,我们可以看出GPSS建模的基本思想。对理发店内排队等候理发服务的离散系统,到达间隔是随机的,服务时间是随机的。首先确定顾客和关门人是活动实体,理发员是单设施.队是QUEUE,再用块语句直接模仿典型事件的形成进程。从GPSS的观点看现实世界,不必逐个地描述事件,只要用块语句组成的进程来表示就可以。GPSS依进程生成事件使人来人往的理发店在计算。九中直接再现了真实系统中的现象。以时间为主线,有人进店去理发,理完离开。某人理发期间还会有人进来……,到点有人挂牌,店内顾客理完后,关门结束一天的工作。
GPSS用随机数发生器技术直接模拟到达的时间、理发的时间间隔,自动进行统计计算,从事所有的繁琐重复的工作。像DYr4AMO模拟一样,充分利用人与机的长处,获得关于系统的新知识。
3.各种进程路径
在进程中,路径是多种多样的。在前面的例子中,顾客的路径可以看成是直线,活动实体从一个块语句到下一个块语句。然而,对于现实世界当中的情况,一些复杂的现象一般对应的路径也可能较复杂。GPSS语言中的几个块语句(TRANSFER、LOOP、TEST及GATE)专门控制活动实体的路径。
(1)一队两个理发员的例子。
我们假设这样的情况,顾客们排一队,店内有两个理发员,当一个理发员有空时就为等待头上的顾客服务,顾客不挑选理发员,认为所有的理发员都相同,再假设两个理发员对顾客理发所用时间相同(18士6分钟)。
下面是上述例子的模型。
SIMULATE
STORAGE S$BARBERS,2 理发店内有两个理发员
GENERATE 18,6
QUEUE LINE
ENTER BARBERS
DEPART LINE
ADVANCE 16,4
TERMINATE 1
START 25
END
在上述程序中,我们将存储器BARBERS的容量定义为2,表示有两个理发员,当一个顾客要进入 ENTER BARBERS程序块时,只有满足存储器BARBERS的当前容量小于其额定容量的情况下才允许进入。当进入后,存储器BARBERS的容量就增加 1;如果动态实体没被允许进入,则停留在QUEUE程序块中。当其通过LEAVEBARBERS程序块时,存储器BARBERS的当前容量就减去l。
(2)男女顾客分叉的例子。
在前面的例子中,如果该理发店分男部和女部,男顾客去男部找JOE,女顾客则去女部找ANN,假设顾客中70%的是男客,30%的是女客,对男客理发的时间为15士3,对女客理发的时间为20士5,
这样我们可以用分成两叉的进程来描述。
下面是一个交叉的顾客的进程。
GENERATE 18,6
TRANSFER 0.7,,MAN
QUEUE LINE1
SEIZE ANN
DEPART LINE1
ADVANCE 20,5
RELEASE ANN
TERMINATE 1
MAN QUEUE LINE2
SEIZE JOE
DEPART LINE2
ADVANCE 15,3
RELEASE JOE
TERMINATE 1
TRANSFER块语句引导活动实体转向。它有多种模式,在本例中,第一个参数是0.7,属于分叉转移模式,表示进入的活动实体被分成两部分,所分的百分比由这个分数决定。一部分转到第二个参数所指的地址,一部分转到第三个参数所指的地址。所以上述顾客进程的“TRANSFER 0.7,,MAN”表示进入理发店的顾客 30%转人下一块,排人队LINEI,而其他的70%则进入到地址为MAN的块,顾客排另一队 LINEZ。
(3)男女顾客随机挑选理发员的例子。
再来考虑这样的情况:两个相同的理发员,顾客在每个理发员处各排一个队,各顾客在进理发店时随机地挑选一名理发员(理发员被挑选的概率是相同的),然后排在相应的队里,在确定排人队后、不能再随便更换队列,即使另外一个队为空时也不行,我们再用以下的程序模拟一个这样系统。
SIMULATE
PICK FUNCTION RN$1,C20,1/1,3
GENERATE 18,6
ASSIGN 1,FN$ PICK
QUEUE P1
SEIZE P1
DEPART P1
ADVANCE 16,4
RELEASE P1
TERMINATE 1
START 25
END
在上述程序中,用函数PICK在1和2之间随机地选择一个整数。当一个动态实体进入ASSIGN程序块时,就求函数PICK的当前值,并置动态实体的1号参数等于PICK的当前值,于是这个参数或者是1,或者是2。考虑参数值是1的动态实体,当这个动态实体进入 QUEUE程序块时将排进 1号队里;当它进入 SEIZE程序块时将占用1号设备,即第一个理发员。同样,参数值为2的动态实体将排进2号队里,占用2号设备,即第二个理发员。
(4)顾客排人最短队的例子。
考虑到实际情况。一个顾客在来到理发店时,可能会选择队列的长度而排人较短的队中,当然,在两个队一样长时,假定他排人第一队。我们可以用下面的程序来实现这一行为:
SIMULATE
GENERATE 18,6
PRIORITY 1
SELECT MIN 1,1,2,,Q
QUEUE P1
SEIZE P1
ADVNCE 16,4
RELEASE P1
TERMINATE 1
START 25
END
在上述程序中,我们用 PRIORITY程序块把较高的优先权赋给刚理完发的顾客,即使是某顾客刚刚到达和另外一个顾客刚理完发是同时发生的,系统认为是顾客理完发在先,因为这样可能影响到新来的顾客是排人哪一个等待队列。
当一个动态实体进入SELECT MIN程序块时,GPSS处理器发现此程序块E场中的符号Q,因为Q代表队的当前容量,它就在1号和2号两队之间搜索各队当前容量,整数1和2写在SELEC7’程序块的 B场和 C场中。由于这种类型的 SELECT MIN程序块是“选择最小”,它就寻找当前容量最小的队号。假定在这个模拟点上2号队较短,因为在SELECT程序块的A场中有一个1,GPSS处理器就把动态实体1号参数的当前值置为2,即队的当前容量最小的队号。如果两个队的当前容量相同,此参数就置于较小的队号。然后,当动态实体进入 QUEUE程序块时,就排进队号等于此动态实体 1号参数PI值的队中。
另外,在本例中,如果继续假定顾客的平均到达时间是18分,则会发现,在模拟期间忙着的理发员不会超过1个。为了充分利用资源,我们可以将平均到达间隔改为9分。
(5)按理发时间长短排队。
假设到理发店理发的顾客排队的规则不是先到先理,而是根据理发时间的长短排队。理发时间短的先理。可用下面的程序模拟。
SIMULATE
HCUT FUNCTION RN1,C2 0,10/1,25
GENERATE 20,6,,,1
ASSIGN 1,FN$HCUT ,,PH
QUEUE LINE
LINE QUE,PH1,NEXT
NEXT SEIZE JOE
DEPART LINE
ADVANCE PH1
RELEASE JOE
PRIORIY 0 为使刚进入的顾客有权排入队中,把理完发的顾客优先级从1降到 0
UNLINK QUE,NEXT,1
TERMINATE 1
START 25
END
这个模型具有一个进程,顾客进程,其中顾客是活动实本。LINE是QUEUE,JOE是FACILITY。除此之外,本模型多了一个用户链QUE,活动实体的PHI中存在理发时间。LINK块令活动实体按PH1排入用户链QUE中,结束理发的顾客在UNLINK中让排头的即理发时间短的顾客到块NEXT中。本模型的设计使刚进入的顾客有权排到用户链中。如果碰巧有一个顾客在他进入时还有一个顾客刚理完发,他先排人用户链中,然后理完发的顾客才离开。因为解链前理完发的顾客‘的优先级已降为零,而进入店中的顾客优先级高。
(6)顾客串行行为的例子。
如果顾客去了理发店后,先刮脸,再理发,然后洗头。刮脸排队工,找服务员1,用了10土2分钟;理发排队2,找服务员2,用于15士3分钟;洗头排队3,找服务员3,用了5士1分钟。我们可以用下面进程来实现:
GENERATE 18,6
QUEUE 1
SEIZE 1
DEPART 1
ADVANCE 10,2
RELEASE 1
QUEUE 2
SEIZE 2
DEPATR 2
ADVANCE 15,3
RELEASE 2
QUEUE 3
SEIZE 3
DEPART 3
ADVANCE 5,1
RELEASE 3
TERMINATE 1
由于这里刮脸、理发、洗头三件事非常类似,只是参数上的不同而已。我们先用LOOP语句帮助实现循环路径,这样可以简化非常繁琐的重复过程。
下面是用LOOP语句简化上面的进程。
MEAN FUNCTION PB1 ,D3
1,10/ 2.15 /3,5
DEF FUNCTION PB1,D3
1,2 / 2,3 / 3,1
GENERATE 18,2,,,,3PB
ASSIGN 2,3,,PB
BACK ASSIGN 1+,1,,PB
QUEUE PB1
SEIZE PB1
DEPART PB1
ASSIGN 3,FN$DEF,,PB
ADVANCE FN$MEAN,PB3
RELEASE PB1
LOOP PB2,BACK
TERMINATE 1
顾客的3个参数起不同作用,PBZ控制运行次数。第二句将:【赋给PB2,表示循环3次。PB1存放队号和服务员号。循环中第1轮PB1为1,第2轮为2,第3轮为3。PB3存放不同服务员服务时间的偏差。
有两个函数,MEAN表示不同服务员服务的平均时间,DEF表示不同服务时间的偏差。
前面4句是两个函数定义语句。前两行说明名为MEAN的函数是一个由3个点组成的离散函数,其自变量为活动实体的字节型参数1,函数值可以由第2行说明。当PBI—1,时,函数的值为10;PBI—2时,函数值为15;当PBI—3时,函数值为5。
LOOP是一个控制循环次数的块语句。每次活动实体到达LOOP,先把第1个参数中所存的循环次数减1,查看它是否为零,为零表示循环结束,进入下一块,否则转到第2个参数所指的返回地址上去。
上述循环的进程是很容易理解的。比如活动实体第1轮经过QUEUE的PB1为1,所以找到队1。
这个例子把活动实体在进程中的主导作用表示得很清楚。进程中的函数赋值、转向、循环都由活动实体控制。
每个活动实体(代表一个顾客)来到系统,将3赋给字节型参数2,在第1轮时,字节型参数1得到1,以后排人队1,找服务员1……,服务员1为顾客服务的时间从函数MEAN及DEF中获得,取函数值时,要确定自变量的值。函数定义语句指出MEAN的自变量是活动实体的字节型参数1,在第1轮中PB1=1,所以MEAN的值是 10。MEAN的值用标准数字属性 FN$MEAN表示,直到LOOP,此时字节型参数是3,减 1为以 返回 BACK。第 2轮时,顾客的字节型参数2得到2,以后排人队2……直到LOOP,字节型参数2减为1,返回BACK。同样,第3轮时,这个顾客的字节型参数2得到3,以后排人队3……直到LOOP,字节型参数2减为0,然后离开系统,把终止计数器减1。
(7)男女顾客交叉的例子。
设男顾客每204分钟到理发店,找JOE理发,理发花了186分钟,最后每个男客去柜台交钱,花了21分钟,交5角的理发费。女顾客每305分钟到,找ANN理发。有ZO%的人是剪发,用155分钟,花 1元,有80%的人烫发,用 12 030分钟,花 5元。在柜台交钱21分钟。模拟理发店的工作。并记录l天所收的钱。用男客进程、女客进程、时间进程三个进程来实现。顾客的PBI中存放他交纳的钱。
该模型的程序如下:
SIMULATE
1 FUNCTION RN1,C2
0.2,1/1.0,2
2 FUNCTION PB2,D2
1,5/2,30
FUNCTION PB2,D2
1,15/2,20
4 FUNCTION PB2,D2
1,10/2,50
男客进程
GENERATE 20,4,,,1PB
ASSIGN 1,5,,PB
QUEUE LINE1
EIZE JOE
DEPART LINE1
ADVANECE 18,6
RELEASE JOE
COM QUEUE LINE3
SEIZE CLERK
SAVEVALUE CASH+,PB1,XL
ADVANCE 2,1
RELEASE CLERR
TERMINATE
女客进程:
GENERATE 30,5,,,,,3PB
ASSIGN 2,FN1,,PB
ASSIGN 3,FN2,,PB
ASSIGN 1,FN4,,PB
QUEUE LINE2
SEIZE ANN
DEPART LINE2
ADVANCE FN3,PB3
RELEASE ANN
TRANSFER ,COM
时间进程:
GENERATE 480
TERMINATE 1
START 1
END 1
男客进程与女客进程交叉。女客进程进入 COM与男客进程走同一条路径。
(8)顾客并行行为的例子。
设女客进入理发店可理发和修指甲,理发和修指甲由两个人完成。两项服务可分别进行,也可同时进行。模拟这个过程。
顾客按16士4分钟到,理发由JOE,用12士6分钟,修指甲由ANN,用9士7分钟。现模拟25个顾客,其模型如下:
GENERATE 16,4
SPLIT 1,ANA
QUEUE 1
SEIZE JOE
DEPART 1
ADVANCE 12,6
RELEASE JOR
HERE MATCH THERE
TRANSFER JOR
ANA QUEUE 2
SEIZE ANN
DEPART 2
ADVANCE 9,7
RELEASE ANN
THERE MARCH HERE
ASS ASSEMBLE 2
TERMINATE 1
START 25
END
这里只有一个进程,每个活动实体复制一次,设想成“头”(“父”活动实体)和“手”(“子”活动实体),“头”和“手”并行,“头”去理发,“手”去修指甲。“头”与“手”各处接受服务完毕后,匹配在一起,合并成一个整体离开系统。
(9)可强占的排队方式。
用PREEMPT,RETURN块可以使优先级高的活动实体驱走原来占用着单设施的活动实体,这反映出一些特殊的顾客强占服务员的现实。例如刮脸的人,因其服务要求简单,允许他们插在普通理发人前,并强占服务员。该模型如下:
理发人进程:
GENERATE 16,4
QUEUE LINE
SEIZE JOE
DEPART LINE
ADVANCE 12,8
PELEASE JOE
TERMINATE 1
刮脸人进程:
GENERATE 50,20,,,1
QUEUE LINE
PREEMPT JOE
DEPART LINE
ADVANCE 5,2
RUTURN JOE
TERMINATE 1
START 25
END
理发人每 16士4分钟到系统,排人 LINE,找 JOE理发,用12土8分钟。刮脸人每50士20分钟到达系统。他的优先级高,所在队LINE中他要插在先到的理发人的前面,当然他应排在已到达系统的刮脸人的后面。如果他在排头,则看理发员JOE是否被强占。如果是,则排队等候;否则他强占JOE,服务完毕到RETURN块时退还”E。
4.实验安排
GPSS有一个明显的特点,从某个状态开始,用事件更改系统状态,系统状态由标准数字属性值表示。被调度的事件用到系统的当前状态,并改变一些标准数字属性的值,以此改变系统状态。比如随机数的取法,典型地反映了事件要用到当前状态的情况。
GPSS有8个随机数发生器,它们可生成8个随机数列,假设随机数是由相乘取中法得到的。两个乘数中的第一个称为种子,第二个称为乘数。这两个4位数相乘得到一个8位或7位数(如果是7位数补一个0),取中4位作为伪随机数,而后4位成为新的乘数值,与原来的种子相乘,同样得到第二个伪随机数和新乘数值。如此下去即可得到一个伪随机数列。例如:
5 167 9 343 48 275 281 0.275 2 16 18
5 167 5 281 27 286 927 0.286 9 16 19
用一个简单的例子分析GPSS程序是怎样取所用的随机数。
SIMULATE
GENERATE 18,6
QUEUE LINE
SEIZE JOE
DEPART LINE
ADVANCE 20,4
RELEASE JOE
TERMINATE 1
START 25
END
START 35
CLEAR
START 25
END
表示模拟了两次,每次模拟25个顾客。因为CLEAR清除所有统计单元和当前工作单元,但不重绕随机数,所以两次模拟的25个顾客是不一样的。
(1)对两组相同的顾客做实验。
说明语句可以为伪随机数置初始乘数。初始乘数定了,伪随机数列就定了。要想使两组顾客情况一样,在原程序SIMULATE后加上说明语句 RMULT 3333。然后控制语句改为
START 25
CLEAR
RMULT 3333
START 25
END
但这样相同的两组顾客是没什么意义的,如果程序中资源实体或者进程的具体情况不同,那么模拟相同两组顾客的情况就有意义了。
例如,一个理发店,当店中有2个或3个理发员时,观察相同顾客组的不同的排队情况。可建立模型如下:
START 25 在三个服务员时模拟第一组
CLEAR
START 25 在三个服务员时模拟第一组
END
上面程序中,两个服务员和三个服务员时第一个顾客组前25个是一样的。顾客到达时间由函数INTER产生。其自变量为RNI,初始乘子在两种情况下均为“1111。理发时间由函数HCUT产生。其自变量为RNZ,初始乘子前后者是3333。
两种情况下,理发员个数不同,顾客排队、接受服务的情况就会不一样。模拟完前25个顾客时,当前工作单元和统计单元情况都不一样。用****R清除之后重新开始模拟时,两种情况下的第二组顾客就会不一样。因为在第一种情况下,第25个顾客理发完毕时,第29个顾客可能已经来了。而第二种情况下理发员多,第25个顾客理发完毕时可能第26个顾客刚到。两种情况下取用的随机数列中随机个数不一样。用CLEAR清工作单元后,重新模拟时,第一种情况下生成第一个顾客的到达时间用的是第交 个随机数,而第M种情况下用的可能是第27个随机数。这样,顾客的到达时间、理发时间等都可能不一样,顾客组的情况就不一样。
要使两种情况下两组顾客的情况完全一样,可用下面的程序。
SIMULATE
RMULT 1111,3333
STORAGE S$BARBERS,2
INTER FUNCTION RN1,C2
/1,25
HCUT FUNCTION RN1,C2
0,20 /7 1,37
GENERATE FN$INTER
QUEUE LINE
ENTER BARBERES
DEPART LINE
ADVANCE FN$ BARBERS
LEAVE BARBSERS
TERMINATE 1
START 25 在两个服务员时模拟第一组
(2)清除初始偏差。
理发店刚开门时,顾客排队时间较短,为了消除这种初始误差,得到一般情况下的顾客排队情况,可以先模拟一小时,然后用RE一正T清除统计单元,保留工作单元,再继续模拟。这相当于从开门后一小时开始观察顾客排队情况。程序如下:
5.用户编辑的输出图
举两个用户编辑输出图的例子,说明GPSS有图形编辑能力。
理发站有两个服务员们E及 MAC。有 70%的人到用E处理发,有30%的人到MAC处理发。做一张图,比较JOE和MAC和平均利用率,其程序如下:
SIMULATE
GENERATE 18,6
TRANSFER 0.3,,OTHER
QUEUE LINE1
SEIZE JOE
DEPART LINE1
ADVANCE 16,4
RELEASE JOE
TERMINATE 1
OTHER QUEUE LINE2
SEIZE MAC
DEPART LINE2
ADVANCE 17,5
RELEASE MAC
TERMINATE 1
START 25
REPORT
GRAPH FR,JOE,MAC
ORIGIN 50,10
X SYM,5,10
Y 0,1,10,3
15 STATEMENT 10,9,FAC。UTIL
ENDGRAPH
OUTPUT
END
REPORT到OUTPUT之间的语句指出制一张图。对从JOE到MAC之间的单设施的利用率进行比较。制图用的符号是。。在平面坐标上画图,用条的高表示利用率的大小。坐标原点在从页顶数第50行,从页边数第10列处。X轴表示自变量,用设施名标识。条间距为10行,条宽5行。Y轴表示函数。从0开始,每3个字符(3列)算一个单位,一个单位之值是0.l,共有10个单位。
从上向下数10行,从左向右数15列,有一行9个字的字符串“F’C.UTIL” 印在图形中。结果如下图。
下面的模型先计算顾客滞留时间表,然后用制图编辑语句,将
表的值用字符所组成的图形表示。
SIMULATE
RITME TABLE M1,11,3,5
GENERATE 18,6
QUEUE LINE
SEIZE JOE
DEPART LINE
ADVANCE 16,4
RELEASE JOE
TABULATE RTIME
START 25
REPORT
GRAPH TF,RTIME
ORIGIN 50,10
X ,5,10,11,1,5
Y 0,1,10,3
15 STATEMENT 10,9,RESIDENCE TIMES
ENDGRAPH
OUTPUT
END
本模型中用表RTIME记顾客在理发店停留时间的频率分布。说明语句指出欲记录活动实体的渡越时间。分格的原则是,第一格上限为11,即(一∞,11〕,其余各格划分为(11,14」,(14,17],(17,20],[20,+∞)。控制语句的制图语句表示对 RTIME制一张表的频率分布条状图。图的原点在从上往下数第50行,从左数第10列处。X轴上每条宽5列,两条间距为10列,最左的条所代表的频率区域下限是*。图中一个条代表表中一个区域,共有5条。Y轴第一列是0值。每个分度代表取值1(累加数为1个活动实体),共有5个分度。每个分度用3列(3个印刷字符代表)。从上自下数10行,从左数 15列,有一行 15个字符的字符串“ RESIDENCETIMES”印在图上。结果如下图所示。
七、模型实例
[例7-2]港口接收游船决策问题
非洲某港口是向海外输油的装油港。这港口内有三个泊位及灌油设施,可以同时容纳三条油船。到这个港口来装油的油船有三种类型。第一种占总数的25%,每次装油用18士2小时;第二种占总数的55%,每次装油用24士3小时;第三种占总数的20%,每次装油用36士4小时。平均而言,每隔11士7小时有一条船到达此港。
船到港后,要靠港内惟一的托船,用大约1小时将它们拖入某个泊位,然后装油。离开时也用这个拖船,大约花1小时。出海后就自己行驶了。
不过港内常有大风暴,每隔24小时左右有一次。一次风暴持续42小时,风暴开始后船就不能进出港。风暴停了后才可以进出港口。
长期工作经验发现,港口的平均利用率是80%。由于拖船或装油的泊位被占用,使装油时间平均延迟了5小时。
港口当局想与英国某公司订合同,增加几条船,装油送到英国,但不知加船后会产生什么影响。例如,港口的平均利用率变为多少?装油的时间延迟多少?
这些问题可以用GPSS模型来解决。假设增加5条新船,它们的装油时间为24士3小时。到英国去的往返时间为240士24小时,建立一个模型。
港口接收油船决策模型可以设立4个进程。
(1)风暴进程。大自然是活动实体,风暴用逻辑开关STORM表示。当STORM置位时表示有风暴;复位时表示风暴停了。每隔48/J’时左右,大自然置STORM为SET。持续4土2小时,令风暴复位。
(2)旧船进程。船是活动实体,用它的PHI记三种类型的船。它们按11士7小时到达系统找拖船,等待风暴停止。当泊位空时,船装油之后离开。
(3)新船进程。新船是活动实体。有5条新船,也用PH1记船的类型。设它的类型为4,以后它就可以插入旧船进程。虽然4种类
型的船的装油时间不同,但可以用同一个进程,因为装油时间的均值用PHI的函数MEAN,方差用PHI的函数SPRED。记录4条船在港时间用 4个表即 1、2、3、4号表。每条旧船都用 MARK TllAE属性来记离港前的渡越时间,所以表是用MI分类的。新船用FL3记其在港口的渡越时间,所以表是用MPL3来分类。
(4)时间进程。记时1年后终止模拟。
模型的流图如下图。
程序如下:
SIMULATE
MEAN FUNCTION PH1,L4
1,18/2,24/3,36/4,21
SEPERD FUNCTION PH1,L4
1,,2/2,3/3,4/4,3
TYPE FUNCTION RN1,D3
.25,1/8,2/1,3
XPDS FUNCTION RN1,C24
0.0/.1,.104/,2,.222/.3,.355/.4,.509/.5,.69/.6,.915/.7,
1.2/.75,1.38/.8,1.6/.84,1.83/.88,2.12/.9,2.3/.92,2.52/
.94,2.81/.95/.96,6,3.2/97,3.5/.98,3.9/.99,4.6/
.995,5.3/998,6.2/.999,7/.999,8
1 TABLE M1,20,10,9
2 TABLE M1,20,10,9
3 TABLE M1,40,10,9
4 TABLE MPH3,20,10,9
GOIN BVARIABLE SNF $BERTH *FUN$TUG
*LR $STORM
GOOUT BVARIABLE FUN $ TUG *LR $ STORM
*LR $STORM
SPACE VARIABLE 48*N$ HERE
风暴进程:
GENERATE
NEXT ADVANCE 48,FN $XPDIS
LOGIC S STROM
ADVANCE 4,2
LOGIC R STORM
TRANSFER ,NEXT
新船进程:
GENERATE ,,,1
ASSIGN 1,4,,PH
HERE ADVANCE V$ SPACE
MARK 3
TRANSFER ,PORT
旧船进程:
GENERATE 11,7
ASSIGN 1,FN $ TYPE,,PH
PORT TESTE BV $ GOIN,1
SEIZE TUG
ENTER BERTH
ADVANCE 1
RELEASE THG
ASSIGN 2,FN $ SPPED,,PH
ADVANCE FN $ SPPED
TEST E BV$ GOOUT,1
SEIZE TUG
ADVANCE 1
RELEASE TUG
LEAVER BERTH
TABULATE PH1
TEST NE PH1,4,CYCLE
TERMINATE
CYCLE ADVANCE 240,24
MARK 3
TRANSFER ,PORT
时间进程:
GENERATE 8760TERMINATE 1
START 1
END
[例7-3]库存问题]
一个零售商店,正常情况下每天需要10士2项货物。店主定了一个库存的最低点,称为记录点(RECORD POINT)。当货物低于该点时,他就去定货。每次定货100项,称为记录量(RECORD
QUANTITY)。从定货日算起,货物延迟 6到 10天才可到达。这称为间隔时间(LEAD TIME)。其分布见表
店主想要知道在不同的记录点上货物变动的情况。由于从定货到收货的时间为 8天左右,所以预计定货点不得少于 80。为了保险,他也可取100为记录点,但这样手头库存资本可能会积压。建立一个模型模拟 1000天,并分别设记录点为 80,90,100,计算出缺货的分布、库存的分布。为简单起见,设店主每天清点一次货,再决定是否去定货,货到后也等晚上才上货,不考虑星期日问题。
建立一个缺货情况的登记表,用缺货数PHZ作为分类标准。再建立一个库存登记表,用当前库存量XH$M为分类标准,建立一个进程。
售货员用售货进程中的活动实体。它的PHI存每天的需发量,用变量DMND表示;缺货量用变量LOST表示。
办公室工作人员是定货进程的活动实体,他检查STOCK是否落在记录点上(记录点用存数单元 ROP表示)。如果是,就去定货。货在沿途时间用函数LTIME表示。因为白天要卖货,晚上才进货,所以此进程的活动实体的优先数低。
库存模型的流程图如下图。