计算机仿真

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机仿真
离散仿真程序的设计
5.1 动态实体的实现
1.到达时刻的计算 对于特定的仿真问题,到达时间间隔是满足
指定概率分布的。如将仿真开始时刻确定为 t0=0,就可以获得一个随机的时间间隔Δτi,由 上 动一 态次 实的 体动 到态达实时体刻到ti=达ti-1时+Δ刻τit。i-1,计算出本次的
Δτ1 t0
//找不到 p=null; } }
(3)入队操作
void enqueue(char *q, int n, int j) 将指定编号(j)的动态实体,按其优先权
(rank)的大小,插入到指定的排队线(q,n)的动 态实体记录排队链(member)中;并进行队 列的统计量的运算。
void enqueue(char *q, int n, int j)
立一组新的排队线记录 对其所有属性变量置0 完成连接到headqueue链中
(2)查找排队线
void findqueue(char *q, int n, QUEUEBLOCK &p) 从已连接的多个排队线(记录)中,查找具
有指定队列名(q)和编号(n)的排队线。 找到返回指向该记录的指针(p), 否则返回p=null。
void transget(TRANSACT &*p, int transo)
从链中查找编号为( transo )的动态实体(用 findtrans()函数) 如找到,将该记录从链上取下,p指向动态实体 未找到,p=null
(4)消灭动态实体 void terminate(int j)
将编号等于j的动态实体从链上取下,还给 系统。
pt->length++;
//队长度+1
pt->timelast=tnow;
//记录最新的队列操作时刻
if(pt->lengthmax< pt->length)
pt->lengthmax= pt->length;
//修改队列最大长度
}
其中统计量的计算:
n
lwsum= ti • Li i 1 n
l2wsum= ti • Li 2 i 1
//离队操作计数器(计数得到服务的实体)
*nextqueue; //连接其它排队线
*member;
//连接排队的实体
排队线结构
headqueue
file1
file1
队名
编号
2
1
队长
2
1




顾客
顾客 NIL
file2 1 0 ┇ ┇
NIL
顾客 NIL
排队线的基本操作有4个:
(1)定义一个排队线 void queue(char *q, int n) 根据给定的队列名字(q)和队列数(n),建
}
pt->timeente:=tnow;
//记录下当前时刻tnow
pt->l2wsum= pt->l2wsum+(tnow- pt->timelast)* pt->length* pt->length;
pt->lwsum= pt->lwsum+(tnow- pt->timelast)* pt->length;
void findqueue(char *q, int n, QUEUEBLOCK &p) {
p=headqueue; if(p) {
while((strcmp(p->name,q)!=0)||(p->number!=n)) &&(p->nextqueue))
p=p->nextqueue; //继续检测下一个排队线记录 if((strcmp(p->name,q)!=0)||(p->number!=n))
//排队线名字
//排队线编号(同名的排队线可以有多条)
//队列的当前长度
//队列的最大长度
//最后的(入/离)队列操作时刻,用于计算Δτ
//(队中实体的)最长等待时间
//(队中实体的)等待时间之和(统计均值用)
//等待时间之平方和(统计方差用)
//队列加权长度和:(统计平均队长)
//队列加权长度平方和:(统计队长均方)
{
transget(pt, j);
//从动态实体记录链中取出实体(j),由pt指向
findqueue(q,n,pq); //查找需插入的队列(q,n),由pq指向
if(pq)
//找到队列记录
{
if (排队线“空”)
{
将pt指向的动态实体挂在排队线(pq)的第一个
}
else
{
按优先数的大小,将pt指向的动态实体加入到pq队列中
……. TRANSACT *nexttrans; };
//动态实体
//动态实体号 //优先级(0~255) //生成时刻,入队时刻 //整型属性变量 //实型属性变量 //其它属性 //后继指针
有关动态实体的基本操作(方法)有4种:
(1)动态实体的生成 void generate(int &j); 生成一个动态实体记录 给出编号(J)、生成时刻;对有关属性初始化 将新(动态实体)记录加入到动态实体链中
head 新
NIL
(2)按动态实体编号从相关记录链中寻找
void findtrans(int transnum, TRANSACT *p)
依据动态实体编号( transnum )从链 (head)中查找记录(动态实体);
找到,返回指向该记录的指针(p), 找不到,p=null。
(3)按动态实体编号从记录链中寻取出动态实体
5.2 排队线的实现
对例子(银行)中的顾客要选择排队线, 实现排队线的方法仍可采用记录结构:
struct QUEUEBLOCK {
char name[20]; int number; int length; int lentgthmax; float timelast; float waitmax; float waitsum; float wait2sum; float lwsum; float l2wsum; int count; QUEUEBLOCK TRANSACT }
Δτ2
t1
tபைடு நூலகம் t
2. 动态实体的表示
以前面的银行系统为例,使用面向事件的 仿真程序结构。
在程序中将使用带指针结构体来表示动态 实体。用C++定义一个动态实体的记录如下:
struct TRANSACT {
int transnum; unsigned char rank; float timeborn, timeenter; int attrib1,attrib2; float attri;
相关文档
最新文档