资源描述
目录
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)每个收银台每次只能为一位顾客服务。
(3)顾客到达后,通过入口进入售货区选购商品,选购完毕,便到收银台付款。
(4)如收银台空闲,顾客可立刻接受服务。如收银台不空,则他选择最短队列排队。先到先服务。
(5)付款完毕顾客便离开收银台,通过出口离去。离开收银台到出口这段时间忽略。
(6)收款员连续工作,不考虑中断的情况。
1.2 仿真目的
假设我们对该超市系统进行仿真分析的主要目的是要对该超市收银台的配置进行优化分析。因此,数量指标的定义如下。
(1)排队时间:即一个顾客在收银台前排队等待收款的时间;
(2)付款时间:即一个顾客付款所用的时间;
(3)逗留时间:即顾客在系统内经过的总时间,对超级市场来说,购物时间、付款时间与排队时间三者之和等于逗留时间。
根据上述数量指标,可进一步明确仿真目的就是要得到平均排队时间、平均逗留时间、最大排队长度和收银台利用率等数量指标。
1.3 系统建模
(1)系统组成
根据仿真的目的,将此系统分为入口、售货区、收银台和出口四个部分。
(2)描述变量
1) 描述入口:,表示顾客在时刻到达入口,为随机变量。
2) 描述售货区:,表示在售货区内有顾客,将分别于时刻购物完毕,为随机变量。
3) 描述收款台:,表示收款台前排队情况,且顾客先结账,次之,以此类推;表示正在结账的顾客将于时刻结账完毕而离去,为随机变量。
(3)相互关系
1) 顾客到达时刻:。为顾客选购商品时间,为随机变量;当顾客到达服从强度为的负指数分布到达时,,为上均匀分布随机数。
2) 购货完毕时刻:。为顾客选购商品的时间,为随机变量。
3) 结账结束时刻:。为服务时间,为随机变量。当队长时等于前一个顾客的结账时刻;当时,。
(4)状态转移函数
式中,表示系统下一个状态由顾客到达事件触发;表示系统下一个状态由顾客选购商品完毕事件触发;表示系统下一个状态由顾客结账完毕事件触发。
(4)仿真流程
2 仿真系统设计
2.1 程序演示
打开程序后,首先后出现一个欢迎界面。这个界面由一个Timer控制,3秒后自动跳转参数设置界面。
在参数设置界面,用户可以对顾客到达分布模型、顾客购物分布模型、顾客付款分布模型进行设置。程序共提供四种模型,分别是:均匀分布、指数分布、正态分布、泊松分布。下面对四种分布函数介绍。
均匀分布密度函数:
指数分布密度函数:
正态分布密度函数:
泊松分布密度函数:
点击“开始仿真”后,会对顾客的一系列行为进行模拟。转到流程界面。由于数目较多,可能会有一定的运行时间,请耐心等待。
点击“查看结果分析”可看到超市仿真结果分析。会显示系统总人数、系统总时长、平均排队长度、最大排队时间、服务台空闲时间、最大排队长度、平均逗留时间、平均等待时间、收银台利用率等指标。
2.2 程序源代码
Module 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 - 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 + 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
'生成泊松分布随机数
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 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 Class Form2
'参数定义
Public intNum As Integer '顾客总人数
Public intBeCata As Integer '到达时间分布类型
Public intBuyCata As Integer '购物时间分布类型
Public intPayCata As Integer '付款时间分布类型
Public intQueueNum As Integer '服务台数
Public maxLength 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 '顾客到达时刻
Private sinCustomComeTemp() As Long
Private sinCustomBuy() As Long '顾客购物完毕时刻
Private sinCustomBuyTime() As Long '顾客选购时间
Private sinCustomBuyTemp() As Long '选购临时变量
Private intQueueSquare(,) As Long '顾客排队队列矩阵顾客编号
Private sinStartPay() As Long '开始付款时刻
Private sinStartPayTemp() As Single '付款临时变量
Private sinLeaveTime() As Long '顾客离去时刻
Private sinLeaveTimeTemp() As Single '离去临时变量
Private sinCustomPayTime() As Single '付款时间
Private intQueueLength() As Long '顾客队列长度
Private intCustomRow() As Long '顾客所在队列序号
Private intQueuePosit() As Long '顾客所在队列位置
Private sinLesTime() As Single '顾客空闲时间
Private sinCustomWait As Single '顾客等待时间
Private intCustomWaitNum As Integer '排队人数
Private sinCustomIn As Single '顾客等待时间
Private intCustomInNum As Integer '当前顾客人数
Private sinCustomQtime As Single '顾客排队加付款时间
Private intCustomQNum As Integer '
Private sinQueueLeis() As Single '服务台空闲时间
Private sinQueueTime() As Single '
Const MAX = 100000000.0#
Private 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 sinCustomBuy(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 sinCustomBuyTemp(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
sinLesTime(i) = 0
Next
maxQTime = 0
sinCustomWait = 0
intCustomWaitNum = 0
sinCustomIn = 0
intCustomInNum = 0
sinCustomQtime = 0
intCustomQNum = 0
sinCustomComeTemp(0) = 0
sinCustomCome(0) = 0
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()
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
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
intBuyCata = 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
intPayCata = 2
ElseIf RadioButton10.Checked = True Then
intPayCata = 3
ElseIf RadioButton9.Checked = True Then
intPayCata = 4
Else
MsgBox("请选择顾客付款分布模型")
Exit Sub
End If
End Sub
'顾客到达
Private 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 sinCustomBuyTemp(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)
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))
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))
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) = sinBuyTime '顾客购货时间
sinCustomCome(intNum) = sinComeTime + sinCustomCome(intNum - 1) '生成下位顾客到达时间
sinCustomComeTemp(intNum) = sinCustomCome(intNum)
sinCustomBuy(intNum) = sinBuyTime + sinCustomCome(intNum) '顾客购物完毕时间
sinStartPay(intNum) = MAX
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
'获取仿真总时长
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
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
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 = 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 Sub
'事件选择
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)
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
Next
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 '取得离当前系统时针最近的事件
ChooseEvent = 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)
ChooseEvent = 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 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
minLength = intQueueLength(i)
minQueue = i
End If
Next
intQueuePosit(intNum) = intQueueLength(minQueue) ' 顾客排队位置为最小队列长度
If intQueueLength(minQueue) < maxLength Then '如果该队列长度小于矩阵宽度,则无须重新定义矩阵,直接进入队列,maxLength不变
intQueueSquare(minQueue, minLength) = intCuNum
intQueueLength(minQueue) = intQueueLength(minQueue) + 1
Else
maxLength = maxLength + 1 '如果该队列长度=矩阵宽度,则重新定义排队矩阵
ReDim Preserve intQueueSquare(intQueueNum - 1, maxLength)
intQueueSquare(minQueue, minLength) = intCuNum
intQueueLength(minQueue) = intQueueLength(minQueue) + 1
End If
intCustomRow(intCuNum) = minQueue '排队的队列编号
If intQueueLength(minQueue) = 1 Then '如果队列中仅有当前一位顾客,则购物完毕直接进入付款事件
Select Case intPayCata
Case 1
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
sinPayTime = bsrandom(Val(bs3.Text))
End Select
sinStartPay(intCuNum) = sinCustomBuy(intCuNum)
sinLeaveTime(intCuNum) = sinCustomBuy(intCuNum) + sinPayTime
sinLeaveTimeTemp(intCuNum) = sinLeaveTime(intCuNum)
sinCustomPayTime(intCuNum) = sinPayTime
sinLesTime(minQueue) = sinLesTime(minQueue) + nowTime - sinQueueTime(minQueue) '记录当前队列空闲时间
End If
sinCustomBuyTemp(intCuNum) = sinCustomBuy(intCuNum) '顾客购物完毕进入付款队列
sinCustomBuy(intCuNum) = MAX
End Sub
'顾客付款
Private Sub CustomLeave(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
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
sinPayTime = bsrandom(Val(bs3.Text))
E
展开阅读全文