1、 目录 1 仿真系统分析 1 1.1 超级市场组成部分 1 1.2 仿真目的 1 1.3 系统组成 1 2 仿真系统设计 4 2.1 程序演示 4 2.2 程序源代码 6 3 运算及结果分析 22 3.1 仿真类别 22 3.2 系统系能测度的点估计 22 3.3 系统性能测试的区间估计 23 超市仿真设计说明书 073485 姚鸿儒 1 仿真系统分析 1.1 超级市场组成部分 设待研究的超级市场由一个入口、收货区、收款区和出口组成,且满足如下规则: (1)顾客源无穷。 (2)每个收银台每次只能为一位
2、顾客服务。 (3)顾客到达后,通过入口进入售货区选购商品,选购完毕,便到收银台付款。 (4)如收银台空闲,顾客可立刻接受服务。如收银台不空,则他选择最短队列排队。先到先服务。 (5)付款完毕顾客便离开收银台,通过出口离去。离开收银台到出口这段时间忽略。 (6)收款员连续工作,不考虑中断的情况。 1.2 仿真目的 假设我们对该超市系统进行仿真分析的主要目的是要对该超市收银台的配置进行优化分析。因此,数量指标的定义如下。 (1)排队时间:即一个顾客在收银台前排队等待收款的时间; (2)付款时间:即一个顾客付款所用的时间; (3)逗留时间:即顾客在系统内经过的总时间,对超级市场来说
3、购物时间、付款时间与排队时间三者之和等于逗留时间。 根据上述数量指标,可进一步明确仿真目的就是要得到平均排队时间、平均逗留时间、最大排队长度和收银台利用率等数量指标。 1.3 系统建模 (1)系统组成 根据仿真的目的,将此系统分为入口、售货区、收银台和出口四个部分。 (2)描述变量 1) 描述入口:,表示顾客在时刻到达入口,为随机变量。 2) 描述售货区:,表示在售货区内有顾客,将分别于时刻购物完毕,为随机变量。 3) 描述收款台:,表示收款台前排队情况,且顾客先结账,次之,以此类推;表示正在结账的顾客将于时刻结账完毕而离去,为随机变量。 (3)相互关系 1) 顾客到达时
4、刻:。为顾客选购商品时间,为随机变量;当顾客到达服从强度为的负指数分布到达时,,为上均匀分布随机数。 2) 购货完毕时刻:。为顾客选购商品的时间,为随机变量。 3) 结账结束时刻:。为服务时间,为随机变量。当队长时等于前一个顾客的结账时刻;当时,。 (4)状态转移函数 式中,表示系统下一个状态由顾客到达事件触发;表示系统下一个状态由顾客选购商品完毕事件触发;表示系统下一个状态由顾客结账完毕事件触发。 (4)仿真流程 2 仿真系统设计 2.1 程序演示 打开程序后,首先后出现一个欢迎界面。这个界面由一个Timer控制,3秒后自动跳转参数设置界面。 在参数设置界面
5、用户可以对顾客到达分布模型、顾客购物分布模型、顾客付款分布模型进行设置。程序共提供四种模型,分别是:均匀分布、指数分布、正态分布、泊松分布。下面对四种分布函数介绍。 均匀分布密度函数: 指数分布密度函数: 正态分布密度函数: 泊松分布密度函数: 点击“开始仿真”后,会对顾客的一系列行为进行模拟。转到流程界面。由于数目较多,可能会有一定的运行时间,请耐心等待。 点击“查看结果分析”可看到超市仿真结果分析。会显示系统总人数、系统总时长、平均排队长度、最大排队时间、服务台空闲时间、最大排队长度、平均逗留时间、平均等待时间、收银台利用率等指标。 2.2 程序源代码 Mod
6、ule Module1 Public f1 As New Form1 Public f2 As New Form2 Public f3 As New Form3 Public f4 As New Form4 '生成均匀分布随机数 Public Function jyrandom(ByVal a As Single, ByVal b As Single) Dim x As Single Randomize() x = Rnd() jyrandom = a + (b
7、 a) * x End Function '生成正态分布随机数 Public Function ztRandom(ByVal a As Single, ByVal b As Single) Dim x1 As Single Dim x2 As Single Dim i As Integer Randomize() x2 = 0 For i = 1 To 12 x1 = Rnd() x2 = x2 +
8、x1 Next x2 = x2 - 6 ztRandom = Math.Abs(a * x2 + b) End Function '生成指数分布随机数 Public Function zsRandom(ByVal a As Single) Dim x As Single Randomize() x = Rnd() zsRandom = (-1 / a) * Math.Log(x) End Function '生成泊松
9、分布随机数 Public Function bsrandom(ByVal a As Single) Dim t!, b!, r!, k% t = 1 b = Math.Exp(-a) While (t - b >= 0) r = Rnd(1) t = t * r k = k + 1 End While bsrandom = k End Function End Module Public
10、 Class Form1 Dim t% Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick t = t + 1 If t = 2 Then f2.Show() ElseIf t = 3 Then Me.Hide() End If End Sub End Class Public Cla
11、ss Form2 '参数定义 Public intNum As Integer '顾客总人数 Public intBeCata As Integer '到达时间分布类型 Public intBuyCata As Integer '购物时间分布类型 Public intPayCata As Integer '付款时间分布类型 Public intQueueNum As Integer '服务台数 Public maxLengt
12、h As Integer '最大队列长度 Public maxQTime As Integer Public sinTotalTime As String '仿真最长时间 Public nowTime As Single '当前系统时针 Public endtime As Single Public nowCustom As Long '当前顾客 Private sinCustomCome() As Long '顾客
13、到达时刻 Private sinCustomComeTemp() As Long Private sinCustomBuy() As Long '顾客购物完毕时刻 Private sinCustomBuyTime() As Long '顾客选购时间 Private sinCustomBuyTemp() As Long '选购临时变量 Private intQueueSquare(,) As Long '顾客排队队列矩阵顾客编号 Private sinStartPay() As Long
14、 '开始付款时刻 Private sinStartPayTemp() As Single '付款临时变量 Private sinLeaveTime() As Long '顾客离去时刻 Private sinLeaveTimeTemp() As Single '离去临时变量 Private sinCustomPayTime() As Single '付款时间 Private intQueueLength() As Long '顾客队列长度 Private intCu
15、stomRow() As Long '顾客所在队列序号 Private intQueuePosit() As Long '顾客所在队列位置 Private sinLesTime() As Single '顾客空闲时间 Private sinCustomWait As Single '顾客等待时间 Private intCustomWaitNum As Integer '排队人数 Private sinCustomIn As Single '顾客等待时
16、间 Private intCustomInNum As Integer '当前顾客人数 Private sinCustomQtime As Single '顾客排队加付款时间 Private intCustomQNum As Integer ' Private sinQueueLeis() As Single '服务台空闲时间 Private sinQueueTime() As Single ' Const MAX = 100000000.0# Privat
17、e Sub Initial() Randomize() Dim i As Integer intNum = 0 maxLength = 0 nowTime = 0 endtime = 0 intQueueNum = Val(TextBox1.Text) ReDim sinCustomCome(0) '重新定义各个动态数组 ReDim sinCustomComeTemp(0) ReDim sinC
18、ustomBuy(0) ReDim sinCustomBuyTime(0) ReDim sinLeaveTime(0) ReDim sinCustomPayTime(0) ReDim sinLeaveTimeTemp(0) ReDim intQueueSquare(intQueueNum - 1, 0) ReDim intQueueLength(intQueueNum - 1) ReDim intCustomRow(0) ReDim sinCustom
19、BuyTemp(0) ReDim intQueuePosit(0) ReDim sinStartPay(0) ReDim sinStartPayTemp(0) ReDim sinQueueLeis(0) ReDim sinQueueTime(0) ReDim sinLesTime(intQueueNum - 1) ReDim sinQueueTime(intQueueNum - 1) For i = 0 To intQueueNum - 1
20、 sinLesTime(i) = 0 Next maxQTime = 0 sinCustomWait = 0 intCustomWaitNum = 0 sinCustomIn = 0 intCustomInNum = 0 sinCustomQtime = 0 intCustomQNum = 0 sinCustomComeTemp(0) = 0 sinCustomCome(0) = 0
21、 sinCustomBuy(0) = 0 sinCustomBuyTemp(0) = 0 intCustomRow(0) = 0 For i = 0 To intQueueNum - 1 intQueueSquare(i, 0) = 0 intQueueLength(i) = 0 Next f3.DataGridView1.Rows.Clear() End Sub ' Private Sub getcata()
22、 If RadioButton1.Checked = True Then intBeCata = 1 ElseIf RadioButton2.Checked = True Then intBeCata = 2 ElseIf RadioButton3.Checked = True Then intBeCata = 3 ElseIf RadioButton4.Checked = True Then intBeCata = 4
23、 Else MsgBox("请选择顾客到达分布模型") Exit Sub End If If RadioButton5.Checked = True Then intBuyCata = 1 ElseIf RadioButton6.Checked = True Then intBuyCata = 2 ElseIf RadioButton7.Checked = True Then intBuyCat
24、a = 3 ElseIf RadioButton8.Checked = True Then intBuyCata = 4 Else MsgBox("请选择顾客购物分布模型") Exit Sub End If If RadioButton12.Checked = True Then intPayCata = 1 ElseIf RadioButton11.Checked = True Then
25、 intPayCata = 2 ElseIf RadioButton10.Checked = True Then intPayCata = 3 ElseIf RadioButton9.Checked = True Then intPayCata = 4 Else MsgBox("请选择顾客付款分布模型") Exit Sub End If End Sub '顾客到达 Pri
26、vate Sub CustomArrive() Dim sinComeTime As Single Dim sinBuyTime As Single intNum = intNum + 1 ReDim Preserve sinCustomCome(intNum) ReDim Preserve sinCustomComeTemp(intNum) ReDim Preserve sinCustomBuy(intNum) ReDim Preserve sinCustomBuyT
27、emp(intNum) ReDim Preserve sinCustomBuyTime(intNum) ReDim Preserve sinLeaveTime(intNum) ReDim Preserve sinLeaveTimeTemp(intNum) ReDim Preserve sinCustomPayTime(intNum) ReDim Preserve intCustomRow(intNum) ReDim Preserve intQueuePosit(intNum)
28、 ReDim Preserve sinStartPay(intNum) ReDim Preserve sinStartPayTemp(intNum) Select Case intBeCata '到达分布类型 Case 1 sinComeTime = jyrandom(Val(jya1.Text), Val(jyb1.Text)) Case 2 sinComeTime = zsRandom(Val(zs1.Text))
29、 Case 3 sinComeTime = ztRandom(Val(zta1.Text), Val(ztb1.Text)) Case 4 sinComeTime = bsrandom(Val(bs1.Text)) End Select Select Case intBuyCata Case 1 sinBuyTime = jyrandom(Val(jya2.Text), Val(jyb2.Text
30、)) Case 2 sinBuyTime = zsRandom(Val(zs2.Text)) Case 3 sinBuyTime = ztRandom(Val(zta2.Text), Val(ztb2.Text)) Case 4 sinBuyTime = bsrandom(Val(bs2.Text)) End Select sinCustomBuyTime(intNum) = si
31、nBuyTime '顾客购货时间 sinCustomCome(intNum) = sinComeTime + sinCustomCome(intNum - 1) '生成下位顾客到达时间 sinCustomComeTemp(intNum) = sinCustomCome(intNum) sinCustomBuy(intNum) = sinBuyTime + sinCustomCome(intNum) '顾客购物完毕时间 sinStartPay(intNum) = MAX
32、 sinLeaveTime(intNum) = MAX sinLeaveTimeTemp(intNum) = MAX End Sub '*时间变量转换为以秒为单位 Public Function GetTolSeconds(ByVal dtDateTime As DateTime) As Integer GetTolSeconds = dtDateTime.Hour * 3600 + dtDateTime.Minute * 60 + dtDateTime.Second End Function
33、 '获取仿真总时长 Private Sub GetTime() sinTotalTime = GetTolSeconds(Me.DateEndTime.Value) - GetTolSeconds(Me.DateBeTime.Value) End Sub '秒转换为日期时间行式 Public Function SecondToHour(ByVal nSecondTime As Integer) As String Dim nHour As Integer Dim nMinute As Integer
34、 Dim nSecond As Integer nHour = Int(nSecondTime / 3600) nMinute = Int((nSecondTime - nHour * 3600) / 60) nSecond = nSecondTime - nHour * 3600 - nMinute * 60 Dim sMinute As String Dim sSecond As String If nMinute.ToString.Length = 1 Then
35、 sMinute = "0" & nMinute.ToString Else sMinute = nMinute.ToString End If If nSecond.ToString.Length = 1 Then sSecond = "0" & nSecond.ToString Else sSecond = nSecond.ToString End If SecondToHour =
36、 nHour & ":" & sMinute & ":" & sSecond End Function '获取仿真结束时间 Private Sub getendtime() Dim i As Integer For i = 1 To intNum If endtime < sinLeaveTimeTemp(i) Then endtime = sinLeaveTimeTemp(i) End If Next End Su
37、b '事件选择 Private Function ChooseEvent() '按照事件步长推进时间 Dim i As Integer Dim minTime(3) As Single Dim intTemp(3) As Integer Dim min As Single minTime(0) = sinCustomCome(intNum) min = minTime(0) minTime(1) = sinCustomBuy(1
38、) minTime(2) = MAX intTemp(0) = intNum intTemp(1) = 1 For i = 1 To intNum If sinCustomBuy(i) < minTime(1) Then minTime(1) = sinCustomBuy(i) '找到最近购货完毕的时刻 intTemp(1) = i '找到最近购货完毕的顾客编号 End If Nex
39、t For i = 1 To intNum If sinLeaveTime(i) < minTime(2) Then minTime(2) = sinLeaveTime(i) '找到最近顾客离去的时刻 intTemp(2) = i '找到最近离去顾客的编号 End If Next If sinCustomCome(1) = 0 Then '取得离当前系统时针最近的事件 Choose
40、Event = 0 Else ChooseEvent = 0 nowTime = minTime(0) nowCustom = intTemp(0) For i = 1 To 2 If min > minTime(i) Then min = minTime(i) nowTime = minTime(i) Choose
41、Event = i nowCustom = intTemp(i) End If Next End If End Function '顾客购物完毕后选择最短队列排队 Private Sub ChooseQueue(ByVal intCuNum As Integer) 'intCuNum 参数为当前将要进入队列的顾客编号 ' Dim intTag As Integer Dim minLength As
42、 Integer Dim minQueue As Integer Dim i As Integer Dim sinPayTime As Single minLength = 32767 'minLength=最小队长 minQueue = 0 '最小队列长的队列编号 For i = 0 To intQueueNum - 1 If intQueueLength(i) < minLength Then mi
43、nLength = intQueueLength(i) minQueue = i End If Next intQueuePosit(intNum) = intQueueLength(minQueue) ' 顾客排队位置为最小队列长度 If intQueueLength(minQueue) < maxLength Then '如果该队列长度小于矩阵宽度,则无须重新定义矩阵,直接进入队列,maxLength不变 intQueueSquare(minQ
44、ueue, minLength) = intCuNum intQueueLength(minQueue) = intQueueLength(minQueue) + 1 Else maxLength = maxLength + 1 '如果该队列长度=矩阵宽度,则重新定义排队矩阵 ReDim Preserve intQueueSquare(intQueueNum - 1, maxLength) intQueueSquare(minQueue, minLeng
45、th) = intCuNum intQueueLength(minQueue) = intQueueLength(minQueue) + 1 End If intCustomRow(intCuNum) = minQueue '排队的队列编号 If intQueueLength(minQueue) = 1 Then '如果队列中仅有当前一位顾客,则购物完毕直接进入付款事件 Select Case intPayCata Case 1
46、 sinPayTime = jyrandom(Val(jya3.Text), Val(jyb3.Text)) Case 2 sinPayTime = zsRandom(Val(zs3.Text)) Case 3 sinPayTime = ztRandom(Val(zta3.Text), Val(ztb3.Text)) Case 4
47、sinPayTime = bsrandom(Val(bs3.Text)) End Select sinStartPay(intCuNum) = sinCustomBuy(intCuNum) sinLeaveTime(intCuNum) = sinCustomBuy(intCuNum) + sinPayTime sinLeaveTimeTemp(intCuNum) = sinLeaveTime(intCuNum) sinCustomPayTime(intCuNum)
48、 sinPayTime sinLesTime(minQueue) = sinLesTime(minQueue) + nowTime - sinQueueTime(minQueue) '记录当前队列空闲时间 End If sinCustomBuyTemp(intCuNum) = sinCustomBuy(intCuNum) '顾客购物完毕进入付款队列 sinCustomBuy(intCuNum) = MAX End Sub '顾客付款 Private Sub Cust
49、omLeave(ByVal intCuNum As Integer) 'intCuNum 参数为当前付款顾客编号,intRow为正在付款顾客的队列序号 Dim sinPayTime As Single 'Paytime 为顾客付款时间 Dim i As Integer Dim intRow As Integer intRow = intCustomRow(intCuNum) Select Case intPayCata Case 1 sin
50、PayTime = jyrandom(Val(jya3.Text), Val(jyb3.Text)) Case 2 sinPayTime = zsRandom(Val(zs3.Text)) Case 3 sinPayTime = ztRandom(Val(zta3.Text), Val(ztb3.Text)) Case 4 sinPayTime = bsrandom(Val(bs3.Text)) E






