用蒙特卡洛法实现对排队等待问题的计算机模拟

在日常生活中,我们每天都会遇到各种各样的排队。比如:银行中取款要排队,火车站买票要排队,超市、商场中购物付款要排队,预订旅馆或机票时也要排队,人们仿佛置身于一个排队的社会。

所谓排队,就是等候消费服务的顾客在进入点前排队(意大利G·佩里切利)。排队的类型一般来说有以下几种:

一个服务点。即只有一个点可供顾客选择等候服务,顾客只能按顺序一个接一个等侯,这样排队,顾客多的时候最混乱。现在这种排队类型已不多见。

多个服务点。即有两个或两个以上的点可供顾客选择,每一点都可排成一条队。多个服务点可减轻一个服务点的负担,增加顾客选择服务点的灵活性,同时顾客还可选择自己喜欢的服务员。

专门服务点。即专门为某些特殊的顾客开辟的服务点。专门的服务点可以保证某些特殊顾客的特殊权益,如:减少顾客等待服务时间,同时使一些顾客分离出来,减轻其服务口的压力。

我们拿一个理发店的实际例子来分析:

某理发馆每天早晨开业后,顾客的到来总是陆续不断的,他们到来的间隔时间,给统计如下:

到达时间间隔(分钟)

频率

4

0.07

5

0.10

6

0.52

7

0.20

8

0.11

顾客到来后,由管理人员引导至A、B、C三个服务椅(理发员固定在服务椅上),各服务椅的服务内容相同,但服务时间有多有少,根据以往统计资料,他们的服务时间分布如下:

A

B

C

时间(分)

频率

时间(分)

频率

时间(分)

频率

8

9

10

11

0.18

0.22

0.33

0.27

10

11

12

13

0.18

0.19

0.35

0.28

12

13

14

15

0.15

0.22

0.36

0.27

1.00

1.00

1.00

当有一个以上服务椅空闲时,管理人员按字母排列次序引导顾客至服务椅去进行服务。顾客中有10%属“特殊顾客”理发很费时间,每人需多4分钟。现模拟10位顾客的到来和服务情况,并分析三个服务椅的忙闲情况。

顾客到达时间间隔

频率

累计频率

对应的

随机数

A服务时间

频率

累计频率

对应的随机数

4

0.07

0.07

0.00~0.06

8

0.18

0.18

0.00~0.17

5

0.10

0.17

0.07~0.16

9

0.22

0.40

0.18~0.39

6

0.52

0.69

0.17~0.68

10

0.33

0.73

0.40~0.72

7

0.20

0.89

0.69~0.88

11

0.27

1.00

1.00

8

0.11

1.00

0.89~1.00

B服务时间

频率

累计频率

对应的

随机数

C服务时间

频率

累计频率

对应的

随机数

10

0.18

0.18

0.00~0.17

12

0.15

0.15

0.00~0.14

11

0.19

0.37

0.18~0.36

13

0.22

0.37

0.15~0.36

12

0.35

0.72

0.37~0.71

14

0.36

0.73

0.37~0.72

13

0.28

1.00

0.72~1.00

15

0.37

1.00

0.72~1.00

我们采用二位随机数来模拟顾客到来间隔和服务情况,并选定碰到个位数是5,就作为“特殊顾”(占10%)现从随机数中抽取随机数如下:

顾客

顾客到来时间间隔

服务随机数

随机数

时间间隔(分)

1

2

3

4

5

6

7

8

9

10

(14)

46

11

66

60

90

33

65

72

92

6

5

6

6

8

6

6

7

8

00

99

20

19

32

40

20

01(特殊顾客)

68

87

设第一个顾客到达的时间是在3点正,随机数是14,此数本不需要,主要是看一下是不是“特殊顾客”,现此数尾数不是5说明第一位不是“特殊顾客”。第一个顾客到达,按字母的顺序应到A服务椅,随机数00,表示要服务8分钟,第二个顾客到达与第一个顾客的间隔时间,按随机数46应为6分钟,即在8.06时,服务椅A正在使用,因此到服务椅B,服务随机数99,应服务13分钟,如此编成表如下:

顾客

到达时间

服务椅

等待时间

服务

时间

A

B

C

到达

离开

到达

离开

到达

离开

1

8:00

A

8

8:00

8:08

2

8:06

B

13

8:06

8:19

3

8:11

C

13

8:11

8:24

4

8:17

A

9

8:17

8:26

5

8:23

B

11

8:23

8:34

6

8:31

A

10

8:31

8:41

7

8:37

B

10

8:37

8:47

8

8:43

A

12

8:43

8:55

9

8:50

B

12

8:50

9:02

10

8:58

A

11

8:58

9:09

共计

109

*为“特殊顾客”服务时间8(分)+4(分)=12(分)

10个顾客在系统内的总时间为63分。

分析:

1.10个顾客在系统(理发馆内)的总时间为69分,平均每人69/10=6.9分

2.10个顾客总的服务时间为109分。平均每人服务109/10=10.9分

3.统内无等待时间,即没出现顾客排队等待问题.

4.椅的服务情况如下:

A

B

C

服务顾客数

总的服务时间(分)

为每个顾客的平均服务时间

空闲时间

空闲占总的时间%

5

50

10

19

27.3%

4

46

11.5

23

33.3%

1

13

13

56

81.2%

在此基础上,可用计算机编写程序,在计算机上实现仿真模拟,用以模拟更多时间和更多顾客时的情况。以下用Matlab编写的模拟程序的算法部分:

function [num,pass]=computing(tim0)

seat=[0 0 0];%服务员属性
pass=rand(1,4);%顾客信息:序号、到达时间、特殊要求时间、正常理发时间
pass(5)=0;%理发员
pass(6)=0;%离开时间
pass(7)=0;%等待时间
num=1;%服务人数初始化
tim=0;%时间计数器
temp=0;%

while tim<=tim0 
    pass(num,1)=num;  %装入序号
    pass(num,2)=rand;
    pass(num,3)=rand;
    pass(num,4)=rand;
    
    %计算顾客到达时间
    if pass(num,2)<=0.07
       temp=4;
    else if  pass(num,2)<=0.17
            temp=5;
        else if  pass(num,2)<=0.69
            temp=6;
            else if  pass(num,2)<=0.89
            temp=7;
                else temp=8;
                end
            end
        end
    end
    tim=tim+temp;   %装入顾客到达时间
    pass(num,2)=tim;
    if pass(num,3)<=0.1 
        pass(num,3)=4;  %装入需要特殊服务的时间
    else pass(num,3)=0;
    end
    num=num+1;
end
num=num-1;

for i=1:num
    
    %计算顾客的理发席位
    if seat(1)<=pass(i,2)+pass(i,7)
        pass(i,5)=1; %由1号服务员理发
        temp1=timinge1(1,pass(i,4));
        seat(1)=pass(i,2)+pass(i,3)+temp1;
        pass(i,4)=temp1;  %装入正常理发所需时间
    else if seat(2)<=pass(i,2)+pass(i,7)
            pass(i,5)=2;  %由2号服务员理发
            temp1=timinge1(2,pass(i,4));
            seat(2)=pass(i,2)+pass(i,3)+temp1;
            pass(i,4)=temp1; %装入正常理发所需时间
        else if seat(3)<=pass(i,2)+pass(i,7)
                pass(i,5)=3; %由2号服务员理发
                temp1=timinge1(3,pass(i,4));
                seat(3)=pass(i,2)+pass(i,3)+temp1;
                pass(i,4)=temp1;                
            else               %计算等待时间
                x=seat(1);
                y=1; 
                if x>seat(2)
                    x=seat(2);
                    y=2;
                end
                if x>seat(3)
                    x=seat(3);
                    y=3;
                end
                pass(i,5)=y;
                temp1=timinge1(y,pass(i,4));
                pass(i,7)=seat(y)-pass(i,2);
                seat(y)=seat(y)+temp1+pass(i,3);
                pass(i,4)=temp1;
            end
        end
    end
pass(i,6)=pass(i,2)+pass(i,3)+pass(i,4);
end

function xxxx=timinge1(vect1,vect)

switch vect1
    case 1    
       if vect<=0.18
            xxxx=8;
        else if  vect<=0.4
               xxxx=9;
            else if vect<=0.77
                    xxxx=10;
                else xxxx=11;
                end
            end
       end
   case 2    
       if vect<=0.18
            xxxx=10;
        else if  vect<=0.37
               xxxx=11;
            else if vect<=0.72
                    xxxx=12;
                else xxxx=13;
                end
            end
       end
    otherwise  
        if vect<=0.15
            xxxx=12;
        else if  vect<=0.37
               xxxx=13;
            else if vect<=0.74
                    xxxx=14;
                else xxxx=15;
                end
            end
       end
end

更多数学建模模型与算法可以关注数模乐园公主号的更新,具体数学建模基础课程可以在数模乐园微小店观看。

你可能感兴趣的:(数学建模,matlab,算法)