Simulation with Arena( 中文)第7章.doc_第1页
Simulation with Arena( 中文)第7章.doc_第2页
Simulation with Arena( 中文)第7章.doc_第3页
Simulation with Arena( 中文)第7章.doc_第4页
Simulation with Arena( 中文)第7章.doc_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

第7章 中级建模与稳态统计分析在第四章和第五章中介绍了许多利用Arena建模的基本元素,基本操作面板和高等操作面板中的一些基本用法,以及对实体流动的控制,包括资源的调度(Schedules)和状态(States)、集合(Sets)、变量(Variables)、表达式(Expressions)、站(Stations)、运送工具(Transfers ),以及增强动画效果等。在这一章里,我们先介绍几个概念,通过这些概念读者可以构建更加详细的模型,然后我们在这些概念的基础上展开本章的内容。像前面的章节一样,我们将通过一些精心设计的例子来阐明这些具体的细节。首先在7.1节中介绍一个新的实例;在7.1.1节中讨论Arena中因实体而异的加工序列(Sequences)的概念;在7.1.2节中讨论对一个系统建模的一般流程,和对一个项目建模所应达到的详细程度,以及对数据的要求及其可用性,并在7.1.3节讨论建模所需的数据部分; 7.1.4节中讨论模型的逻辑部分。7.1.5节中将引入动画,包括导入已有的CAD图形作为场景布局。7.1.6节讨论如何验证所建立的Arena模型反应了你所需要解决的问题。然后在7.2节中继续讨论输出数据的统计分析,这次我们将用7.1节中所建立的模型做稳态仿真输出分析。当读者已经阅读和消化了本章的材料后,对于如何考虑在很多细节上的建模就有了比较清晰地认识,并且能够学会如何通过长时间运行来对系统的稳态性能加以分析。7.1 模型7-1:一个小型制造系统图7-1描述了一个小型制造系统,包括零件到达系统,四个制造单元(Cell 1、2、3、4),以及零件离开系统。Cell 1、2和4各有一台机器;Cell 3有两台不完全相同的机器,其中较新的一台机器的加工时间是另一台的80%。这个系统生产三种类型的零件,每种零件的加工顺序是不同的。零件的加工顺序和加工时间(以分钟为单位)如表7-1所示。所有的加工时间服从三角分布,其中Cell 3的时间是旧机器的加工时间。各种零件混合在一起到达系统,到达间隔时间服从均值为13的指数分布;第一个零件在0时刻到达。各种零件的分布情况为:零件1占26%,零件2占48%;零件3占26%。所有零件从左边进入系统,从右边离开,在系统中以顺时针方向移动。现在,忽略距离的因素(稍候将讨论),假定在任一对单元之间的移动时间都是2分钟。我们将收集关于资源利用率、排队时间和队长、以及各种零件的系统逗留时间(从进入到离开)的统计数据。开始时,我们运行仿真32小时。7.1.1 Arena中的新概念我们需要Arena中的一些新概念来描述这个问题的某些特征。第一个特征是三种零件按不同的工艺计划(加工顺序)通过系统。在先前的模型中,所有的实体都按相同的顺序通过各个位置。对于这种系统,需要有一个能够自动安排实体运动线路的工艺计划。第二个特征是Cell 3的两台机器是不相同的 新机器加工零件的速度比旧机器快。现在需要对这两台机器加以区别。第三个特征是实体在系统中的流动形式。在先前的模型中,实体在系统中的流动是通过直接连接(Connect)或是直接的路径(Route)选项来完成的。当使用Connect选项时,实体立即被送到下一个模块,在仿真中没有运送时间。如果在新的模型中使用Connect选项,那么就必须包含一定数目的decide模块,用以引导零件到下一个正确的加工单元,但这样无法模拟两分钟的运送时间,也无法用动画来模拟零件的流动。虽然我们可以使用Delay模块来描述运送时间,但它并不能帮助我们用动画来显示零件的移动。我们倒是可以使用Decide模块后面跟随一系列Route模块的形式来模拟两分钟的运送时间并动画显示零件的移动。不过,在Arena中有一个“序列”(sequences)的概念,它可以很容易地模拟出实体按以上方式通过系统的情况,并且描述出零件的运送时间。表7-1 零件的工艺路线和加工时间零件加工单元 / 时间加工单元 / 时间加工单元 / 时间加工单元 / 时间加工单元 / 时间116,8,1025,8,10315,20,2548,12,162111,13,1524,6,8415,18,2126,9,12327,33,39327,9,1117,10,13318,23,28在许多系统中,不同实体都是根据其各自预先定义好的路径通过系统的。大多数制造系统中,不同零件也各有其工艺计划,具体指定了每种零件在系统中必须完成的操作序列。许多服务系统也有相似的要求。例如,一个机场旅客通行的模型中,可能需要根据旅客是否携带需检查的行李或者仅带有手提包、以及根据旅客乘坐的是国内航班还是国际航班等因素,来要求旅客从不同的路径通过机场。Arena根据预先定义的站点访问次序(在Sequences模块中定义)自动使实体按规定路线通过系统。利用高等运送面板中的Sequence数据模块可以定义一个指定的站点序列,并且可以定义在每个站点的属性或变量。将所定义的序列赋给实体(使用内置的sequence属性,下面将介绍),使实体以此顺序通过系统中的各站点。在将实体向下一目的地传输时,需在Route模块中选择Sequential选项。当实体按照自己的序列行进时,Arena会记录实体的当前位置以及下一时刻的去向。这个工作可通过三个特殊的、自动定义的Arena属性来完成:Entity.Station(M),Entity.Sequence(NS),和Entity.JobStep(IS)。每个实体都拥有这三个属性,并且新创建的实体的属性默认值为0。Station属性记录实体的当前位置或当前正要被运往的位置。Sequence属性记录实体需要遵循的序列。而Jobstep属性则指定实体当前在序列中的位置。首先使用Sequence数据模块对每种实体将要经过的一系列站点加以定义和命名。然后,当新零件进入系统时,把特定序列的名字赋给该零件实体的Sequence属性 NS Arena在内部使用M,NS和IS作为属性名,而在下拉式菜单中提供相应的别名Entity.Station,Entity.Sequence和Entity.Jobstep。,这样就把实体与相应的序列联系起来了。当实体被从一个站点运送到序列中的下一站点时,我们在实体运出模块的Destination Type域中选择Sequential选项。当运行到这一时刻时,Arena将首先对Jobstep属性(IS)的值增1。然后根据Sequence属性和Jobstep属性的当前值检索到目的站点。完成在Sequence模块中定义的赋值操作(如果有的话),并把检索到的目的站点赋给实体的Station属性(M)。最后,Arena将实体运送到那个站点。一般来说,实体按规定顺序完成加工,然后离开模型。然而不一定必需如此。只有在实体使用Sequential选项进行运送时,Jobstep属性值才自动递增。因此我们可以临时停止实体按照规定序列的传输,而是将实体直接运送到另一站点,稍后再重新回到序列规定的位置。当在加工过程中某些工位上的一些零件被要求返工时,这一点很有用。返工完成后,零件可以很方便地再次回到正常加工序列。在任何时刻都可以对sequence属性重新赋值。例如,可以通过为Sequence属性赋新值和将Jobstep属性重置为0来处理一个不合格的零件。按新的序列,零件将被送往返工区的一系列站点,也可以通过减少或增加Jobstep属性值在序列中回溯或前跳。为了确保正确地重新设置Jobstep属性,必须要注意谨慎行事,并且要记住 Arena总是先对Jobstep增值,然后再查找序列中的目的位置。正如我们在前面提到过的,读者可以在序列中的任何阶段设置属性和变量。例如改变实体图形,或者将加工时间赋给用户定义的属性。对这个小型制造系统,需要使用这一功能来定义加工时间,这些加工时间是由零件本身和其所在的加工站点决定的。7.1.2 建模方法具体的建模过程依赖于系统的复杂性和可用数据的性质。在简单模型中,需要什么模块和如何放置它们是很明显的。但在更复杂的模型中,就需要慎重考虑一下用什么样的建模方法比较合适。在学习了更多关于Arena的知识后,读者会发现有很多方法可以用来模拟一个系统或系统中的一部分。对经验丰富的建模者来说,并不只有唯一的正确方法来模拟一个系统。尽管如此,但如果没有正确地捕捉到系统所需的细节要求,那么所用的建模方法就有可能是错误的。复杂模型的设计常常由模型的数据需求和可用的数据来推动。经验丰富的建模者经常要花大量时间决定如何收集、存储和使用数据,然后再设计所需的模型结构。当数据要求变得更加苛刻时,这一方法通常是在短期内正确建立模型的唯一途径。在对供应链系统、仓储系统、配送网络和服务网络系统建立仿真模型时,这一点是很明显的。例如,典型的仓库有成百上千种不同的存储单元,也即SKUs(Stock-Keeping Units)。每一个SKU可能要求能够描述出其在仓库中的位置、尺寸、权重的数据,以及该存储单元重新进货的数据。除了详细说明与仓库存储的内容相关的数据之外,还有客户的订购数据以及SKU的存储装置或者设施类型等其它信息。如果需要模型在实验期间具有改变SKU的位置、存储装置、重新进货策略等能力,那么所用的数据结构将是很关键的。尽管本书中要建立的模型并没有那么复杂,但仍然建议在开始建模之前考虑这些数据需求。对我们的小型制造系统来说,数据结构将会在一定的程度上影响模型的设计。我们可以使用Sequence来控制零件通过系统的流程,同时在Sequence模块中为零件赋加工时间属性(本例中,在这里只赋零件在Cell 1以外的其它制造单元中的加工时间,而在Cell 1中的加工时间,我们将使用Expression模块来定义)。零件的运送时间和在Cell 3中新机器加工时间因子(80%)将使用Variables模块来定义。在这个模型中,我们还将使用集合(Sets)来实现将正确的序列和图像与零件的类型相匹配。首先,我们将利用数据模块来定义有关参数,然后进入需要新模块的模型主题部分。其次,我们可以在模型中使用CAD图形或是其他图形来加入初始的动画元素。最后,我们将简要地讨论模型确认的概念。至此,对怎样打开和填写Arena的对话框应该已经很熟悉了,所以我们就不再细述如何在Arena中输入信息的一般细节了。对于在前面的章节中已经介绍过的模块和概念,我们仅简单地说明必须加入的数据。如果想了解我们当前处在模型的哪一部分,可以翻看图7-5,那里面给出了完整的模型。7.1.3 数据模块我们将从“高等运送”(Advanced Transfer)面板里的“序列”(Sequence)数据模块开始。双击相应的位置添加一个数据行,输入第一个序列的名字,Part 1 Process Plan。然后进入“步骤”(Steps)栏输入加工步骤,即Arena站点的列表。例如,Part 1 Process Plan要求输入下列Arena站点:Cell 1,Cell 2,Cell 3,Cell 4和Exit System。在Step Name栏可为各步骤命名,这里可任意取为Part 1 Step 1到Part 1 Step 5。在输入序列时最常见的错误是忘记输入最后一站,即通常实体离开系统的地方。如果忘记了,那么当第一个实体结束了它的加工路线后,Arena会弹出运行错误信息, 因为Arena不知道下一步该将它送到哪里。在定义Sequence的时候,记住一旦已经输入过一个站点的名字,那么随后就可以从模型里其它站点的下拉列表中找到它。同时读者也需要为Cell 2、3、4的零件加工时间属性赋值。由于我们将用Expression数据模块定义Cell 1上的加工时间,所以这里就不需要为它赋值了。输入界面7-1显示了序列 Part 1 Process Plan、 步骤 Part 1 Step 2,以及对Process Time的赋值情况。使用表7-1中的数据,可以相当简单地输入其余的序列步骤。稍后我们将展示如何在模型逻辑中使用这些序列。接下来,通过“高等操作”面板中的Expression数据模块定义Cell 1的零件加工时间表达式。该表达式命名为Cell 1 Times,包括在Cell 1中加工的三种零件的加工时间分布。本来我们可以在前面的Sequence模块中很容易地输入它们,但是我们还是选择用表达式来设置加工时间,这样读者就会看到可以用不同的方法来为加工时间赋值。因为有三种不同的零件在Cell 1上加工,所以需要一个三行的表达式数组,每种零件占一行。输入界面7-2显示了这一模块的数据。然后,我们将使用“基本操作”面板里的Variable数据模块来定义Cell 3的机器速度因子(Factor)和运送时间(Transfer Time)。在定义因子变量时,先观察如下结果:输入到Sequence数据模块中的Cell 3的零件加工时间是针对旧机器的,假设新机器序号为1,旧机器序号为2,则第一个因子值为0.8(相对于新机器),第二个因子值为1.0(相对于旧机器)。运送时间值输入2。如果我们打算用概率分布的形式定义运送时间,那么我们必需要用Expression来定义。而不能用Variable。输入界面7-3显示了需要输入的数据。我们将使用“基本操作”面板中的Set数据模块来定义关于Cell 3的机器集合、零件图形集合和实体类型集合。第一个是“资源型”(Resource)集合,Cell 3中包含两台机器:Cell 3 New和Cell 3 Old;“实体图形”(Entity Picture)集合命名为Part Picture,包括Picture.Part 1、Picture.Part 2、和Picture.Part 3;最后,“实体类型”(Entity Type)集合命名为Entity Types,包括Part 1,Part 2和Part 3三个集合成员。建立集合时,首先添加零件加工序列这一项。进入Set模块后,读者会发现可用的集合种类只有Resource、Counter、Tally、Entity Type 和Entity Picture,没有我们需要的类型。可以通过使用“高等操作”面板中的Advanced Set数据模块来解决这个问题,这个模块有三种类型:Queue,Storage和Others。Others是一种几乎可以把任何相似的Arena对象设置成集合的选项。这里我们也使用这个选项,输入集合名Part Sequences,集合元素包括:Part 1 Process Plan、Part 2 Process Plan和Part 3 Process Plan。在设置逻辑模块之前,先打开RunSetup对话框,设定重复运行时间为32小时,基准时间单位为分钟。同样也要通过EditEntity为实体选定图形,打开图像设置窗口,创建三种不同的图形 Picture.Part 1、 Picture.Part 2和Picture.Part 3。在本例中,复制蓝色,红色和绿色的球,给它们重新命名,并且在各图形中上分别加上数字1、2、3来指示三种不同的零件类型。在定义了所有的数据模块后,我们就可以在主模型中放置逻辑模块并定义其参数了。7.1.4 逻辑模块模型的主要部分包括一系列逻辑模块,用来描述描述零件到达,进入单元和零件离开。图7-2中所示的四个模块将被用来模拟零件的到达过程。Create模块以均值为13分钟的指数分布间隔时间来产生到达的零件。此时,并没有把每个到达的实体与其加工序列联系起来,我们将在Assign模块中建立这种联系,如输入界面7-4所示。此赋值模块有两个目的:决定所到达的是哪种类型的零件,并且为每一类达到的实体定义一个索引号,Part Index,通过这个索引号就可以把每一到达实体与集合中适当的序列联系起来。我们首先用离散分布来确定零件的索引号或是零件的类型。这种分布可以按给定概率产生一些相应的值。在本例中,分别按概率26%,48%,26%生成整数值1,2,3。这些值和相应的概率是按“累积概率”和“数值”的顺序一对一对地来定义的。最后一个数值(本例中是3)对应的累积概率应该是1.0。一般来说,并不要求这些数值必需为整数,可以取包括负数在内的任何值。零件索引号的值1、2、3不仅可以表示零件类型,在本例中,也可以作为前面定义的集合Part Sequence中的元素的序号,这样就可以将零件与其加工序列正确地联系起来。为达到这个目的,我们把Part Index属性作为Part Sequence集合的元素下标,这样我们就能把正确的加工序列赋给Arena的Entity.Sequence属性了。我们还需要正确地将实体类型与相应零件的图形联系起来。在最后两个赋值中,通过使用Part Index属性作为相关集合的元素下标,就可以做到这一点了。回顾之前创建的集合Entity Types(包括Part 1、Part 2、Part 3三个元素),以及包含三种图形元素(Picture.Part 1,Picture.Part 2和Picture.Part 3)的集合Part Picture,读者可以将这些集合看作是一个以刚刚赋值的Part Index属性为下标的(一维)数组变量。在本例中这是没问题的,因为在零件类型(Part Index)和加工序列、实体图形之间是一对一的关系。如下标为1表明零件1的加工序列取Part Sequence中的第一个元素。(在下一步的建模中要注意,这不一定总是正确的。它之所以在这个案例中是正确的,是因为所定义的数据结构具有一对一的关系。)在这个案例中,上面的Assign模块确定了零件类型、并为其安排了相应的加工序列和图形。注意在Assign模块中首先定义Part Index的值是很关键的,因为在后面的多个赋值中都要用到它。现在我们准备把零件按它的加工序列送到第一站。我们可以用“高等运送”面板里的Route模块来完成这一工作。之前,我们需要告诉Arena实体在哪儿,或者零件的当前位置(即目前所在的站点的位置)。如果读者已经跟着我们建立了自己的模型,就会发现在我们刚完成的Assign模块中的属性列表中有一个属性叫做Entity.Station(如果愿意的话你现在就可以进去看看)。你可能想增加一条赋值来定义零件的当前位置。不幸的是,如果你这样做的话,当运行模型的时候Arena将会报错;不过我们可以使用下面介绍的Station模块来实现这一点。在我们完整的模型中有六个站点:Order Release、Cell 1、Cell 2、Cell 3、Cell 4、和Exit System。后五个站点是在填写零件的加工序列(Part Sequence)信息时定义的,第一个站点Order Release是实体进入Station模块(在“高等运送”面板中)时定义的,该模块不仅定义了这个站点,而且告诉Arena当前实体就在这个站点中。已完成的Station模块如输入界面7-5所示。最后我们将使用Route模块(在“高等运送”面板中)把零件送到加工序列中的第一个站点处。Route模块的作用是将实体传送到指定的站点,或者是按照加工序列实体将要前往的下一站点,运送时间(Route Time)可以定义为变量或表达式。在这个模型中,Route Time为先前定义好的变量Transfer Time,如输入界面7-6。其中在Destination Type处选择Sequential选项,此时模块中的Station Name区域将会消失不见,并且在运行模型时,Arena将根据在实体的加工序列来传送实体。接下来建立四个加工单元的逻辑。这四个加工单元的逻辑在本质上是相同的,都是零件到达加工单元(一个站点),排队等待机器加工,在机器上加工,然后将零件按加工序列运送到下一站。可以通过使用图7-3(针对Cell 1)所示的Station-Process-Route模块序列来模拟所有的四个加工单元。Station模块提供了零件将要被送达的位置。在这个模型中,我们按加工序列来运送零件,所以被运送的零件将从它的序列中找出下一个位置。Cell 1的Station模块的输入如输入界面7-7所示。到达Cell 1站点的零件将被送到下一个Process模块(使用直接连接的形式)。在最底下表示延时的Expression栏中,输入先前定义的数组表达式Cell 1 Time,并且使用Part Index属性作为数组的下标,以取出正确的零件加工时间。这个表达式将生成我们在前面定义过的一个三角分布的随机数。其余输入见输入界面7-8。实体在Cell 1中的加工一完成就,就会被送到Route模块(见输入界面7-9),然后实体将按加工序列被送到下一站。除了名字之外,这个Route模块(见输入界面7-6)与我们在Order Release站点中的Route模块是完全一样的。其余的三个加工单元与Cell 1是非常相似的,所以我们将跳过细节描述。在创建它们的逻辑结构时,可对Cell 1的模块复制三次,然后按要求编辑相应的数据即可。对于每个新的Station和Route模块,简单地把所有出现Cell 1的地方改成Cell 2、Cell 3或Cell 4即可。对三个新Process模块做类似的修改,并且把表示Cell 2和Cell 4的延时表达式(Expression)改为Process Time。回想一下,在Sequences模块中,我们是通过把零件在相应站点上的加工时间赋给实体属性Process Time来定义Cell2、3和4上的加工时间的。当零件送到这些单元中时,Arena自动完成赋值,这样在模块中就可以使用了。此时,读者可能会觉得我们在Cell 1中用表达式来设置零件的加工时间,而在其他加工单元中却通过在序列中给属性赋值的方式来定义加工时间,具有很大的随意性。实际上,我们这么做主要是为了说明,在仿真模型里有多种不同的方法可以组织和使用数据。我们可以很容易地就把Cell 1上的零件加工时间也通过加工序列来定义,与其他的加工时间放到一起。同样,我们也可以用表达式来定义Cell 3和4的加工时间。但是使用表达式来设置Cell 2的加工时间是很困难的,因为零件2在Cell 2上加工了两次,而且两次加工时间是不同的,如表7-1所示。因此,若采用表达式的话我们的模型就必须具备一种能力,即它可以知道零件是第一次还是第二次经过Cell 2,并且要使用不同的表达式来定义这两个加工时间。这可能是一个有趣的练习,但是从建模者的观点来看,为什么我们不就在序列中定义这些值呢?读者应该也意识到了,从加工单元和工件的数量来说,这个模型规模是相当小的。在实际中,同时有30到50台机器、成百种不同类型的零件,这并没有什么稀奇。如果读者承担了一个那样规模的问题,那么强烈建议你一定要非常重视数据结构的设计,因为它将影响一个仿真项目的成败。Cell 3的Process模块略为有些不同,因为它有两台不同的机器,一台新的,一台旧的,它们加工零件的效率是不同的。如果机器是相同的,那么就可以使用单一的资源,然后把容量设为2。我们应该还记得在前面将这两台机器组成了一个集合,叫做Cell 3 Machines。现在需要在Cell 3中使用这个集合。输入界面7-10显示了这个单元的Process模块所要求的数据输入。在模块中的Resource部分,我们从资源类型(Resource Type)的下拉菜单中为其选择为Set(集合)类型。我们在Set Name栏选取我们前面定义过的Cell 3 Machines作为该集合的名字,实体可以占用(Seize)某个集合成员(具体机器)加工,该成员的标识可以作为属性赋给实体。最后,可以使用一个表达式来确定使用哪个资源。在“选择规则”(Selection Rule)处,接受默认的选择规则 Cyclical,也即实体将选择排在上一个刚被使用的资源之后的第一个可用的资源。在这个例子中,Arena将尽量交替使用这两个资源;但是如果当前只有一个资源可用的话,那么就选择这个可用资源。显然,这些规则只适用于多个资源可供选择的情况。随机(Random)规则产生随机的选择;优先顺序(Preferred Order)规则将选择集合中第一个可用的资源。一旦选择了这个选项,则如果新机器可用的话,Arena将总是使用新机器,因为它在集合中是第一个资源。“剩余”(Remaining)规则只适用于资源容量大于1的情况。借助Save Attribute选项,我们可以把所选定的集合资源的下标保存在某一属性中。在这个例子中,将在属性Machine Index中保存这个下标值。如果选择了新机器,这个属性将被赋值为1,如果是旧机器,属性将会被赋值为2。这些编号是按照定义集合时所输入的资源的顺序而确定的(先输新机器、后输旧机器)。使用属性Process Time(在加工序列中定义)乘以变量Factor(Machine Index)来定义延时的Expression栏。别忘了Cell 3上的加工时间是针对旧机器的,而新机器的加工时间是这个值的80%。在定义表达式时要注意,如果选择了集合中的第一个资源(新机器),则Machine Index被赋值为1,变量Factor将根据这个属性值取出其第一个元素0.8。如果选择了集合中的第二个资源(旧机器),则Machine Index被赋值为2,变量Factor将取出其第二个元素1.0。虽然以上方法对于这个例子来说似乎有点过于复杂了,但它能充分表明了Arena的强大灵活性。还有一种可用的方法,它不需要变量(Factor),而是直接使用下面的逻辑表达式:Process Time * (Machine Index = = 1)*0.8) + (Machine Index = = 2)或Process Time * (1 (Machine Index = = 1)*0.2)至于这个表达式是如何工作的,我们将把它留给读者去思考。(提示:如果a等于b ,则“a= =b”的值为1,否则为0)。在定义完所有的数据、零件到达过程和四个加工单元之后,就只剩下定义零件的离开过程了。这可由如图7-4所示的两个模块实现。和以前一样,我们使用Station模块来定义Exit System站点的位置。用Dispose模块清楚已完成加工的零件。完整的模型(不过动画部分还没完全加入)如图7-5所示。此时我们已经可以运行模型了,但是想从中看出我们所定义的加工序列是否在正确工作还是很困难的。所以在开始分析模型之前,应该先为模型建立动画,以帮助我们确定模型是否在正确运行。而且,如果模型需要呈送给更高的管理层去看,那么我们也希望能开发出很生动的动画画面。7.1.5 动画我们可以使用与第五章相同的方法来设计动画 创建自己的实体图形、资源图形、和基于图7-1给出的图案的背景。但也可能有人已经建立了能准确地反映该系统背景的图形,比如说,有人曾用CAD系统画过相应的车间布局图。Arena可以把CAD程序里的文件集成到它自己的工作区里,例如由AutoCAD系统绘制的以DXF格式保存的文件就可以直接导入到Arena里。其他由别的CAD或者画图程序(例如Microsoft Visio)生成的文件,只要支持AutoCAD的标准DXF格式,都可以导入Arena。如果原先的CAD图形是二维的,则只需要将其以DXF格式保存,然后再将文件直接导入Arena即可。大多数CAD对象(如多边形等)在Arena中将以相同或相似的对象来表征。如果图形是三维的,读者首先必须将其转换为二维。在转换过程中颜色可能会有损失,但是在AutoCAD或是Arena中都可以再次添加颜色。这种转换会将对象转换成由线条组成的图形,所以导入的图形在Arena中只能作为单个线条加以操作,也可以把这些线条组合成一个对象。假设我们已经有了DXF文件,读者可以从“在线帮助”中查找创建DXF文件或者转换一个三维图形的有关细节(Importing DXF Files主题)。注意,如果当前的背景是白色的,而一个转换的文件往往又会以白线的形式导入Arena,所以你可能什么也没看见。此时读者可以简单地改变窗口的背景颜色(用Draw 工具栏中的按钮),或者选定所有的线并改变线的颜色(按钮)。对这个小型制造系统,我们将从三维图形着手,把它转化为以DXF格式保存的二维图形文件(Model 07-01.DXF)。通过FileDXF Import菜单命令可将DXF文件导入当前的模型文件。首先选择这个文件,将鼠标指针移到模型窗口,此时指针变为十字形。用指针画一个框,则整个图形就被导入到这个框里了。如果导入图形的尺寸不合适,读者还可以选定全部的图形,重新按需要改变其大小。现在以这个图形为基础来制作动画。制作动画时,先要去掉所有的字母和箭头。然后从Process模块Cell 1 Process处把Cell 1的队列动画元素移到所导入图形中相应的位置上。现在把鼠标的指针置于一台机器的左上角,拖动指针使边界包括整个机器图形。使用Copy按钮将机器复制到剪贴板,现在点击Animate工具栏上的Resource按钮()打开“资源图形布局”(Resource Picture Placement)窗口。双击Idle资源符号并用剪贴板里的图形取代当前的图案。清除机器的基座,在表示机器顶部的部分画两个方框。必须要这么做,因为原始图形是由线条组成的,没法向其中填充颜色。现在从原图中清除所有的线,然后向方框中填充自己喜欢的颜色。复制这个新的符号到你自己的图形库里,然后再把它复制为Busy图形。保存图形库,关掉资源窗口,最后把资源放置到相应位置。现在就得到了所需的资源图案,稍后我们再回来增加更多的动画效果。下一步,画一个大小尺寸与机器的基座相同的方框,然后清除机器的全部图案。用另一种颜色填充这个新方框,然后在方框的顶部放置一个刚才建好的资源符号(读者可能需要重新设置资源符号的尺寸)。现在移动指针,使资源符号位于新机器的中央位置。再对新资源符号和机器基座进行复制,并且改变它们的名字,用来表示其它加工单元。注意需要把Cell 3和4的资源符号翻转一下。最后还需要移动和重新设定其他队列的位置和大小。一旦这些都完成了,就可以运行这个动画,观察你自己的手艺了。这时将看不到零件在系统里移动(因为还没有设置路径),但是可以看到队列中和机器上零件的变化情况。在动画运行中,如果仔细观察其中的一台机器,将会注意到零件被放置在这个机器的右上角加工,而并不是我们希望看到的情况。理想的情况是,零件应位于机器顶部和基座之间。把这个表示出来并不难。选择一个资源(可以在编辑模式下或是暂停运行来完成),然后利用ArrangeBring to Front菜单或是Arrange工具栏上的按钮来加以实现。再次运行动画,将得到预期的效果。下面开始用动画来表示零件的移动。在以前的动画中,基本上只有一条路径通过系统,所以增加路径是非常直观的。在这个小型制造系统中,有多重的路径经过系统,所以必须仔细地为每一个可能的运送线路添加路径。例如,一个零件离开Cell 2后可能去Cell 1、3、或4。首先要确定各站点的位置,使用Animate Transfer工具栏中的Station按钮来添加站点动画对象。然后设置路径。如果忽略了路径设置,仿真仍会用2分钟的运送时间将实体(正确地)送到相应的站点,但是不会出现实体移动的动画画面。读者还需注意的是,路径是双向的。例如,假设从Cell 1到Cell 2添加了一条路径,但是忘记了设置从Cell 2到Cell 1的路径,那么当零件3完成了它在Cell 2上的加工后,Arena会按加工序列将它送往Cell 1,但由于没有设置这样一条路径,系统将会查找从Cell 1到Cell 2的路径并使用它。因此,画面上可以看到零件从Cell 2的入口以逆时针方向移动到Cell 1的出口(对于这个模型来说是一个错误的画面)。运行并观察新建的动画模型时,读者可能会注意到偶尔零件会彼此超越或者经过,这是由动画驱动模式和有关的数据所造成的。读者应该还记得所有的零件运送时间都是两分钟,与运送的距离无关。而Arena是基于运送时间和动画中路线的长度来设定实体运送速度的。在这个模型中,有些路线是非常短的(从Cell 1到Cell 2),而另外一些却很长(从Cell 2到Cell 1)。因此,被运送的实体将会以不同的速度移动。如果这一点很重要的话,需要搜集更好的运送时间,并表示在模型中。最简单的方法是清除Variables模块中的Transfer Time,并且在Sequence模块中把这些新的运送时间赋给某一属性。如果运送时间和背景图形都正确的话,那么实体将以相同的速度移动。现在唯一可能遇到的问题是当一个零件进入主通道时另一个零件恰好在同一位置经过,这就导致了两个零件会重叠在一起移动,直到彼此的行进路线分开时为止。这是一个很难解决的问题,不过不值得为它而困扰。如果仿真的主要目的是用于演示的话,那么通过观察动画,找出一段这种情况不会发生的时间段,只演示这一段就可以了。一种解决的方法是使用物料搬运建模构件,这些内容将在第八章中介绍。给模型加上简单的注释之后,最终的动画演示看起来会像图7-6中那样(这是在系统时间为541.28时的观察画面)。在这个时刻,可以检查模型是否在正确地运行,或者至少可以检查它是否在以我们希望的方式运行。我们将在下一节中继续讨论这个问题。7.1.6 模型验证模型验证(Verification)是确保Arena模型能根据建模假设以预期的方式加以运行的过程。比起模型确认(validation)来,验证要容易得多,模型确认是确定模型是否与真实的系统的运行规律一样。我们将在第十三章中更加详细地讨论这两个方面的问题。在这里只是简单介绍模型验证的问题。模型验证所处理的问题有时很明显,但有时也不那么明显。例如,如果试运行模型,Arena报错,指出没有定义Cell 3的一个机器资源,这个模型显然没有按照预期情况运行。实际上,我们一般把这个叫做调试(debugging)过程!不过,我们假设你不会出现那样的问题(或者说如果出现了,你自己就可以很容易地加以纠正),所以我们这里所处理的是是那些不太明显的问题。当读者在建立象本书中的这种小型、课堂练习类的问题时,模型的验证是相当容易的。当开发一个更接近实际规模的模型时,读者会发现验证将是一个很艰难的过程,并且对于非常非常大的模型来说,是绝对无法做出100%保证的。一个简单的验证方法是让一个实体进入系统,然后跟踪它,以确定模型的逻辑和数据是否正确。可以使用标准工具栏中的Step按钮()来控制模型的执行,让实体一步一步地通过系统。对于这个模型,也可以在Create模块中设定Max Arrivals域为1。为了控制实体类型,读者可以用你想要观察的那个零件类型来替代在Assign模块中用以确定零件类型的离散分布。这样读者就可以检查每个零件的加工序列。另一种常见的方法是用常量替换某些(或全部)模型数据。使用确定性的数据可以更加精确地预测系统的行为。如果准备使用模型来做真正的决策,那么读者应该检查在极端情况下模型的运行情况。例如,只引入一种零件类型、或者增加/减少零件的到达间隔或服务时间。如果模型有问题,那么将最有可能在这种超负荷运行的情况下暴露出来。同样的,读者应该有效地利用动画,你对所模拟系统的运作过程很熟悉,通过观察动画就能发现很多问题。还有一种好方法是使用不同的数据做长时间的仿真运行,通过观察输出报告中的结果来找出可能存在的问题。此时一种很有用的方法是性能评估(performance estimation)。在计算器发明之前(当然也没有个人电脑),工程师总是带着一个叫做计算尺的工具(经常由皮袋包着,挂在他们的腰带上),用来计算由专业人员或老板提出的复杂问题。这些装置通过引入对数计算而产生了神奇的效果。虽然它们能很好地计算一些问题(当然不可能像计算器那样简便和快捷),但是他们只是返回由单个数字组成的序列(实际上是从尺子上读出来的),如3642。由于工程师需要指出小数点的位置,所以他们在使用计算尺之前就需要能对问题的结果做个粗略的估计。例如,如果工程师估计结果可能是400左右,那么计算尺显示的答案就是364.2。不过,如果估计的结果是900的话,那就很难判断计算尺上的答案到底是多少了(364.2还是3642?)。此时,必需要首先确定是工程师的经验估计出了问题,还是在使用计算尺计算的过程中出了问题。我们猜想读者现在可能会提出两个问题:1)为什么要讲这个长长的不相关的故事;2)过去真的使用过这样的工具吗?好的,答案是:1)是为了阐明观点,2)作者之一确实用过!那么如何使用这种伟大的性能评估技能呢?可以为仿真定义一组条件,然后估计会导致什么样的结果,然后运行仿真模型,通过观察输出报告中的数据来确定你结果是否正确。如果结果正确,那么读者就可以愉快地再去尝试另一组不同的条件了。如果结果是错误的(或者至少不太对),则需要找出为什么。发生错误的原因可能是由于对结果的估计有问题、缺乏对系统的理解、或者模型中有错误。有时候模型里一些没有料想到的交互作用可能会产生很难发现(但却是存在)的问题。通常情况下,应当彻底地运行仿真模型,并且保证在用它做决策之前所得到的结果是令人满意的。最好是在项目的早期就开始做这种验证工作,并且要经常做。现在回到2.7节,当我们提到模型验证时,我们的建议是验证程序代码。估计现在读者的反应会是“什么程序代码?”。的确有程序代码,事实上在第五章中简单地展示了一些代码。但是读者可能仍然会问,“为什么要使用代码”?解释这个原因需要一些背景知识(另外一种历史课)。在1982年,System Modeling公司(原先开发Arena的公司)成立,并开始发布仿真语言SIMAN(Arena正是以它为基础开发的,并且读者可以通过Arena访问和使用SIMAN)。那时个人电脑刚刚开始进入市场, SIMAN被设计成可以在这些新型机器上运行的系统。事实上,SIMAN只要求有64Kb的内存,但在当时这已经是很大了。当时还没有动画能力(与SIMAN配合使用的动画工具Cinema是在1985年才首次发布的),使用文本编辑器来创建模型,就像使用一般的程序设计语言一样。完整的模型要求建立两个文件:一个模型文件,一个实验文件。其中,模型文件中包括所有的模型逻辑,通常称为. mod文件。而实验文件则定义了实验的条件,被称为. exp文件,它要求用户列出模型中用到的所有站点、属性、资源等。在建立这些模型或实验文件时,必须遵从一种相当严格的语法。比如,只能在第10列才能开始写某些语句;有些部分后面要跟逗号,有些跟分号或者句号;所有的资源和属性只能用数字来引用;只能使用有限的一组关键词等(你的许多老师就是通过这种方法来学习仿真的)。从1982年起,SIMAN一直在不断地改进,并且仍然是Arena仿真模型的重要基础。当运行Arena仿真时,Arena检查所用模块中的每个选项和用户提供的数据,然后创建SIMAN形式的MOD和EXP文件。这些是用于仿真运行的文件,“基本操作”面板、“高等操作”面板和“高等运送”面板中所有的模块都是以SIMAN仿真语言中的构件为基础建立的。这么做的目的就是要利用功能强大而灵活的SIMAN语言去建立一个易于使用的仿真工具(即Arena)。所以,在用Arena仿真建模时仍然可以察看SIMAN代码。事实上,甚至可以生成和编辑这些文件,但只能从上向下(从Arena生成SIMAN代码),而不可能从下向上(从SIMAN代码生成Arena模型)。当对Arena更加精通以后,有时可以通过察看代码来确定模型是否能准确地按照预期方式运行 这就是模型验证。应当指出,在Arena中仍可使用基本的SIMAN语言来创建模型。如果只使用Blocks和Elements面板里的模块来构建模型的话,就相当于只使用基本的SIMAN语言。回想一下,在之前的第5章构建库存模型时,就使用过一些Blocks面板中的模块。可使用RunSIMANView菜单选项来查看小型制造系统模型中的SIMAN代码。选择这个选项将会同时生成上述的两个文件,每一个都有单独的窗口。图7-7展示了一小部分.mod文件,它是Cell 3中Process模块部分的代码。SIMAN语言具有相当强的描述性,所以不难理解其表达的逻辑。实体到达模块时它内部的计数器会递增1,然后实体进入队列Cell 3 Process.Queue,等待占用集合Cell 3 Machines中的资源,接下来生成由加工时间所造成的延时(含调整因子),最后释放这些资源,内部计数器减1,实体离开这个模块。图7-8显示的是.exp文件中的一部分,这个文件定义了在我们模型里所用的三个属性,以及队列和资源。这里不再深入解释文件的细节了,我们这样做的目的仅仅是为了让读者知道它们的存在。如果想更全面地了解,请参考Pegden,Shannon,and Sadowski(1995)一书。如果你对SIMAN比较熟悉,或者愿意更多地了解这些过程是如何进行的,建议你选取一些模块并输入数据,再生成MOD和EXP文件。然后再编辑这些模块,在其中设置不同的参数,再次生成新的文件。在两个MOD文件中寻找差别。这样读者就可以深入了解这些过程是的如何运行的了。7.2 稳态仿真输出的统计分析第6章描述了终态和稳态仿真的不同,并且指出了在终态仿真时如何使用Arena输出报告、PAN和输出分析器来做统计分析。在这部分将展示如何在稳态仿真下做统计推断。在开始之前,我们鼓励读者一定要确认采用稳态仿真模式对所研究的问题是否合适。常有人简单地认为,一个长期运行的状态稳定的系统就要用稳态仿真来处理,事实上这也可能是正确的。但是,如果开始和结束的条件对模型来说非常重要的话,应用终态仿真分析可能更合理。应当尽量避免使用稳态仿真模式做输出分析,这是因为虽然 Arena能够自动得出平均性能指标的95%的置信区间,但要想获得此外的其它更多结果的话,稳态仿真输出分析要比终态仿真难得多。所以如果不需要做稳态仿真的话,就尽量不要做。在开始进行分析之前还有一点警告,那就是稳态仿真的运行时间会很长。因此,Arena有更多的机会在排列其内部操作顺序时出现一些差异,这将导致随机数流的使用上产生一些差异(参见第12章)。虽然这并不会使模型产生错误或变得不精确,但它还是会对数值结果产生影响,特别是对那些在内部存在一些固有的统计可变性的模型。所以,当读者跟着本书在自己的个人电脑上建立并运行模型时,如果得到与本书不同的数值结果,不要为此惊慌,因为在某种意义上说这是意料之中的。对于这种情况,只是表明需要更多的仿真输出数据统计分析工作而已,因为这些变动因素不仅来自模型本身,而且也来自内部处理过程。7.2.1节中将讨论如何确定模型的预运行阶段(也

温馨提示

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

评论

0/150

提交评论