计算机仿真排队系统实验报告(附代码)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机仿真实验报告

第一题

1•作业内容

应用排队系统流程图,用C语言编制仿真程序,求解以下问题。

修理店只有一个修理工,来修理的顾客到达次数服从泊松分布,平均4人/h;修理时间服从指数分布,平均需6min。试求(随机数发生器采用float Icgrand(int stream)种子stream 为自己学号的最后两位。):

①修理店空闲的概率;

②店内有三个顾客的概率;

③店内至少有一个顾客的概率;

④在店内顾客的平均数;

⑤顾客在店内的平均逗留时间;

⑥顾客必须在店内消耗15分钟以上的概率。

统计量实现算法:

①修理店空闲的概率;

p1=1-area_server_status/sim_time

area_server_status: 总服务时间(即修理工在这段仿真时间里非空闲时间)

sim_time: 总仿真时间

用1减去非空闲概率,即为空闲概率。

②店内有三个顾客的概率;

p2=Three_people_time/sim_time

增加变量Three_people_time,即有三个顾客在店内的时间。

三个顾客在店里,也就是说一个顾客在理发,两个人在排队,此时,无论是来一个新的客人或者离开一个客人,都会破坏这种三个人的状态,所以我们每次要统计的,就是这种三个人的状态持续的时间。因此,用到的是time_si nce_last_eve nt 这个变量,该变量用于统计两种状态(事件,包括离开和到来)之间的事件。因此,在每次计算完time_s in ce_last_eve n

t之后,考察队伍中的人数是否为2,若为2,则把该段time_since_last_event 加到Three_pe

ople_time中。仿真结束时,用Three_people_time/总仿真时间,即为店内有三个顾客的概率。

③店内至少有一个顾客的概率;

p3=p3=1-idle_time/sim_time

增加变量idle_time,即店里空闲的概率(没有顾客),用1减去一个顾客都没有的概率,就是至少有一个顾客的概率。

判断店里空闲的方法是,如果当前有一个顾客来了,他不需要排队,就意味着这之前店里是空闲着的。这里仍用到time_since_last_event ,在这个客人来之前的这段时间店里空闲,因此把这个时间段加给idle_time ,以此累加,最后得到总的空闲时间。

④在店内顾客的平均数;

mea n_customer=1.0* num _custs_delayed/sim_time

在这里我计算的是店里平均每分钟的顾客数(包括等待的和正在理发的)。num_cust_delay ed是在这段仿真时间里总共出现的顾客,除以仿真时间,就是店内顾客平均数。

⑤顾客在店内的平均逗留时间;

mea n_stay_time=(area_ num」n _q+area_server_status)/(1.0* num _custs_delayed)

对于任意一位顾客,他在店里逗留的时间=排队时间+理发时间。area_num_in_q统计的是

队列中的顾客等待的总时间,而area_server_status统计的是所有顾客理发的总时间,相加就是所有顾客在店里逗留的时间,除以顾客的人数,就是顾客平均逗留时间。

⑥顾客必须在店内消耗15分钟以上的概率。

p6=1.0*co un t15/num_custs_delayed

增加变量count15,用于统计在店内消耗15分钟以上的顾客人数,再增加变量single_cust_t ime,用于统计单个顾客在店内消耗的时间。

这里有两种情况。

(1)不用排队。那么该顾客在店里消耗的时间就是理发时间,即sin gle_cust_time=time_ n ext_event[2]-sim_time 。time_next_event[2]=sim_time+expon(mean_service) 。

(2)要排队。那么single_cust_time=delay+time_next_event[2]-

sim_time。delay是当前有一位顾客离开时,得到的下一位将要理发的顾客(即队首顾客) 的等待时间。每一位顾客到店里时都会有一个time_arrival[] 将其抵达时刻记录下来,因此,轮到他时,用sim_time 减去time_arrival[] 就得到了他等待的时间。等待时间加上理发时间,就是这位顾客在店里消耗的时间。

以上可计算出单个顾客在店里消耗的时间,与15分钟比较,若超过,加入count15中,count 15除以总人数,就是所求概率。

对原程序的修改点:

去掉了文件操作,用提示输入的方式输入参数,可多次输入。增加变量count15,Three_peop

le_time,idle_time,single_cust_time 。作用见上面六小题具体算法。

代码:

#include

#include

#include

/*#include "lcgrand.h" Header file for random-number generator. */

#define Q_LIMIT 100 /* Limit on queue length. */

#define BUSY 1 /* Mnemonics for server's being busy */

#define IDLE 0 /* and idle. */

int next_event_type, num_custs_delayed, num_delays_required, num_events, num_in_q,

server_status,count15;

float area_num_in_q, area_server_status, mean_interarrival, mean_service,

sim_time, time_arrival[Q_LIMIT + 1], time_last_event, time_next_event[3],

total_of_delays,Three_people_time,idle_time,single_cust_time,time_since_last_eve nt;

/* The following 3 declarations are for use of the random-number generator

lcgrand and the associated functions lcgrandst and lcgrandgt for seed

management. This file (named lcgrand.h) should be included in any program

using these functions by executing

#include "lcgrand.h"

before referencing the functions. */ float lcgrand(int stream);

void lcgrandst(long zset, int stream); long lcgrandgt(int stream);

void initialize(void);

void timing(void);

void arrive(void);

void depart(void);

void report(void);

void update_time_avg_stats(void);

float expon(float mean);

相关文档
最新文档