搜档网
当前位置:搜档网 › 电子书Arena仿真软件中文教程第十章节

电子书Arena仿真软件中文教程第十章节

电子书Arena仿真软件中文教程第十章节
电子书Arena仿真软件中文教程第十章节

第10章 Arena的集成和定制

本章我们将介绍Arena和其他应用程序的集成问题以及如何构建定制的Arena模块。我们将通过一个非常简单的呼叫中心的模型来阐述这些概念。

第一节介绍第一个主题,在这里我们设计了一个模型,从一个外部文件中将预定的到达时间读入模型,然后将性能测度数据写入一个文件中。这说明可以采用多种不同方法从外部数据源(如文本文件)将数据集成到Arena模型中来;第二节我们将介绍两种微软的Windows 操作系统技术,即ActiveX自动化技术和VBA(Visual Basic for Applications)技术。Arena 利用这些技术直接和其它程序集成。在这一节中我们还将介绍Arena是如何与VBA集成的。我们假定读者已经熟悉VBA编程,或者读者会通过学习其它有关资料来达到这一要求,本节的重点只是阐明在Arena中如何使用VBA;第三节介绍怎样使用这些技术来创建一个定制的用户界面;第四节继续讨论VBA,并对呼叫中心模型进行了扩充,使其能够纪录有关呼叫数据并且在微软的Excel中将呼叫周期信息用图像表示出来;最后一节即第五节我们将从整体上介绍如何设计读者自己的模块,从而增加Arena的标准建模结构。通过这一章的学习,读者将对Arena的核心特点有一个初步的了解,并且能够将Arena和其它桌面应用程序相集成,以及采取多种方式创建定制的Arena界面。

10.1 模型10-1:读写数据文件

我们先从一个非常简单的呼叫中心模型开始,然后在多个我们感兴趣的方面逐步对它进行扩展。我们的呼叫中心有一个随机产生的呼叫到达流和一个处理呼叫的事务中心,呼叫在经过事务中心处理之后即离开系统。呼叫中心经理估计,呼叫的到达服从均值为1.1的指数分布,呼叫的处理时间服从均值为0.75、最小值为0.3、最大值为1.1的三角分布。如图10-1所示,建立本系统的仿真模型,我们使用了一个Create模块、一个Process模块和一个Dispose 模块。

原书P401

图10-1. 简单的呼叫中心模型

这三个模块的数据如图10-2所示,仿真实验的参数通过菜单Run>Setup>Replication Parameters设置成图10-3所示。建好模型之后,我们就可以运行并察看仿真结果了。

原书P402

图10-2. Create、 Process和Dispose模块

原书P402

图10-3. 仿真实验参数

尽管这个呼叫中心模型很简单,我们依然可以使其更加符合实际。呼叫中心经理正好告知我们,他有某天呼叫到达时间的历史数据。那就让我们使用收到的这一段时间的实际呼叫记录来产生模型实体,而不是使用概率分布的抽样数据,这样可以更好地确认我们所构建的模型。通过这些实际数据驱动模型进行仿真运行,如果其仿真结果和那段时间系统的实际性能非常贴近,我们就可以更加相信该仿真模型的逻辑的正确性了。或者我们也可以使用同样的方法对具有特定到达模式的系统进行仿真运行,例如,卡车按照一个固定的但是不规则的日程时间安排到达一个分销中心的装载码头运送货物。

我们在10.1.1小节开始一个简单的实例,即从文本文件中读取实体到达数据;在10.1.2小节我们将介绍从其它数据源读取类似数据的方法。

10.1.1 模型10-2:从文本文件中读取实体的到达数据

为了对呼叫中心模型作这样的修改,我们需要一个包含所要研究时间段的到达时间数据的文件,用它来替换产生实体的模型逻辑。方便起见,假定仿真运行从第0分钟开始,我们构造了一个包含相应仿真时间值的ASCII类型的文本文件,该文件(Model 10-02 Input.txt)的前几个数值如图10-4所示。在这里我们不详细介绍这个ASCII文本文件是如何产生的。实际上,读者很可能会发现,读者所能获取的信息很难如此方便地存储起来,但是通过电子数据表格或者数据库软件的有效使用,通常读者还是能够将原始数据转化成可以直接用于仿真的值并导出到文本文件中。

原书P403

图10-4. 修改后的呼叫中心模型的呼叫时间数据

我们需要决定如何使用存储在文本文件中的历史数据,这涉及到两个方面的问题:一是将数据从文件传至模型的机制;二是如何使这些数据在适当的时间产生实体。我们先看看在适当的时间产生实体的逻辑,这包括当到达模型逻辑的相应部分时读取数据的细节问题。

到目前为止,我们都是用Create模块来产生实体,在仿真运行的整个过程都是基于间隔时间来产生新的实体。我们知道,手工仿真的(还记得第二章的有关内容吗?)每一个实体到达的时候,当前到达的实体都被送至模型中,而下一个到达的实体则被放入未来事件表以便在将来的某个适当时间到达,对话框中Time Between Arrivals项的数据决定了下一个实体到达的时刻,更一般的,这和概率分布的抽样结果有关。

然而,我们不能通过构造一个简单的Time Between Arrivals项的表达式来从我们的数据文件中建立呼叫的到达信息,相反的,如图10-5所示,我们将直接在模型中使用一个控制实体(control entity)来模仿当前到达和下一个到达的实体逻辑。

原书P404

图10-5. 从文件产生实体的逻辑图

如图10-6所示,Create模块只产生一个实体。对于这个Create模块,Arena只会在每次仿真实验开始时产生一个实体,然后就停止实体产生的流程,因为这已经达到了在Max Arrivals项设置的产生实体的最大数量(即1)。

产生的实体进入ReadWrite模块,如图10-7所示,从数据文件中读取下一个值并将它赋给实体属性Call Start Time。ReadWrite模块可以在高等运送面板中找到,它能从外部数据源读取一个或多个数值到Arena中,并且将这些值赋给模型变量。Arena的文件名Arrivals File 用作文件的模型标识符,这个名称千万别和存储在硬盘上(或者任何其它地方)的实际文件名混淆了,我们后面将介绍在File数据模块中定义这个实际的文件名称。

原书P404

图10-6. 修改后的Create模块

原书P405

图10-7. ReadWrite模块

实体从数据文件读取数值之后到达Delay模块(图10-8)等待Call Start Time长的时间,以使代表呼叫的实际实体能在适当的时间到达逻辑模型。由于数据文件中的数值代表从仿真运行开始后每一个呼叫的绝对时间而不是间隔时间,所以Delay Time项被赋值为Call Start Time - TNOW,这样实体将被延迟到存储在Call Start Time属性里的时间值。

原书P405

图10-8. Delay模块

当控制实体完成必要的延迟之后,即可产生实际的呼叫实体进入逻辑系统,基本操作面板中的Separate模块可以很好地满足这个需要,如图10-9所示。Separate模块一方面将控制实体(标有Original的模块退出点)传送回ReadWrite模块,再从数据文件中获取下一个呼叫时间;另一方面,Separate模块产生控制实体的一个副本,并通过标有Duplicate的退出点(如图10-5所示)将其传送至逻辑模型,这个复制实体代表一个新的呼叫,它将完成所有剩余的模型逻辑。

原书P406

图10-9. Separate模块

修改模型的最后工作就是要指定数据文件的必要信息,如图10-10所示,编辑高等操作面板中的File数据模块。当我们在ReadWrite模块的Arena File Name项中敲入Arrivals File 时,Arena将自动在File数据模块中产生一个相应的输入栏,我们在该输入栏的Operating System File Name项中输入Model 10-02 Input.txt,不管模型文件保存在什么地方,也不管ReadWrite模块什么时候引用Arena的Arrivals File,Arena都会去访问Model 10-02 Input.txt。读者也可以给出文件的完整路径,如C:\My Documents\Cool Stuff\Model 10-02 Input.txt,但是如果读者决定把这个模型和数据文件发给其他人,他们也必须有同样的文件夹结构,才能保证正确读取数据。File数据模块的其它选项都保留默认值,包括文件类型Free Format(表示Model 10-02 Input.txt文件包含文本值),以及end-of-file action选项也保留Dispose值,这样控制实体读完文件的最后一个值后就会离开系统,从而有效地终止模型的实体到达。

原书P407

图10-10. File数据模块

让我们使用图10-4的数据值来描述前两个呼叫的仿真逻辑,在仿真时刻0(即仿真实验开始的时刻),控制实体先读取一个值1.038并将其赋给Call Start Time属性,然后延迟(1.038-0)时间单位。在1.038时刻控制实体离开Delay模块,并产生一个副本进入Queue 模块开始呼叫的实际处理过程。控制实体返回ReadWrite模块,从数据文件中读取下一个值2.374并将其赋给Call Start Time属性,然后进入Delay模块,延迟(2.374-1.038=1.336)时间单位,Arena将在未来事件表中产生一个与控制实体有关的新的事件,该事件在未来的1.336个时间单位发生,即在实际的未来时刻2.374发生,该事件发生之后控制实体将到达Separate模块,在那里产生一个呼叫实体,该实体的Call Start Time属性值2.374表示第二个呼叫进入系统的时刻。当控制实体将Model 10-02 Input.txt文件的全部数据读取完成之后,这个过程即告结束。

有两个条件可以终止仿真的运行。第一,数据文件中列出的呼叫还没有发生完,如果仿真已经达到了Run Setup对话框中所设定的运行终止时间,Arena将在该时刻终止仿真运行,因为任何一个模型的运行时间都不可能超过事先设定好的仿真终止时间;第二,还没有达到事先设定好的仿真终止时刻,但是数据文件中列出的呼叫都已经产生,并且处理完成离开系

统,未来事件表变空,此时Arena就会在事先设定好的终止时刻之前停止仿真运行(还记得控制实体读取完数据文件的最后一个数据之后就离开系统吗?),因为在未来事件表中没有实体并且没有额外的基于时间的控制需要处理的时候,Arena将在最后一个实体离开模型之后终止仿真运行。

10.1.2 模型10-3和10-4:读和写Access和Excel文件

如果保存呼叫到达数据的不是文本文件,而是微软的Access数据库或者Excel电子表格,那该怎么办呢?下面的介绍将使读者认识到,在Arena中处理这些问题是很简单的。

首先假定保存呼叫到达信息的是Access数据库文件,并且相关数据存储在名叫Arrival Times的表中,图10-11显示了该文件(Model 10-03 Input.mdb)的前面一些数据值。

原书P408

图10-11. Access表中的呼叫时间数据

从上节我们建立的模型Model 10-02.doe开始,只需做少量的改动即可完成读取数据库的功能。读取和使用数据来控制实体产生过程的模型逻辑依然有用,我们只需改变获取数据的一些细节。

这次从描述新的数据文件开始。编辑高等操作面板中已经存在的File数据模块,如图10-12所示。保留Name项为Arrivals File,回顾一下,这项内容是在模型逻辑(本例中为ReadWrite模块)里用来标识文件的,没有必要改变它,但是我们必须将Operating System File Name项改为Model 10-03 Input.mdb1,而其它大多数选项都保留默认值,包括End of File Action的值Dispose,这就像以前一样,控制实体读完文件的最后一个值就离开仿真系统。

读者将注意到Access Type项有一个可供选择的下拉列表,在这里选择Microsoft Access (*.mdb),有关字段(列)和以前不一样了,这是因为读取数据库文件需要和文本文件不同的信息。特别是出现了一个标有初始值为0 rows的按钮,在该按钮上方有一个新的列,标

1使用扩展名为.mdb(Access文件的默认格式)的文件时请注意,不要和Arena模型重名。Arena自动将其输出信息保存在文件ModelName.mdb中(其中ModelName为Arena模型文件名称),任何同名的文件都将被其覆盖。

记为Recordsets,单击按钮打开如图10-13所示的记录集编辑器。

原书P409

图10-12. File数据模块

读取数据库的时候,其实是从表或行和列中读取记录的集合。一个数据库可能有多个不同的记录集,Arena通过定义Recordset Name来区分每一个记录集,每个Recordset Name 必须和数据库的一个表建立联系。读者可以选取任何合法的标识名称作为Recordset Name 的值,方便起见,我们在这里输入表名ArrivalTimes。单击Add/Update完成记录集的定义。单击Table Name下面的下拉列表框的箭头将显示数据库中当前定义好的所有表,本例中选择唯一的表ArrivalTimes,如图10-13所示。如果读者想浏览某个记录集的一些数据,请先在左栏中选定该记录集,然后单击View按钮,浏览之后单击Close按钮关闭浏览窗体。最后单击OK按钮退出记录集编辑器。

原书P409

图10-13. 记录集编辑器

读者可能想知道我们为什么要先改变文件属性,而不是先修改ReadWrite模块。如果现在打开ReadWrite模块(如图10-14所示),可以看到它有些不一样了,事实上,ReadWrite 模块将自动获取所读文件类型的有关信息,本例中,它判断出要读取数据库并且需要确定记录集。我们从下拉列表中选取ArrivalTimes,如果读者想控制每次循环要读取的记录,请在Record Number项输入一个任意的表达式,但我们在此保留其默认值,即不填写任何数据,这样系统将从第一条记录开始顺序读取。还记得我们不必改变Arena的File Name和Assignments项吧,所以单击OK按钮完成设置。

原书P410

图10-14. ReadWrite模块

就这样简单,一切就绪,保存读者最新创建的模型,或者在读者的CD上查找文件Model 10-03.doe,现在可以运行模型,从Access文件而不是文本文件中读取数据了。

如果读者从第一节开始一直跟着我们学习,现在应该就已经知道了读取Excel电子表格文件要做的大多数工作了。读者可能已经注意到Excel电子表格的行和列与数据库表的行和列非常相似,Excel不是关系数据库管理系统,但是很多地方我们都可以像处理Access数据库文件一样处理它。

在Excel里,一个矩形区域即单元格或行和列的集合等价于一个Access数据库表的行和列,如果我们想将其看作一个数据库(事实上我们在这里的确是这样处理的),命名的区域就必须包含至少两个单元格。读者可以通过选定单元格集合,然后选择菜单Insert->Name->Define,输入一个名字,来创建Excel的命名区域。例如,如果选定单元格A3到C9并且按照上述步骤进行,将工作簿选定区域命名为MyRange,读者将得到非常类似Access表的三行和七列,如图10-15所示。如果查看名称下拉列表(一般都在菜单工具栏的左上角处),可以看到已经定义好的所有单元格区域的名称,同样的,这些区域和Access 数据库表也是等价的。

原书P411

图10-15. Excel电子表格的呼叫数据

让我们重新开始刚刚在上面建立起来的模型Model 10-03.doe,把它修改成从Excel而不是Access中读取数据。提供的例子数据文件Model 10-03 Input.xls如图10-15所示,可以看到区域ArrivalTimes在名称框和工作簿里都被突出显示。如图10-16,我们仍然从描述现有的File数据模块中的新数据文件开始,除了更改File Name和Access Type两项以外,其余设置都可以保留和读取Access数据库文件一样,将Operating System File Name项改为Model 10-03 Input.xls,在Access Type下拉列表中选择Microsoft Excel (*.xls)。

再次单击Recordsets按钮显示记录集编辑器,定义好的记录集ArrivalTimes仍然存在,但是由于我们选择了一个新的文件,所以其链接已经删除了。选择左边定义好的记录集来恢复链接,Named Range底下的下拉列表将显示所有在Excel中定义好的命名区域,选定ArrivalTimes并单击Add/Update按钮保存修改。如果读者想查看记录集的一些例子数据,请先选定左栏中的记录集,然后单击View按钮,可以看到如图10-17所示的内容,单击Close 按钮关闭浏览窗体,最后单击OK按钮退出记录集编辑器。

原书P411

图10-16. File数据模块

原书P412

图10-17. 记录集编辑器

因为我们已经修改了Read/Write模块使其从ArrivalTimes纪录集中读取纪录,所以不必做其它额外的变动。现在可以运行模型,从Excel文件读取数据了。

既然已经懂得如何读取Access和Excel文件,接下来就准备向这些文件中写数据。这必须做一个修改,那就是在Read/Write模块的Type项中选择Write to File,而不是Read from File,其它项目和前面读取信息时保持一样。当然,写Access和Excel文件时,文件本身必须存在。微软的ADO(ActiveX Data Objects,ActiveX数据对象,对不同的数据源都有高效的数据访问能力)技术可以获取有关的文件结构和格式化信息。特别地,表和命名区域必须已经存在。对于Excel文件还有一个额外的限制,如果命名区域没有用初始数据格式化成数值类型,那么所有的数据都会当作字符串类型进行写入操作。要解决这个问题,最简单的方法就是在写入之前在命名区域中输入一些格式化的样本数据。如果读者想了解更详细的信息,请查阅Arena的帮助主题Excel: Read/Write Limitations Using ADO。

我们将对呼叫中心模型作最后一次扩充,使其能够在同一个Excel文件的不同工作簿中纪录处理时间信息。我们有一个新的数据文件Model 10-04 Call Data.xls,该文件包含和Model

10-03 Input.xls文件相同的信息,同时也包含一个新的区域ProcessTimes,该区域定义在一个新的工作簿OutputData中。ProcessTimes区域已经格式化成数值类型,并且其第一个单元格为0。我们在新的工作簿中添加了一个图形区域来说明进一步改进的可能性,尽管该图形现在是空白的,但是当数据写入工作簿时,就会自动在图形中显示出来。

首先,修改File数据模块,指定新的文件名,使用纪录集编辑器指定文件中的第二个区域。经过修改之后,有关模块如图10-18所示。

原书P413

图10-18. File数据模块和纪录集编辑器

我们需要调整仿真逻辑,以便呼叫处理完成之后能够将处理时间写入文件中。如图10-19所示,在呼叫终止前添加一个ReadWrite模块。

原书P413

图10-19. 写入处理时间数据的逻辑图

要读写同一个文件,指定ReadWrite模块的RecordSet ID项为ProcessTimes,要写的值是一个计算表达式,指定Assignments的Type项为Other,在Other项中输入处理时间的表达式TNOW-Call Start Time,如图10-20所示。

原书P414

图10-20. 在ReadWrite模块写入处理时间信息

现在可以进行仿真运行了,模型将和以前一样读取数据,但是每一个呼叫完成之后,它的处理时间都将写入OutputData工作簿,仿真运行终止时,该工作簿可能如图10-21所示。

原书P415

图10-21. 处理时间输出数据和图像

10.1.3 高级读写操作

如果数据总是以单一的形式出现,那么问题将变得非常简单,但是现实生活却很难如此,相反,我们通常获取的数据都不能立即满足需要。举一个简单的例子,包含冗余数据的文本文件,如图10-22所示。

原书P415

图10-22. 呼叫中心的改进模型的更多呼叫时间数据

这些数据粗略地看起来有些古怪,头两行好像都包含一个单词和两个数值,第三行好像包含一个单词和一个数值。但事实上除了1至8列包含的是描述信息以外,这个文件和图10-4所示的文件是完全一样的。我们必须使用格式化的方法来读取这种类型的文件,一个简单的手段就是修改10.1.1节我们建立的模型的File数据模块,在Access Type项选择Sequential File,对于Structure项,用FORTRAN或者C语言格式输入一段描述性文字,表示忽略前8列数据,从第9列开始读取数据,如图10-23所示。

原书P416

图10-23. 格式化数据的File模块

顺便提一下,如果读者的数据不是在表中的第一列时读者该怎么办?如果读者有修改文件的权限的话,一个很自然的选择就是定义区域或者表格使其恰好包含读者需要读取的数据。例如,如果读者的电子表格有一个从A列到C列的命名区域,但是读者只需要C列的数据,最好的方法就是对C列单独定义一个新的区域。不幸的是,很多情况下都不能修改源文件,此时最好的选择也许就是简单的读取并丢弃那些不相关的数据。读者可以定义一个临时变量然后将冗余数据读入其中。继续我们的例子,定义一个JunkValue变量,扩展Read 模块如图10-24所示,忽略区域中的头两列。

即便读者的数据存储在更加复杂的Excel或Access文件中也不必担心,当需要更加复杂的数据访问技术,或者数据来源于其它软件包时,微软提供了一套解决方案,即ADO。所幸的是,读者已经使用过ADO了,前述例子中用到的Excel和Access接口都是使用ADO 实现的,Arena做了大量的工作来使常用的任务变得更加简单。然而,如果读者碰巧遇到了一些更加复杂的情况,花点时间学习一下ADO技术还是非常值得的,我们并不想对ADO 做深入研究,而只是通过一些例子向读者展示一下ADO的魅力。

如果读者将File数据模块的Access Type项指定为Active Data Objects(ADO),就会出现一个新的字段(Connection String,连接字符串)。连接字符串是通过给定连接信息来定制ADO接口的,如指定连接所需的提供者、文件名和任何其它项目。假如读者要忽略对Excel 内建的支持,比如读者想支持列标题,所以读者要定制自己的数据连接。按照图10-25输入连接字符串,或者使用SQL Server驱动连接到服务器RSI-Joe上的数据库BizBikes,其连接字符串如图10-26所示。在这两个例子中,这些字符都应该当作一个连续的字符串在File数据模块的Connection String项中输入。

原书P417

图10-24. 忽略冗余数据的ReadWrite模块

原书P417

图10-25. 使用ADO标题的Excel

原书P417

图10-26. 使用ADO的SQL命令行

有一点很重要,文件的输入输出会影响执行速度,和其它处理任务比较起来显得更慢。许多情况下,数据访问数度慢点无关紧要,因为耗费在读写数据的时间相对于模型运行的时间而言通常是微乎其微的。但是当数据量很大时输入输出速度就显得异常重要了,此时读者可能想把数据变成速度尽可能快或容量尽可能小的形式,因为尽管ADO一般都简单易用而且柔性很好,但其执行速度却常常都是一个问题。二进制文件通常具有更快的速度并且占用更小的空间,它采用机器可读的形式存储数据,但是普通人不容易解读,因此如果人们要直接和数据交互时一般都不会选择二进制形式,然而如果只是在相同平台的程序之间传递数据,它将产生又小又利于读写的文件,对于容量很大访问频繁的文件,二进制形式是一个重要的选择。大多数计算机语言都支持对二进制文件的读写操作,读者甚至可以使用Arena 将文件一次性转换成二进制形式,然后在仿真运行和实验的过程中重复使用。

要实现这个目的,请在File数据模块的Access Type项中选择Sequential,在Structure 项中选择Unformatted。

10.2 Arena中的VBA

这一节我们将介绍有关Arena内嵌的VBA,借助这项技术可以撰写特定的程序代码来增强Arena的模型逻辑。10.3和10.4节将说明Arena和VBA具体如何协同工作。

10.2.1 ActiveX自动化技术和VBA概述

Arena利用两项微软的Windows技术来加强和桌面应用程序的集成。第一项就是ActiveX自动化技术,这项技术允许应用程序之间以及应用程序本身通过编程接口进行控制,它是Windows提供的隐藏框架,可以通过被设计使用ActiveX功能的编程语言如Visual Basic

进行访问。事实上,如果读者在Excel中使用过宏,读者就已经利用过这项技术了,只是可能读者没有意识到而已。Excel的宏用VBA代码格式存储,通过ActiveX接口使Excel应用程序完成一些特定的功能,如格式化单元格、改变公式或产生图表等。

应用程序所支持的方法类型是由对象模型定义的,程序设计者(如Excel和Arena的开发者)构建对象模型来提供接口,这样编程语言就可以使应用程序完成用户使用鼠标和键盘通常会进行的交互工作。对象模型包括:

?可控的应用程序对象列表(如Excel工作簿、图表、单元格);

?可被读取或修改的对象属性(如工作簿的名称、图表的标题、单元格的值);

?对象可接受或完成的方法(或称行动,如删除工作簿、创建图表、合并单元格)。

当读者安装包含对象模型的应用程序时,安装过程将在Windows操作系统中注册其对象模型(即将其添加到计算机的对象列表中)。当读者想使用编程语言来利用此应用程序的功能时,读者可以建立到其对象模型的引用,然后直接对该对象进行编程实现。我们将通过在Arena中编写VBA代码向Excel传送数据,从而展示上述方法的工作原理。许多应用程序都可以进行定制(即通过其它应用程序进行控制),包括Office、AutoCAD、Visio等等,读者可以使用C++、Visual Basic或者Java等编程语言创建程序来达到控制的目的。

Arena进行应用集成的第二项技术就是其内嵌的VBA,通过它可以不用购买或安装单独的编程语言即可编写代码来控制其它应用程序。VBA是Office、AutoCAD和Arena通用的语言,它也是Visual Basic的内在引擎。当读者安装Arena的同时就安装了完整的Visual Basic编程环境,读者可以通过菜单Tools->Macro->Show Visual Basic Editor进行访问。

这两项技术协同工作,使Arena能够集成其它支持ActiveX自动化的应用程序。读者可以直接在Arena中编写Visual Basic代码(通过Visual Basic Editor)来定制其它程序,如Excel、AutoCAD或者Visio等。在我们改进的呼叫中心模型中,我们将创建一个新的工作簿,在仿真过程中向该工作簿填充数据,并且自动用图形的方式显示数据,所有的操作都不直接接触Excel本身。读者也可以编写VBA代码来定制Arena,如添加动化变量、获取仿真输出统计值、更改模块操作数的值等等。

当读者在Arena中用VBA编写Visual Basic代码时,读者的代码将存储在Arena模型文件(.doe)中,就像Excel的VBA宏存储在电子表格(.xls)文件中一样。读者可以使用VBA 的所有功能,包括:

?Visual Basic的程序结构,如Sub、Function、Class、If、Elseif、Endif、While、Wend、

Do、On Error、Select Case等;

?包含各类控件(如toggle按钮、滚动条、输入框、命令按钮、一直很流行的spin按钮

等)的用户窗体(通常指对话框);

?代码调试工具,如追踪、断点和各种单步调试选项;

?全面的帮助信息

要在Arena中打开Visual Basic Editor,请选择菜单Tools->Macro->Show Visual Basic

Editor,或者在Integration工具栏上单击相应的按钮(),这将打开一个独立的窗体,包含VBA代码、窗体、调试接口和帮助等,如图10-27所示。

原书P420

图10-27. Visual Basic编辑器窗体

Visual Basic编辑器窗体是Arena的子窗体,当读者退出Arena时,它将随着父窗体自动关闭。而且Arena窗体中的改变,如打开一个新的模型,Visual Basic编辑器窗体中的信息也会发生相应的变化,这种关系影响着VBA(集成在如Arena的宿主程序中,VBA代码隶属于模型文件,而且只有宿主程序可以访问)的架构。

10.2.2 内置的Arena VBA事件

Visual Basic编辑器窗体左侧的项目面板显示了打开的模型列表,每一个模型都包含一个Arena Objects列表,其中有一个叫做ThisDocument的单一的条目,ThisDocument对象赋予VBA项目对Arena模型各类事件的访问权限。要为事件程序添加代码,请在Visual Basic 编辑器中选择ModelLogic对象,然后在右侧的程序列表中选择所需的事件,如RunBegin事件。

Arena内置的VBA事件主要可以分为三类。(实际的函数名称都有前缀ModelLogic_,如ModelLogic_DocumentOpen。)

?运行前事件,如DocumentOpen,DocumentSave;

?Arena触发的运行事件,如RunBegin,RunBeginSimulation,RunEndReplication;

?模型/用户触发的运行事件,如UserFunction,VBA_Block_Fire,OnKeystroke

程序列表中显示的事件提供了触发VBA代码的所有位置集合,因此,读者面临的第一个问题就是决定使用什么事件,使读者的代码能够在适当的时候被触发来完成所需要的任务。运行前事件如DocumentOpen和DocumentSave,使VBA代码能够在特定的用户操作(如打开和保存模型)下执行。然而,Arena的VBA事件大多是为仿真运行提供支持的,只要读者开始运行仿真程序(如选择菜单Run->Go),一系列的Arena操作和VBA事件就会出现,如图10-28所示。

原书P421

图10-28. 仿真运行的VBA事件

当仿真运行开始、完成和终止的时候,Arena自动调用每一个相应的事件(如图10-28中粗体所示)。如果事件中没有VBA代码,Arena将不采取任何特殊操作,就好像这些事件并不存在一样;如果读者打开Visual Basic编辑器并在有关事件中输入VBA代码,Arena就会在运行时执行这些代码,我们将在接下来的两节中给读者展示这方面的内容。

图10-28同时指出上述事件调用的一个重要问题,即不同仿真时间阶段VBA代码可以访问的数据是不一样的。当读者编辑Arena模型时,仿真变量、计数器、统计量等通过读者输入的模块信息被定义成模型结构的一部分,但是它们还没有实际的值(如还没有平均排队数,没有资源状态等)。因此,当模型处于编辑状态时,只能访问模块操作数(模块对话框和表格单元格的字段)的值。在模型10-5中,我们将通过这个方法修改两个Create模块的Max Arrivals字段的值。

当读者开始仿真运行时,Arena检测并初始化模型,将模块中的有关信息转换成仿真运行所要求的格式,并且将模型置于运行状态。在仿真运行过程中,可以通过Arena的仿真控制器和VBA代码,检查和更改变量值、资源状态、统计量等,如模型10-6所述,将运行的统计值传入Excel中。运行终止时,Arena释放有关仿真运行信息并且将模型重置为编辑状态。

回到Arena的内置事件,我们将简要地介绍一下图10-28中的每一步,其中粗体部分代表Arena可以访问的VBA事件,斜体部分简单地描述了Arena的运行过程。

1.调用ModelLogic_RunBegin

此时VBA代码可以修改模型的结构化数据,即模块操作数的值,并且其更改将应用于仿真的运行过程,但是,RunBegin事件不能直接更改仿真运行期的值,如变量、实体属性等,因为此时仿真还没有初始化。读者可以通过这个事件来覆盖存储在模块中的一些输入值(如Decide模块的概率)。接下来的模型10-5说明了RunBegin 事件的有关应用。

2. Arena检测模型并将仿真初始化为运行状态

这个过程在后台进行,Arena验证模型是否准备运行。检测并初始化模型之后,Arena忽略模块本身所包含的数据,取而代之的是随着仿真运行开始之后动态变化的实时仿真数据,此时所有的变量都被赋予了初始值(如读者在变量表格中输入的数值),资源也被赋予了初始的加工能力,但是还没有实体进入模型。

3.调用ModelLogic_RunBeginSimulation

读者在这里插入的代码只会在仿真运行的开始执行一次(当然,如果Arena在第二步中检测到模型包含错误,就不会调用这个事件了,读者首先得改正错误使Arena能够初始化)。当Arena执行完成RunBeginSimulation事件中的VBA代码之后,仿真运行才会继续开始,因此可以在此处从外部数据源如Excel、Access或Oracle 中安全地载入大量数据;显示一个用户窗体来获取有用信息,如仿真运行要做多少次实验(一次仿真运行[Simulation]可以包含多次仿真实验[Replication]),或者将详细的仿真结果存储在Excel文件中(如模型10-6所示),让用户设置文件的表头信息。

尽管读者也可以创建实体、改变资源能力、或者更改许多其它内容(如果读者已经对Arena的对象模型进行了深入研究)。执行完成RunBeginSimulation事件中的VBA 代码之后,Arena将进入下一步。

4.调用ModelLogic_RunBeginReplication

Arena在仿真运行的每一次实验之前(即实体进入模型之前)都会调用RunBeginReplication事件,此处可以完成的任务与RunBeginSimulation类似,只是在每一次仿真实验之前都会重复执行,模型10-6将展示如何使这两个事件协同工作。

5. Arena仿真运行

紧接着,模型正式运行,这一步将会产生并释放实体、获取和释放资源等等,读者在前几章中学到的内容都可以在这里派上用场。在仿真运行的过程中,Arena 还提供了很多接口触发VBA代码,如:

ModelLogic_UserFunction—在Arena逻辑中引用UF变量即可触发该事件,

用于完成诸如过程延迟或者决策标准的复杂计算;

?ModelLogic_VBA_Block_Fire—模型逻辑中实体经过VBA模块(位于Blocks

面板)时即可触发该事件,在模型10-6中,当实体离开模型时,用此事件

将一些详细信息写入Excel文件中;

?ModelLogic_OnKeystroke—仿真运行过程中用户按键时即可触发该事件,例

如,当按数字键1时可以通过VBA代码显示一个用户窗体来总结模型的状

态;

?ModelLogic_OnClearStatistics—当清空统计信息时(如仿真时钟达到Run

Setup对话框所设置的预热期的时间值)即可触发该事件,用于设置模型变

量,或者在模型中传送一个实体激发特定的逻辑以便对标准的Arena统计初

始化功能进行扩充;

6.当一次仿真实验结束时调用ModelLogic_RunEndReplication

此事件主要用于将一些总结信息写入外部文件,或者增加一些全局变量等。请注意,该事件只在一次仿真实验结束时调用,如果其它原因导致仿真运行停止(如用户在Run工具栏上单击End按钮),则不会触发该事件。

7.调用ModelLogic_RunEndSimulation

不管Arena仿真运行如何终止,此事件中的VBA代码都会被执行。调用RunEndSimulation时,运行期的仿真数据仍然可用,因此可以在此添加VBA代码访问最终的统计值、资源状态等。典型的应用如将定制的统计信息写入文件、电子表格和数据库中,或者关闭文件,显示运行结束的有关消息等。

8. Arena终止仿真运行

这和第二步相对应,Arena清除所有的运行期仿真数据并且将模型设置为编辑状态。

9.调用ModelLogic_RunEnd

最后,和第一步的RunBegin事件相对应,Arena调用RunEnd事件。该事件中的VBA代码不能访问刚刚完成的仿真运行中的任何信息(因为第八步已经清除了这些信息),但是可以访问所有其它的VBA函数。如果读者愿意,可以在此显示一个用户窗体询问是否要再次进行仿真,如果是的话,我们可以自动地返回第一步重新开始整个仿真过程。

10.2.3 Arena对象模型

读者确定在哪里撰写VBA代码之后,很可能就要从Arena中获取信息了。对象模型(又称为类库)提供了对象列表以及读者可以在代码中使用的对象的属性和方法,读者需要通过代码从Arena中获取的所有信息,以及读者需要通过代码使Arena完成的所有操作,都可以使用Arena对象模型中的元素来实现。

一个对象就是一个读者能从代码中控制的条目,它的特点即属性,可以在VBA中进行检测,许多属性也可以通过代码进行改变。对象属性的例子包括:矩形、多边形等的线条颜色、位置(水平位置x和垂直位置y),以及动画对象如站点和队列等的标志符,等等。大多数对象还包含方法,可以用来完成一定的操作,例如激活一个窗体或者产生一个新的多边形等。同时,多数对象可以组成集合,一个集合通常包含一个或者多个相同类型的对象,例如,Arena对象库中有一个Modules集合,它包含一个子模型窗体中的所有Module实例(类型为Module的对象)。

如果读者想浏览对象库,VBA提供了一个手动的浏览器,可以在Visual Basic编辑器窗体中选择菜单View->Object Browser,或者按F2键,打开对象浏览器。通过对象浏览器,读者可以在对象库中导航,浏览对象以及它们的属性和方法。图10-29显示了通过对象浏览器在Arena对象库中查看StatusVariables集合对象及其Create方法。

原书P424

图10-29. VBA对象浏览器

Arena对象模型包含如下对象分类:

?模型窗体(Model-widow)对象——所有可以放置在Arena模型窗体中或者能够通过其

电子表格查看的项目。模块、集合、线条、多边形、文本、动画对象以及和交互有关的对象如命名视图等等,都属于模型-窗体对象;

?SIMAN对象—一类特殊的对象类型,通过它可以访问仿真运行时的信息,如变量值、

资源能力、队列长度和当前的仿真时钟等等;

?结构(Structural)对象——用于访问一般的Arena函数,如Application、Module Definition

和Panel对象等。

当读者撰写代码来进行通常的交互(即通过鼠标和键盘完成)时,大多都是协同模型-窗体类对象工作,这些对象构成了对象库中的大部分,因为Arena提供了大量对象使读者在模型中进行工作。

例如,图10-30所示代码向模型中添加10个动画变量,代码中引用的第一个对象变量叫做oModel,它被声明为Arena.Model类型,表明它来自Arena对象模型类库,并且为Model 类型(我们用小写的‘o’作为变量名称前缀,表明它是对象变量,以便和整型或其它类型的变量区分开来)。Arena对象模型提供了一个特殊对象即ThisDocument,其属性Model表示当前模型,我们将该属性赋值给oModel变量,使其指代包含VBA代码的模型窗体。然后,在循环中通过使用StatusVariables集合的Create方法添加一个新的动画变量,该方法包含许多参数,用于建立WIP(1)至WIP(10)的变量标志符,连接“WIP(”、循环变量i和“)”形成变量名称,还有位置、大小、文本等信息。

原书P425

图10-30. 生成10个状态变量的示例代码

对象库的第二个主要内容就是重要的对象类型SIMAN,它包含在Model对象里,提供接口用于访问正在运行的仿真模型的所有信息,使用SIMAN对象的属性,VBA代码几乎可以找到任何仿真的东西。在浏览器中单击SIMAN对象,可以按照需要查看到SIMAN丰富的函数列表。

图10-31所示的一段代码显示了如何获取用户输入的变量值(在Visual Basic中使用InputBox函数),然后将该值赋给模型变量Mean Cycle Time。InputBox中输入的结果存储在一个局部字符串变量sNewValue中,然后设置oSIMAN变量指向ThisDocument.Model的SIMAN对象(SIMAN是运行Arena模型的仿真引擎),我们想在运行的仿真模型中获取或改变任何信息都可以使用oSIMAN变量完成。最后两行代码将输入值赋给变量。首先用SymbolNumber函数将变量名转换成SIMAN引擎所使用的内部索引,最后,VariableArrayValue属性被更改为在InputBox中输入的任何结果。

第5章 Arena概述与仿真建模基本操作16

第5章Arena建模基本操作 5.1 Arena建模概述 5.1.1Arena功能与特点 Arena是一种支持用于离散事件仿真可视化交互式仿真软件(VIS)。应用Arena,用户可以交互地建立模型,创建系统的动画,运行仿真器,收集仿真输出的数据,创建查看需要的统计报告。Arena还包括输入分析器,它是一个输入数据分析的工具。 用流程图将系统表示成实体相关活动的逻辑网络。 Arena通过完整层次化结构(hierarchical)保持了建模的灵活性。Arena支持分层建模,即一些模型元素可以代表一个下层模型;下层模型可以包含更深一层的模型。分层建模可以将复杂的模型分解成更小更容易理解的模型单元。

5.1 Arena建模概述 5.1.1Arena功能与特点 提供了13个(Arena10.0)建模模板(Template),每个模板中提供了许多用于图形仿真建模与分析的模块(Module),将这些模块组合起来就能构建出各种不同的仿真模型(Model)。 为了便于组织和显示,各模块按类型组合在一个面板(Panel)中构成模板。通过面板间的切换,可以很方便地找到所有的仿真建模构件集。不同模板的面板中的模块可以在同一个模型中混合使用。 Arena是与微软Office兼容的产品,它的工具栏和菜单栏与Office是类似的。同时Arena使用网络化多媒体动画技术(OLE 动画)和VBA视窗技术与桌面应用程序的整合。嵌入在流程导航工具Visio里的接口使得用Visio画的流程图可以自动导入Arena中。 5.1 Arena建模概述 5.1.1Arena功能与特点 Arena应用领域 ?物流领域,Arena的应用涉及从供应商到客户的整个供应链,包括供应 商管理、库存管理、制造过程、分销物流、配送中心选址规划/商务过 程以及客户服务等。 ?制造过程仿真: ①生产过程中的工艺过程计划、设备布置等; ②生产管理中的生产计划、库存管理; ③制造过程的经济性、风险性分析,辅助企业投资决策; ④各种先进制造模式如虚拟组织及敏捷供应链管理的可视化仿真等。?服务系统应用,Arena常用来进行医疗系统的医院临床设备、医生、护 士的配备方案选择和医疗改善等;交通运输中的高速公路的交通控制, 出租车的管理和路线控制,港口运输计划模型,车辆调度;公共服务的 紧急救援系统等。

Arena软件仿真案例两则

1.某企业平均每隔0.5小时收到一个客户订单,客户订购的数量有10%的可能 性是1件,30%的可能性是2件,40%的可能性是3件,20%的可能性是4件。企业在收到顾客订单后,首先检查现有库存是否能满足顾客订单的需求。 如果库存数量大于或等于顾客订单订货数量,则直接向顾客交付货物。如果库存数量小于顾客订单订购数量,有25%的顾客愿意选择继续等待,而其他顾客则会选择其他企业另行购买。这些选择继续等待的顾客中,最短的在等待1小时后向企业查询是否到货,最长的在等待48小时后向企业查询是否到货,而大多数顾客会在等待24小时后向企业查询是否到货。如再次查询仍未到货,这些顾客有75%的可能选择其他企业另行购买。 该企业对该产品的库存控制设有最大和最小值。该企业的仓库管理员每隔1小时检查一次该商品的库存情况,如果该商品库存低于最低的安全库存,则向供应商发出采购订单,订购数量是当前库存水平到该商品最大库存之差。 采购订单发出后,会在96小时后收到供应商送货。该企业现有该商品库存500件,该商品向供应商采购单价为380元/件,该商品的天库存持有成本为采购单件的0.05%,每件商品的缺货成本是10元,每次订货成本是3000元。 问:对于表1所示的几种库存控制的方案,以30天为限,哪种从成本上是最优的? 表1 不同的库存控制方案 方案 1 2 3 4 5 最大值2000 1200 1000 1800 1500 最小值300 320 280 250 500

2.一个小型的配送中转系统有3个运入站和4个运出站,卡车以时间间隔UNIF (35,55)到达3个运入站中的一个,每辆卡车包含的托盘数为UNIF(15,30),假设卸载时间为0。每个托盘以相同的概率被送至其中一个运出站,站前的运输由3个叉车来完成,叉车的运送速度为每分钟60英尺。假设任意一对运入站和运出站之间的距离均为50英尺,同时假设相邻的运入站之间或相邻的运出站之间的距离为15英尺。 (1)建立以上问题的仿真模型。如果没有新的运送请求,假设叉车停留在最后卸载的地方。 (2)修改模型,使空叉车都返回到中间的运入站(运入站2)等待下一次装运。 (3)修改模型,为每个运入站分配一辆叉车,当没有运送请求时,叉车都返回到所分配的运入站区。 将托盘的系统逗留时间作为主要性能指标,比较以上三种系统的结果。要使用恰当的统计分析来支持你的结论。

arena仿真详细教程

Arena仿真中文教程 目录

第一章:基础知识 本节介绍安装到硬盘上以后如何创建Arena的工作环境。 的安装和调试 的安装同一般的软件类似,打开disk1文件夹,双击应用文件运行安装程序,设置好安装路径后开始安装,安装结束后点击Finish完成安装。 如果是在Windows98操作系统下安装需要在安装前预装Visual Basic ,否则,不能运行。 的面板、菜单和工具栏 1.2.1 A的启动 在Arena安装完成后,Arena会在桌面上自动生成快捷方式的图标,双击图标即可进入Arena界面;同时,也可以在硬盘上的Arena\目录下双击文件进入。 在进入Arena后点击工具栏上的新建图标,打开的操作桌面(Desktop),如图1-1:

图1-1 1.2.2 Desktop操作桌面简介 1.操作桌面的结构 Arena提供了十分方便的操作桌面以保证用户能够快速、简洁的建立仿真模型。 Arena的操作桌面主要由工具栏(Toolbars)、菜单栏、状态栏(Status bar)、建模界面组成。下文对这几部分的主要功能将一一介绍。 2、工具栏:工具栏集中了我们建立仿真模型所要用到的主要工具,它由Standard(标 准工具栏)、(视图工具栏)等组成,下面将注意介绍: Standard:这个工具栏提供了新建、保存和打印等功能,如图1-2: 图 1-2 View:提供了视图功能,用户对建模区进行视图操作如图1-3: 图 1-3 其中经常用到的功能有: Zoom in:放大 Zoom out:缩小 View All:建模区全部视图,即,以建立模型的全部视图。 View Previous:当前视图的前一视图。 View Region:选择视图区域。 Arrange:为了用户能够创建生动、形象的动画,提供了功能齐全的绘图工具,Arrange工具栏(图1-4)就是为Arena的绘图提供支持的。 图1-4 它主要的功能有:

Arena仿真教程

离散时间系统仿真 第一章:Arena3.0基础知识 本节介绍Arena3.0安装到硬盘上以后如何创建Arena的工作环境。 1.1 Arena3.0的安装和调试 Arena3.0的安装同一般的软件类似,打开disk1文件夹,双击应用文件Setup.exe运行安装程序,设置好安装路径后开始安装,安装结束后点击Finish完成安装。 如果是在Windows98操作系统下安装Arena3.0需要在安装前预装Visual Basic 6.0,否则,Arena3.0不能运行。 1.2 Arena3.0的面板、菜单和工具栏 1.2.1 Arena3.0的启动 在Arena安装完成后,Arena会在桌面上自动生成快捷方式的图标,双击图标即可进入Arena界面;同时,也可以在硬盘上的Arena\目录下双击Arena.exe文件进入。 在进入Arena后点击工具栏上的新建图标,打开Arena3.0的操作桌面(Desktop),如图1-1: 图1-1

1.2.2 Desktop操作桌面简介 1.操作桌面的结构 Arena提供了十分方便的操作桌面以保证用户能够快速、简洁的建立仿真模型。 Arena的操作桌面主要由工具栏(Toolbars)、菜单栏、状态栏(Status bar)、建模界面组成。下文对这几部分的主要功能将一一介绍。 2、工具栏:工具栏集中了我们建立仿真模型所要用到的主要工具,它由Standard(标 准工具栏)、(视图工具栏)等组成,下面将注意介绍: z Standard:这个工具栏提供了新建、保存和打印等功能,如图1-2: 图 1-2 z View:提供了视图功能,用户对建模区进行视图操作如图1-3: 图 1-3 其中经常用到的功能有: Zoom in:放大 Zoom out:缩小 View All:建模区全部视图,即,以建立模型的全部视图。 View Previous:当前视图的前一视图。 View Region:选择视图区域。 z Arrange:Arena3.0为了用户能够创建生动、形象的动画,提供了功能齐全的 绘图工具,Arrange工具栏(图1-4)就是为Arena的绘图提供支持的。 图1-4 它主要的功能有: Bring to front:移到最上 Send to back:移到最下 Group:合并 Ungroup:取消合并 Vertical Flip:垂直对齐 Horizontal Flip:水平对齐

相关主题