matlab中排队论的程序

Python014

matlab中排队论的程序,第1张

你参考模仿一下吧。

clear

clc

%*****************************************

%初始化顾客

%*****************************************

%总仿真时间

Total_time = 10

%队列最大长度

N = 10000000000

%到达率与服务率

lambda = 10

mu = 6

%平均到达时间与平均服务时间

arr_mean = 1/lambda

ser_mean = 1/mu

arr_num = round(Total_time*lambda*2)

events = []

%按负指数分布产生各顾客达到时间间隔

events(1,:) = exprnd(arr_mean,1,arr_num)

%各顾客的到达时刻等于时间间隔的累积和

events(1,:) = cumsum(events(1,:))

%按负指数分布产生各顾客服务时间

events(2,:) = exprnd(ser_mean,1,arr_num)

%计算仿真顾客个数,即到达时刻在仿真时间内的顾客数

len_sim = sum(events(1,:)<= Total_time)

%*****************************************

%计算第 1个顾客的信息

%*****************************************

%第 1个顾客进入系统后直接接受服务,无需等待

events(3,1) = 0

%其离开时刻等于其到达时刻与服务时间之和

events(4,1) = events(1,1)+events(2,1)

%其肯定被系统接纳,此时系统内共有

%1个顾客,故标志位置1

events(5,1) = 1

%其进入系统后,系统内已有成员序号为 1

member = [1]

for i = 2:arr_num

%如果第 i个顾客的到达时间超过了仿真时间,则跳出循环

if events(1,i)>Total_time

break

else

number = sum(events(4,member) >events(1,i))

%如果系统已满,则系统拒绝第 i个顾客,其标志位置 0

if number >= N+1

events(5,i) = 0

%如果系统为空,则第 i个顾客直接接受服务

else

if number == 0

%其等待时间为 0

2009.1516

%PROGRAMLANGUAGEPROGRAMLANGUAGE

events(3,i) = 0

%其离开时刻等于到达时刻与服务时间之和

events(4,i) = events(1,i)+events(2,i)

%其标志位置 1

events(5,i) = 1

member = [member,i]

%如果系统有顾客正在接受服务,且系统等待队列未满,则 第 i个顾客进入系统

else len_mem = length(member)

%其等待时间等于队列中前一个顾客的离开时刻减去其到 达时刻

events(3,i)=events(4,member(len_mem))-events(1,i)

%其离开时刻等于队列中前一个顾客的离开时刻加上其服

%务时间

events(4,i)=events(4,member(len_mem))+events(2,i)

%标识位表示其进入系统后,系统内共有的顾客数

events(5,i) = number+1

member = [member,i]

end

end

end

end

%仿真结束时,进入系统的总顾客数

len_mem = length(member)

%*****************************************

%输出结果

%*****************************************

%绘制在仿真时间内,进入系统的所有顾客的到达时刻和离

%开时刻曲线图(stairs:绘制二维阶梯图)

stairs([0 events(1,member)],0:len_mem)

hold on

stairs([0 events(4,member)],0:len_mem,'.-r')

legend('到达时间 ','离开时间 ')

hold off

grid on

%绘制在仿真时间内,进入系统的所有顾客的停留时间和等

%待时间曲线图(plot:绘制二维线性图)

figure

plot(1:len_mem,events(3,member),'r-*',1: len_mem,events(2,member)+events(3,member),'k-')

legend('等待时间 ','停留时间 ')

grid on

M/M/m排队系统性能仿真代码matlab

function r=randexp(lambda)r = -lambda*log(rand)

说明同上

%mmm simulation in matlab

clcclear

ST_Idle=0

ST_Busy=1

EV_NULL=0

EV_Arrive=1

EV_Depart=2

EV_LEN=3

Q_LIMIT=1000

% next_event_type=[]

% next_depart=[]

% num_custs_delayed=[]

% num_delays_required=[]

% num_events=[]

% num_in_q=[]

% server_status=[]

% area_num_in_q=[]

% area_server_status=[]

% mean_interarrival=[]

% mean_service=[]

% sim_time=[]

% time_last_event=[]

% total_of_delays=[]

%

time_arrival=[]%到达时刻

time_next_event=zeros(1,EV_LEN)

%仿真参数

num_events=EV_LEN-1

num_server=3%M/M/m m=2

mean_interarrival=1

mean_service=.5

num_delays_required=2000 %

outfile=fopen('MM m.txt','w')

fprintf(outfile, 'Multiple-server queueing system\n\n')

fprintf(outfile, 'Mean interarrival time%11.3f minutes\n\n',mean_interarrival)

fprintf(outfile, 'Mean service time%16.3f minutes\n\n', mean_service)

fprintf(outfile, 'Number of servers%20d\n\n', num_server)

fprintf(outfile, 'Number of customers%14d\n\n', num_delays_required)

%part1 initialize

sim_time=0.0

%/* Initialize the state variables. */

server_status =zeros(1,num_server) %idle

num_in_q= 0

time_last_event = 0.0

%/* Initialize the statistical counters. */

num_custs_delayed = 0

total_of_delays= 0.0

total_of_time= 0.0

area_num_in_q = 0.0

area_server_status = 0.0

%/* Initialize event list. Since no customers are present, the departure

%(service completion) event is eliminated from consideration. */

time_next_event(EV_Arrive) = sim_time + randexp(mean_interarrival)

time_next_event(EV_Depart) = 1.0e+230

time_depart=zeros(1,num_server)

next_depart=0

%part2

while (num_custs_delayed <num_delays_required)

%Run the simulation while more delays are still needed.

%/* Determine the next event. */

min_time_next_event = 1.0e+290

next_event_type = 0

% Determine m depart event

min_time_depart=1e290

next_depart=-1

for i=1:num_server

if(server_status(i)==1 &time_depart(i)<min_time_depart)

min_time_depart=time_depart(i)

next_depart=i

end

end

time_next_event(2)=min_time_depart

%

%/* Determine the event type of the next event to occur. */

for i = 1: num_events

if (time_next_event(i) <min_time_next_event)

min_time_next_event = time_next_event(i)

next_event_type = i

end

end

%/* Check to see whether the event list is empty. */

if (next_event_type == 0)

%/* The event list is empty, so stop the simulation. */

fprintf(outfile, '\nEvent list empty at time %f', sim_time)

exit(1)

end

%/* The event list is not empty, so advance the simulation clock. */

sim_time = min_time_next_event

%/* Update time-average statistical accumulators. */

double time_since_last_event

%/* Compute time since last event, and update last-event-time marker. */

time_since_last_event = sim_time - time_last_event

time_last_event = sim_time

%/* Update area under number-in-queue function. */

area_num_in_q=area_num_in_q + num_in_q * time_since_last_event

%/* Update area under server-busy indicator function. */

for i=1:num_server

area_server_status =area_server_status + server_status(i) * time_since_last_event

end

%/* Invoke the appropriate event function. */

%arrival

if(next_event_type==EV_Arrive)

double delay

%/* Schedule next arrival. */

time_next_event(1) = sim_time + randexp(mean_interarrival)

%/* Check to see whether server is busy. */

s_idle=-1

for i=1:num_server

if (server_status(i) == ST_Idle)

s_idle=i

break

end

end

%/* all Server is busy, so increment number of customers in queue. */

if(s_idle== -1 )

num_in_q=1+num_in_q

%/* Check to see whether an overflow condition exists. */

if (num_in_q >Q_LIMIT)

%/* The queue has overflowed, so stop the simulation. */

fprintf(outfile, '\nOverflow of the array time_arrival at')

fprintf(outfile, ' time %f', sim_time)

exit(2)

end

%/* There is still room in the queue, so store the time of arrival of the arriving customer at the (new) end of time_arrival. */

time_arrival(length(time_arrival)+1)=sim_time

else

%/* Server is idle, so arriving customer has a delay of zero. (The following two statements are for program clarity

%and do not affect the results of the simulation.) */

delay = 0.0

total_of_delays =total_of_delays + delay

%/* Increment the number of customers delayed, and make server busy. */

num_custs_delayed = 1 + num_custs_delayed

server_status(s_idle) = ST_Busy

%/* Schedule a departure (service completion). */

time_depart(s_idle) = sim_time + randexp(mean_service)

end %if (server_status == ST_Busy)

%depart

else

double delay

%/* Check to see whether the queue is empty. */

if (num_in_q == 0)

% /* The queue is empty so make the server idle and eliminate the departure (service completion) event from consideration. */

server_status(next_depart) = ST_Idle

time_depart(next_depart) = 1.0e+230

%check_depart()

min_time_dapart=1e290

next_depart=-1

for i=1:num_server

if(server_status(i)==1 &time_depart(i)<min_time_depart)

min_time_depart=time_depart(i)

next_depart=i

end

end

time_next_event(2)=min_time_depart

else

%/* The queue is nonempty, so decrement the number of customers in queue. */

num_in_q=num_in_q-1

%/* Compute the delay of the customer who is beginning service and update the total delay accumulator. */

delay = sim_time - time_arrival(1)

total_of_delays =total_of_delays + delay

%/* Increment the number of customers delayed, and schedule departure. */

num_custs_delayed = 1 + num_custs_delayed

serv_time=randexp(mean_service)

time_depart(next_depart) = sim_time + serv_time

total_of_time = total_of_time + delay + serv_time

%check_depart()

min_time_dapart=1e290

next_depart=-1

for i=1:num_server

if(server_status(i)==1 &time_depart(i)<min_time_depart)

min_time_depart=time_depart(i)

next_depart=i

end

end

time_next_event(2)=min_time_depart

%/* Move each customer in queue (if any) up one place. */

tempForPop=time_arrival(2:length(time_arrival))

time_arrival=tempForPop

end %if (num_in_q == 0)

end %if(next_event_type==EV_Arrive)

end %while

%%%%%%%%%% part 3

%/* Invoke the report generator and end the simulation. */

fprintf(outfile, '\n\nAverage delay in queue%11.3f minutes\n\n',total_of_delays / num_custs_delayed)

fprintf(outfile, '\n\nAverage delay in system%11.3f minutes\n\n',total_of_time / num_custs_delayed)

fprintf(outfile, 'Average number in queue%10.3f\n\n',area_num_in_q / sim_time)

fprintf(outfile, 'Server utilization%15.3f\n\n',area_server_status / sim_time)

fprintf(outfile, 'Time simulation ended%12.3f minutes', sim_time)

fclose(outfile)

假设只有2个人,A和B,每人可供选择的策略只有排队、不排队,假设先到收益为r,插队收益为不排队对另一方造成的损失,设为l,则A、B博弈的收益如下(A先到概率为p):

B

排队 不排队

A 排队 pr ,(1-p)r p(r-l) , (1-p)r+pl

不排队 pr+(1-p)l , (1-p)(r-l) pr-l, (1-p)r-l

从表上可以看出,A与B之间的博弈不存在纯粹均衡策略,因为(Y表示排队,N表示不排队,(Y,N)表示A选择Y,B选择N时的收益)

对A来说,(N,Y)>Y,Y>Y,N>N,N

对B来说,Y,N>Y,Y>N,Y>N,N

所以此博弈不存在纯粹均衡。

但是这里是一次博弈的情形,说明在只有1次博弈机会的情况下,每个人都有选择不排队的动力,而最终对所有人自己造成伤害。分析到这里并不能说明我们都应该排队或者插队,只能告诉我们在别人排队的时候插队是有利可图的。

如果需要推导出我们应该排队的结论,你可以从多次重复博弈的总收益来思考。

本人能力有限,希望能对你有所帮助。