超市仿真系统说明书.doc_第1页
超市仿真系统说明书.doc_第2页
超市仿真系统说明书.doc_第3页
超市仿真系统说明书.doc_第4页
超市仿真系统说明书.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录1 仿真系统分析11.1 超级市场组成部分11.2 仿真目的11.3 系统组成12仿真系统设计42.1程序演示42.2程序源代码63运算及结果分析223.1 仿真类别223.2 系统系能测度的点估计223.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 FunctionEnd ModulePublic 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 SubEnd ClassPublic 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(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) End Select If intQueueLength(intRow) 1 Then sinStartPay(intQueueSquare(intRow, 1) = sinLeaveTime(intCuNum) 队列第一个顾客离去时间,即是下位顾客开始付款时间 sinLeaveTime(intQueueSquare(intRow, 1) = sinStartPay(intQueueSquare(intRow, 1) + sinPayTime sinCustomPayTime(intQueueSquare(intRow, 1) = sinPayTime End If If intQueueLength(intRow) = 1 Then 如果队列仅有1位顾客,则顾客离去后进入空闲 sinQueueTime(intRow) = sinLeaveTime(intCuNum) 队列空闲时刻 End If sinStartPayTemp(intCuNum) = sinStartPay(intCuNum) sinStartPay(intCuNum) = MAX sinLeaveTimeTemp(intCuNum) = sinLeaveTime(intCuNum) sinLeaveTime(intCuNum) = MAX For i = 1 To intQueueLength(intRow) 顾客离开队列 intQueueSquare(intRow, i - 1) = intQueueSquare(intRow, i) Next intQueueSquare(intRow, intQueueLength(intRow) - 1) = 0 intQueueLength(intRow) = intQueueLength(intRow) - 1 getendtime() End Sub 结果输出 Private Sub OutPut() Dim i As Integer For i = 1 To intNum f3.DataGridView1.Rows.Add() f3.DataGridView1.Rows(i - 1).Cells(0).Value = i f3.DataGridView1.Rows(i - 1).Cells(1).Value = SecondToHour(GetTolSeconds(Me.DateBeTime.Value) + sinCustomCome(i) If sinCustomBuyTemp(i) = 0 Then f3.DataGridView1.Rows(i - 1).Cells(2).Value = 未完成 Else f3.DataGridView1.Rows(i - 1).Cells(2).Value = sinCustomBuyTime(i) End If If sinStartPayTemp(i) = 0 Then f3.DataGridView1.Rows(i - 1).Cells(3).Value = 未完成 Else f3.DataGridView1.Rows(i - 1).Cells(3).Value = sinStartPayTemp(i) - sinCustomBuyTemp(i) End If If sinLeaveTimeTemp(i) = MAX Then f3.DataGridView1.Rows(i - 1).Cells(4).Value = 未完成 Else f3.DataGridView1.Rows(i - 1).Cells(4).Value = sinLeaveTimeTemp(i) - sinStartPayTemp(i) End If f3.DataGridView1.Rows(i - 1).Cells(5).Value = SecondToHour(GetTolSeconds(Me.DateBeTime.Value) + sinLeaveTimeTemp(i) f3.DataGridView1.Rows(i - 1).Cells(6).Value = intCustomRow(i) + 1 Next End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If TextBox1.Text = Then MsgBox(请输入完整的参数值) Return End If If R

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论