AnyLogic的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AnyLogic的应用
10.2.1
这里以AnyLogic的系统帮助中提供的一个经典的模型——Bass Diffusion Model来介绍系统动力学模型建模。
Bass diffusion Model是用来研究新产品的扩散过程,该模型认为一个新产品投入市场
后,它的扩散速度主要是受到两种信息传播途径的影响:(1)大众传播媒介如广告等(外部
影响),它通过传播产品性能中容易得到验证的部分(如价格、尺寸、颜色和功能等)来影
响产品的扩散;(2)口头交流,即已采用者对未采用者的宣传(内部影响),它通过传播产
品某些一时难以得到验证的部分(如可靠性、使用方便性和耐久性等)来影响产品的扩散。
接下来介绍如何建立该模型:
1)建立新模型
(1)点击工具栏的(New Model)按钮或File菜单的New Model命令。
(2)在弹出的New Model对话窗口中输入Model的名称、需要存放的位置(可点击
Browse按钮浏览本地文件系统并选定要保存的地址)和所在的Java包(可自动生成),如图2.10.8所示。
图2.10.8 建模窗口
(3)点击Finish按钮,进入开发环境并完成以下各歩,在建模的时候要注意保存。
2)添加Stocks
添加两个Stocks模块用来描述从产品的使用者和潜在使用者的数量,如图2.10.9。
图2.10.9 模型中的Stocks模块
(1)在面板视图(Palette View)中的模型面板(Model)上选中Stock Variable模块。
(2)选着workspace(图形编辑区)中适当的位置,点击即可在此处创建一个Stock Variable模块,在workspace中图标为一个蓝色的矩形,可通过拖动调整它的位置。
(3)单击workspace中的stock variable的图标,属性视图(Properties View)中会显示此Stock Variable的属性(属性窗口需要打开),在属性视图的General类属性中修改此Stock Variable的名称(Name)为:PotentialAdopter,表示用该模块描述产品潜在使用者的数量。
(4)同样再添加一个Stocks Variables模块,命名为Adopter,表示该模块用来描述产
品使用者的数量。
3)添加Adoption Flow
在创建了两个stocks 分别表示产品的使用者和潜在使用者之后,需要添加一个Flow,用来描述产品潜在使用者转变为使用者的转移过程,如图2.10.10。
图2.10.10 模型中的Adoption Flow模块
(1)在模型面板(Model)上选中Flow/Aux variable模块。
(2)在workspace中PotentialAdopter和Adopter之间的位置,点击创建Flow/Aux variable
模块,此时默认命名为FlowAuxVar。
(3)在属性视图中修改FlowAuxVar模块的名称(Name)为AdopterRate,表示该模块用来描述产品潜在使用者转变为使用者的转移速率。
(4)在workspace中通过双击PotentialAdopter的图标,再点击AdopterRate的图标在PotentialAdopter和AdopterRate之间建立联系,表示AdopterRate是PotentialAdopter的输出流(outflow)。
(5)在workspace中通过双击AdopterRateAdopter的图标,再点击Adopter 的图标在AdopterRate和Adopter之间建立联系,表示AdopterRate是Adopter的输入流(inflow)。
4)添加Constants
接下来,要添加在模型中用到的常量(Constants),此时需要创建一些Parameter模块来表示这些常量,如图2.10.11所示。
图2.10.11 模型中的Constants模块
(1)在模型面板(Model)上选中Parameter模块。
(2)选着workspace(图形编辑区)中适当的位置,点击此处创建一个Paramater模块,默认名为parameter。
(3)在属性视图中修改parameter模块的名称(Name)为TotalPopulation,表示该模块用来表示总人口(TotalPopulation)这一常量,并设定它的缺省值(Default Value)为100000,即表示的总人口数量为100000。
(4)采用同样的方法添加名为ContactRate的变量,设定它的缺省值(Default Value)为100,表示每年有100人进行了接触,他们之间可以进行口头交流。
(5)同样的方法添加名为AdEffectiveness的变量,设定它的缺省值(Default Value)为:0.011,表示广告在潜在使用者转化为使用者过程中的影响效果。
(6)采用同样的方法添加名为AdoptionFraction的变量,设定它的缺省值(Default Value)
为0.15,表示口头交流在潜在使用者转化为使用者过程中的影响效果。
5)定义Stocks的初始值
添加了TotalPopulation常量后,便可用这个常量来为PotentialAdopter赋初始值了,如图2.10.12。
(1)点击在workspace中PotentialAdopter的图标,打开PotentialAdpoter 的属性视图。
(2)设定PotentialAdpoter的General类属性中的Initial Value为TotalPopulation,可以直接输入,也可通过Ctrl+Enter的快键查看code completion的提示,并选定TotalPopulation double – Main来完成。
图2.10.12 设定Stocks的初始值
6)添加Auxiliaries
接下来,要添加两个Auxiliaries,分别用来表示广告和口头交流对潜在使用者转变为使
用的影响结果,如图2.10.13。
图2.10.13 模型中的Auxiliaries模块
(1)在模型面板(Model)上选中Flow/Aux variable模块。
(2)选着workspace(图形编辑区)中适当的位置,点击此处创建一个
Flow/Aux variable模块,默认名为FlowAuxVar。
(3)在属性视图中修改FlowAuxVar模块的名称(Name)为AdoptionFromAd,表示广告对潜在使用者转变为使用的影响结果,并设定“AdoptionFromAd =”值为AdEffectiveness*PotentialAdopters,表示广告对潜在使用者转变为使用的影响结果是
AdEffectiveness*PotentialAdopters,如图2.10.14所示。
图2.10.14 AdoptionFromAd的属性设定
(4)同样的方法再添加一个Flow/Aux variable模块,命名为AdoptionFromWOM,表示口头交流对潜在使用者转变为使用的影响结果,并设定“AdoptionFromWOM=”值为
ContactRate*AdoptionFraction*PotentialAdopters*Adopters/TotalPopulation ,该表达式的值表示口头交流对潜在使用者转变为使用的影响结果,如图2.10.15所示。
图2.10.15 AdoptionFromWOM的属性设定
(5)创建了AdoptionFromAd和AdoptionFromWOM之后,便可用它们为AdopterRate赋值了。
点击在workspace中AdopterRate的图标,打开AdopterRate的属性视图,并设定“AdoptionRate=”的值为:
AdoptionFromAd+AdoptionFromWOM,表示潜在使用者转变为使用者的数量是受广告影响而转变和受口头交流影响而转变这种数量之和,如图2.10.16。
图2.10.16 AdoptionRate的属性设定
7)添加Charts
(1)在分析面板(Analysis)上选中DataSet模块。
(2)选着workspace(图形编辑区)中适当的位置,点击此处创建一个DataSet模块,默认名为DataSet。
(3)在属性视图中修改DataSet模块的名称(Name)为PotentialAdoptionDs,表示该数据集合是用来收集不同时刻潜在用户的数目,并设定“Vertical axis value =”值为Potential Adopters,表示该集合Y维的数据是潜在使用者的数量,并选定的“Use time as horizontal axis value”,表示用时间作为该集合X维的数据;此外,因为要运行10个时间单元,所以要保存10组数据,可修改Keep up to 10 latest samples中的100为10,如图2.10.17所示。
图2.10.17 PotentialAdopterDs的属性设定
(4)采用同样的方法再添加一个DataSet模块,命名为AdopterDs,表示该数据集合是用来收集不同时刻使用者的数目,并设定“Vertical axis value =”值为Adopters,表示该集合Y维的数据是潜在使用者的数量,并选定的“Use time as horizontal axis value”,表示用时间作为该集合X维的数据;此外,因为要运行10个时间单元,所以要保存10组数据,可修改Keep up to 100 latest samples中的100为10,如图2.10.18所示。
(5)在分析面板(Analysis)上选中Time plot模块。
(6)在workspace(图形编辑区)中适当的位置,点击此处创建一个Time plot模块,默认名为Time plot,通过拖动调整其位置和大小。
图2.10.18 模型中的AdopterDs模块
(7)在属性视图中修改Time plot模块的名称(Name)为Bass_Diffusion,表示该折线图用来描述Bass diffusion模型的运行结果,并根据模型运行的时间
长度(10个时间单元)修改Time Window的属性值为10,表示图形要显示10组数据。
(8)在属性视图中单击Add Data Set,为该折线图添加一条用来显示一组数据的数据
线,修改Title属性为PotentialAdopter,DataSet属性为PotentialAdopterDs,表示这条名叫
PotentialAdopter的数据线,是用来描述潜在用户数量的,修改其他其它属性如Point Style等可改变数据线的外观显示。
(9)同样的方法添加一条用来显示用户数量的数据线,设定它的Title属性
值为Adopter,DataSet属性为AdopterDs,并相应调整它的外观显示,如图
2.10.19所示。
图2.10.19 AdopterDs外观显示的设定
8)设置运行参数
单击工程视图(Project View)的Bass Diffusion模型的Simulation:Main 对象,打开它的属性视图,修改Model Time类属性中的Stop time的值为10,让模型运行10个时间单元,选定Presentation类属性中的Execution Mode为Real
time with scale,并调整它的值为1,表示运行时每秒运行模型中的1个时间单元。
9)远行模型
(1)点击工具栏中的Build Model编译模型,并修改错误。
(2)点击工具栏中的Run运行模型,会打开运行窗口,如图2.10.20所示。
图2.10.20 运行窗口
(3)点击Run the model and switch to Main view按钮运行模型,运行结果如图2.10.21。
图2.10.21 模型的运行结果
10.2.2 Agent
此处仍以Bass Diffusion模型为例介绍如何使用Anylogic建立Agent模拟模型。
1)建立新模型
建立一个新模型,命名为:Bass Diffusion Agent Based。
2)创建Agents
Agent模拟模型是由agents和它们的运行环境构成,所以建立Agent模拟模型,首先要做的是建立agents,每一个agent都依据给定的规则与其它agent相互作用,这种相互作用
综合起来便表现为系统的整体行为。
在这个模型中每个agent代表一个人,受广告和口头交流的影响,由产品的潜在使用者
转变为产品的使用者。
建模步骤为:
(1)为agent创建活动对象类(active object class):右击工程视图(Project View)中
的Bass Diffusion Agent Based模型打开它的右键菜单,运行new|new
active object class命令打开new active object class对话窗,将new active object命名为Person,点击Finish按钮建立活动对象类。
(2)建立了person活动对象类之后,该对象类会自动添加到工程视图的Bass Diffusion Agent Based模型下,在工程视图中选中Person活动对象类,打开它
的属性视图,在General类属性中选定“Agent”,表示这个对象类是Agent类。
(3)在工程视图中选中Main对象类,在workspace中打开它,拖动工程视图中Person到workspace中,表示在Main(表示环境)中创建了Person的模块
(对象),默认名为person,在属性视图修改person对象的属性name为people,并设定Replication属性的值为1000,表示创建1000个person类的对
象people,如图2.10.22所示。
图2.10.22 模型中的person类
3)设置广告影响规则
(1)在工程视图中选中Person对象类,在workspace中打开它,在面板视图(Palette View)中的模型面板(Model)上选中State模块,选着workspace中适当的位置,点击即可
在此处创建一个State模块,默认名为State,在属性视图(Properties View)中修改State的名称(Name)为PotentialAdopter,表示用该模块描述潜在使用者的状态,即处于该状态的
agent都是潜在使用者,如图2.10.23所示。
(2)同样在PotentialAdopter模块下方添加一个State模块,命名为Adopter,表示该模块用来描述产品使用者的状态,即处于该状态的agent都是使用者。
图2.10.23 模型中的State模块
(3)在面板视图(Palette View)中的模型面板(Model)上选中Entery Pointer模块,在workspace中PotentialAdopter模块上方适当的位置,点击即可在此处创建一个Entery Pointer模块,描述agent的初始行为,用来表示agent在初始阶段会进入PotentialAdopter的状态。
(4)在模型面板(Model)上选中Parameter模块;在workspace(图形编辑区)中适当的位置,点击此处创建一个Paramater模块,默认名为parameter;在属性视图中修改
parameter模块的名称(Name)为AdEffectiveness,表示该模块用来表示广告对潜在使用者
的影响效果这一常量,并设定它的缺省值(Default Value)为0.011。
(5)在面板视图(Palette View)中的模型面板(Model)上选中Transition 模块,在workspace中PotentialAdopter模块和Adopter模块之间的位置,点击创建一个Transition模块将PotentialAdopter模块和Adopter模块连接起来,用来表示agent受广告的影响从PotentialAdopter状态转变为Adopter状态,并设定属性“Triggered by:”的值为Rate,属性“Rate:”的值为AdEffectiveness,表示agent受广告的影响从PotentialAdopter状态转变为Adopter状态的发生是服从概率的,概率值是广告影响效果,如图2.10.24所示。
图2.10.24 模型中的Transition模块
4)设置口头交流影响规则
(1)在工程视图中选中Main对象类,在workspace中打开它,在模型面板(Model)上选中Environment模块;选着workspace中适当的位置,点击此处创建一个Environment模块,点击workspace中的people模块,打开它的属性,设定属性“Environment”的值为:environment,表示人们进行交流的环境(范围)是所有agent。
(2)在工程视图中选中Person对象类,在workspace中打开它,在模型面板(Model)上选中Parameter模块;选着workspace(图形编辑区)中适当的位置,点击此处创建一个
Paramater模块,默认名为parameter;在属性视图中修改parameter模块的名称(Name)为ContactRate,并设定它的缺省值(Default Value)为100,该模块用来表示每年有100个人见面进行口头交流。
(3)同样添加另一个Paramater模块,命名为AdoptionFraction,设定它的缺省值(Default Value)为0.015,该模块用来表示口头交流对潜在使用者变为使用者这一转化过程的影响效
果。
(4)在面板视图(Palette View)中的模型面板(Model)上选中Transition 模块,在workspace中Adopter模块上,点击创建一个Transition模块将Adopter模块的两条边连接起来,用来表示处于Adopter状态的agent会通过口头传递信息,并设定属性“Triggered by:”的值为Rate,设属性“Rate:”的值为ContactRate * AdoptionFraction,表示口头传递信息发
生是服从概率的,概率值取决于人们见面的概率和口头交流的影响效果,设属性“Action:”的值为send("Buy!", RANDOM);用来描述产生效果的口头信息交流,如图2.10.25所示。
(5)在面板视图(Palette View)中的模型面板(Model)上选中Transition 模块,在workspace中PotentialAdopter模块和Adopter模块之间的位置,点击创建一个Transition模块将PotentialAdopter模块和Adopter模块连接起来,用来表示agent受口头交流的影响从
PotentialAdopter状态转变为Adopter状态,并设定属性“Triggered by:”的值为Message,属性“Message type”的值为String,属性“Fire transition:”的值为If message equals :“Buy!”,表示接受了有效口头交流的agent会从PotentialAdopter状态转变为Adopter状态。
(6)在工程视图中选中Person对象类,打开它的属性视图,在它的属性视图中,设定
Agent类的“On message received:”属性的值为
statechart.fireEvent(msg),表示当收到消息后,
将消息传递给相应的agent(对象),以便agent处理消息。
图2.10.25 设定了口头交流影响的模型
5)设置数据的统计和显示
(1)在工程视图中选中Main对象类,在workspace中打开它,在模型面板(Model)上选中Plain Variable模块;选着workspace中适当的位置,点击此处创建一个Plain Variable模块,默认名为plainVar,在属性视图中,将它的名字(name)改为PotentialAdopter,该模块是表示潜在使用者数量的一个变量。
(2)同样添加一个Plain Variable模块,命名为:Adopter,该模块是表示使用者数量的
一个变量。
(3)在工程视图中选中Person对象类,在workspace中打开它,单击PotentialAdopter模块打开它的属性视图,设定“Entry action:”属性的值为:get_Main().PotentialAdopter++,“Exit action:”属性的值为:
get_Main().PotentialAdopter--,分别表示当有agent变为PotentialAdopter状态时,Main对象类的中用于记录潜在使用者的变量(Potential Adopter)的值加1,如有agent的由PotentialAdopter状态变为其它状态(Adopter状态)时,Main对象类中用于记录潜在使用者的变量(Potential Adopter)的值减1,如图2.10.26所示。
(4)同样地设定Person对象类中Adopter模块的属性值,其中“Entry action:”属性的值为get_Main().Adopter++;“Exit action:”属性的值为
get_Main().Adopter--;分别表示当有agent变为Adopter状态时,Main对象类中用于记录潜在使用者的变量
(Adopter)的值加1,如有agent由Adopter状态变为其它状态时,Main对象类中用于记录潜在使用者的变量(Adopter)的值减1。
图2.10.26 PotentialAdopter的动作设定
(5)在工程视图中选中Main对象类,在workspace中打开它,添加两个数据集合(Data Set)模块和一个折线图(Time plot)用来显示模型的数据,如图2.10.27,这三个模型与建立系统动力学模型时一样,相关操作可参照前文介绍;
图2.10.27 模型中的显示模块
(6)最后设置模型的运行参数并运行模型,此处与建立系统动力学模型时一样,相关
操作可参照前文介绍,模型的运行结果如图2.10.28。
图2.10.28 模型的运行结果
10.2.3
这里通过建立一个简单而经典的离散事件模型—排队系统,来介绍如何使用Anylogic建立离散事件模型。
这个简单的排队系统研究的是顾客使用ATM取款这一现象,模型描述如下:顾客按一
定的概率到达自助银行(假定其中只有一台ATM机)取款,如果ATM机空闲,他直接取款,取款时间服从一定的概率分布,取款结束后离开,如果ATM机正在被使用,他就观察
等待队列,如果队列长度大于3人,他选择离开,否者他加入队列等待,等待队列的人按
FIFO规则使用ATM取款,同样取款结束后离开。
1)建立新模型
(1)点击工具栏的(New Model)按钮或File菜单的New Model命令。
(2)在弹出的New Model对话窗口中输入Model的名称DES、需要存放的位置(可点
击Browse按钮浏览本地文件系统并选定要保存的地址)和所在的Java包(可自动生成)。
(3)点击Finish按钮,进入开发环境并完成以下各歩,在建模的时候要注意保存。
2)添加变量
在模型中要使用或统计一些数据,如到达的顾客总数(NOofCustomter)、队列中的人数(queue)、流失的顾客数—那些因队列过长而离开的顾客数(Leak)、已经取款的顾客数(ser)、正在取款的顾客数(At_Service)、以及用来描述ATM机的状态量(ATM_1),其中最后两个变量在本系统中作用不大,但是考虑到模型的可扩展性(如扩展模型以适应有多台ATM机的系统),因此仍然在建模时添加了这两个变量。
(1)在工程视图中选中EDS模型的Main对象类,在workspace中打开它,在模型面板(Model)上选中Plain Variable模块;在workspace中适当的位置,点击此处创建一个Plain Variable模块,默认名为:plainVar,在属性视图中,将
它的名字(name)改为:NOofCustomter,并将它的初始值(Initial Value)设为0,该模块是表示到达的顾客总数的一个变量。
(2)采用同样的方法添加变量queue、变量Leak、变量At_Service、变量
ser和变量ATM_1,如图2.10.29,其中ATM_1的初始值(Initial Value)设为:1,其它变量的初始值(Initial Value)设为0,各个变量的意义与上文说明相同。
图2.10.29 模型中的变量
3)添加事件
在这个系统中主要有以下几类事件:顾客的到达(CustomerArrive)、顾客到达后进入队列等待(Wait)、顾客到达后直接使用ATM取款(Service_dir)、队列中的顾客使用ATM取款(Service_indir)和顾客取款后离开(Leave)。
(1)在工程视图中选中EDS模型的Main对象类,在workspace中打开它,在模型面板(Model)上选中Event模块;在workspace中适当的位置,点击此处创建一个Event模块,默认名为event,在属性视图中,将它的名字(name)改为CustomerArrive,这里假定顾客到达的概率为每单位时间到达一个,并据此设定事件发生的机制(Trigger type)为Rate,概率Rate为1。
(2)同样的方法建立事件Service_dir,用来描述用户到达后直接使用ATM取款的事件,由于该事件的发生是由CustomerArrive事件引起的,所以设定该事件的发生机制(Trigger type)为Timeout,模式(Mode)为User Control。
(3)采用同样的方法建立事件Wait,描述用户到达后进入队列等待的事件,由于该事
件的发生是由CustomerArrive事件引起的,所以设定该事件的发生机制(Trigger type)为Timeout,模式(Mode)为User Control。
(4)采用同样的方法建立事件Service_indir,描述在队列等待的用户使用ATM取款的事件,由于该事件的发生是由Leave事件引起的,所以设定该事件的发生机制(Trigger type)为Timeout,模式(Mode)为User Control。
(5)采用同样的方法建立事件Leave,描述用户使用ATM取款后离开的事件,由于该
事件的发生是由Service_indir和Service_dir事件引起的,所以设定该事件的发生机制(Trigger type)为Timeout,模式(Mode)为User Control。
(6)在workspace点击 CustomerArrive事件模块打开它的属性视图,在它的“Action:”属性值中为该事件添加动作,即该事件发生时系统要进行的操作,CustomerArrive事件的动
作为:每当有顾客到达,统计到达顾客的变量就加1,同时检查等待队列的长度,如果等待队
列的长度大于(等于)3人就离开,否者就加入队列,如果此时队列中没人,且ATM无人使用,就直接使用ATM取款,如图2.10.30所示。
图2.10.30 CustomerArrive事件的动作
(7)采用同样的方法添加 Service_dir事件的动作:当顾客到达后直接使用ATM取款时,ATM_1的状态变为忙,At_service的值加1;在一定时间后触发顾客离开的事件(Leave);这一时间为顾客取款的用时,这里假定其为服从1到1.4个时间单位的均匀分布
(uniform(1,1.4)),如图2.10.31所示。
图2.10.31 Service_dir事件的动作
(8)同样的方法添加Wait事件的动作:当顾客到达后进入等待队列等待,等待队列的
长度(queue)加1,如图2.10.32所示。
图2.10.32 Wait事件的动作
(9)同样的方法添加Service_indir事件的动作:当等待队列中的顾客使用ATM取款时,等待队列的长度(queue)减1,ATM_1的状态变为忙,At_service的值加1;在一定时间后触发顾客离开的事件(Leave);如图2.10.33所示。
图2.10.33 Service_indir事件的动作
(10)同样的方法添加Leave事件的动作:当顾客使用ATM取款后离开时,ATM_1的状态变为空闲,接受服务的顾客数(ser)的值加1;如果等待队列中有人,触发Service_indir事件,如图2.10.34所示。
图2.10.34 Leave事件的动作
最后设置模型的运行参数,模型的运行结果见图2.10.35。
图2.10.35 模型的运行结果。