修改稿.基于主体的建模

基于主体建模教程

1992-2005 XJ Technologies Company Ltd.

基于主体建模教程

版权所有 1992-2005 XJ Technologies。保留所有权利。

XJ Technologies Company Ltd

[email protected]

http://www.xjtek.com/products/anylogic

2 1992-2005 XJ Technologies http://www.xjtek.com

基于主体建模教程

目录

关于此教程…………………………………………………………………………4 1. 产品生命周期模型………………………………………………………………5 1.1 创建一个新工程………………………………………………………………5 1.2 创建主体……………………………………………………………………6 1.3 定义主体特性………………………………………………………………7 1.4 定义主体行为………………………………………………………………11 1.5 计数产品用户数……………………………………………………………14 1.6 配置模型……………………………………………………………………17 1.7 运行模型……………………………………………………………………18 1.8 研究此过程…………………………………………………………………18 1.9 考虑口碑的影响……………………………………………………………21 1.10 加入产品消耗逻辑…………………………………………………………24 1.11 创建空间模型………………………………………………………………26 1.12 创建动画……………………………………………………………………29 2. 扩展的产品生命周期模型………………………………………………………37 2.1 广告活动……………………………………………………………………37 2.2 多产品扩散…………………………………………………………………40 2.3 人群移动……………………………………………………………………44 2.4 人群迁移……………………………………………………………………47 3. 总结………………………………………………………………………………51

3 1992-2005 XJ Technologies http://www.xjtek.com

关于此教程

AnyLogic TM 支持多种不同的建模技术。本教程覆盖了基于主体(agent-based )建模的步骤,基于主体的建模已经成功地应用于包括生态学,社会学,经济学,交通模拟等等许多领域在内的广泛范围。基于主体的建模用于对市场(主体作为潜在客户),竞争和供应链(主体作为公司),人口(主体作为家庭,个人,或选举人)等进行建模。基于主体的建模允许在假定系统各个基本成员行为的情况下对系统的一般行为进行观察,而不需要关于此系统的任何全局知识。

AnyLogic TM 是唯一允许使用主体创建柔性模型,并且主体在其环境中可以相互交互的仿真工具。AnyLogic TM 支持所有现有的指定主体行为的方法——状态图(statechart ),同步和异步事件规划。

这一教程将简要向你介绍使用AnyLogic TM 创建一个仿真模型的过程。其目的是向你介绍AnyLogic TM 的用户界面和其他许多主要特性。

我们将创建一个简单的示范实例——产品生命周期模型,此模型用于预测新产品的销售情况。在第一节我们将创建经典的Bass 扩散模型。然后我们通过考虑一些细节信息和向你介绍一些AnyLogic TM 的高级特性来将此模型扩展。

请注意在如下文件夹中有一些文件供参考:Examples \ Agent Based Modeling Tutorial ,这些文件中包括了本文所述编辑过程中的一些重要记录。如果你在创建模型过程中遇到任何困难,或你希望将你的模型与参考文件相比较,你可以使用这些参考文件。你可以使用Start Page以打开这些示例。在你关闭你正在编辑的模型之后,Start Page将自动出现。

4 1992-2005 XJ Technologies http://www.xjtek.com

1. 产品生命周期模型

在这一教程中我们将创建产品生命周期模型。这一模型描述了产品的扩散过程。产品的潜在客户会受到广告和客户(那些已经购买了这种新产品的人)的口碑影响而购买产品。

1.1 创建一个新工程

首先,我们将为你的模型创建一个新工程。

创建一个新工程

1. 点击New Project

工具条按钮。此时即出现New Project对话框。

2. 点击Choose Location…按钮,然后浏览找到你希望保存你的工程文件的文件夹。 3. 指定工程名称。在Project name编辑框中,输入Product Life Cycle。 4. 点击OK 。

此时即创建了一个新工程。你可以看到结构图(structure diagram)显示于AnlyLogic TM 工作区中,Project 窗口显示于左侧面板中,Properties 窗口显示于右侧面板中。

5 1992-2005 XJ Technologies http://www.xjtek.com

当在一个工程中进行工作之后,不要忘记点击

Save

以保存此工程。

1.2 创建主体

在创建基于主体的模型时,你要做的第一件事情就是创建主体。主体是基于主体的模型的基本构建模块。基于主体的模型包括多个主体以及它们的环境。根据一个主体与哪些其他主体发生交互,每个主体都被给予一系列规则;这些交互将产生整个系统的总体行为。在这一模型中,主体是人。

为了在AnyLogic TM 中创建主体,你需要使用活动对象类(active object class)定义主体的内部结构,然后创建所需数量的类实例,每一实例即代表一个主体。

创建一个主体

1. 点击New Active Object Class

工具条按钮。

6

1992-2005 XJ Technologies http://www.xjtek.com

2. 在打开的对话框中,指定新类的名称(Name of the new class):Person 。

Person 类图即自动打开。

1.3 定义主体特性

你可以使用类参数(parameter )定义主体属性。由于所有主体都是同一个活动对象类(active object class)的实例,因此对每个主体,其基本的内部结构是相同的。类参数允许为每个主体分别定义其属性。

7 1992-2005 XJ Technologies http://www.xjtek.com

1. 在Project 窗口中,点击Person 项目。 2. 在Properties 窗口,点击New Parameter…

参数属性。

按钮。在打开的Parameter 对话框中,设定

定义每人每年联系的数目

1. 创建参数。输入名称:Contact_Rate。

2. 假定每人每年的联系频率为100。在Default value编辑框中,输入100。

1.

指定此人的说服力,即其与别人的联系中多大比例可以说服其熟人来购买此产品。

定义个人的广告建议性

3. 以同样方法创建参数,在Name 编辑框中输入Ad_Effectiveness。 4. 定义参数数值。在Default value编辑框中,输入0.011。

8 1992-2005 XJ Technologies http://www.xjtek.com

5. 你可以在Description 编辑框中输入对此参数的简短描述。输入文本用于帮助向不熟悉此模

型的人进行解释。

9

1992-2005 XJ Technologies http://www.xjtek.com

你可以看到在Parameters 表格中加入了新的参数。

定义个人的所说服力

1. 将参数命名为Adoption_Fraction。 2. 设定参数值为0.015。

创建附加参数

1. 在Project 窗口中双击Person 项目,打开Person 类图。 2. 点击

New Variable

蓝色圆圈。

工具条按钮,然后点击类图。此时图中即出现一个变量,显示为

10 1992-2005 XJ Technologies http://www.xjtek.com

一旦你将元素放置于结构图中之后,它即被选定,同时其属性将显示于Properties

窗口中。你可以根据你的模型需求,调整元素属性。

请注意Properties 窗口是上下文相关的——根据你所选择的元素类型不同,它将显

示不同的选项。如果稍后调整属性,你应首先在Project 窗口中点击一元素以将其选定,或在结构图中选定它。

3. 改变参数名称。在Properties 窗口中,在Name 编辑框中输入model 。

4. 定义变量类型(Type ):Main 。这里Main 是环境对象类。

5. 指定参数的起始值。

我们需要此变量以简化主体对环境的访问。

6. 创建变量isAdopter ,并且此变量有如下属性:

这一变量将帮助我们了解此个人是现有客户还是潜在客户。

1.4 定义主体行为

主体行为通过状态图(statechart )定义。

创建状态图

1. 在Project 窗口中双击Person 项目,打开Person 类图。

2. 首先,点击

Statechart 工具条按钮,然后点击类图。此时图中即显示状态图图标。

3. 双击此图标。即打开显示如下状态图的图表。

4. 在Properties 窗口中,改变此状态图名称为adoption 。

5. 在状态图中,点击此状态,然后按F2键,将其重命名为PotentialAdopter 。由于起始状

态指针指向此状态,因此它为起始状态。直到此状态变为活跃,这个人将一直保持为潜在客户。

6. 绘制如下的状态图。

7. 点击

State 工具条按钮,以加入更多状态,然后点击PotentialAdopter 状态之下的状

态图标。将此状态命名为Adopter 。这样在这一状态变为活跃时,这个人即变为客户。

8. 加入一个从PotentialAdopter 状态到Adopter 状态的转变。点击

Transition

钮,然后点击上方状态的边缘,然后再点击下方状态的边缘。

9. 在Properties 窗口中,从Fire 下拉选单中选择After timeout,然后指定Timeout 数值。 工具条按

此转变模拟了此人购买产品的过程。决定购买产品的决策时间与此人的广告建议性成指数关系。 exponential()函数是标准AnyLogic TM 随机数发生器。AnyLogic TM 也提供了其他随机

数分布,如正态分布,均匀分布,三角分布等。请参考用户手册(Users’ Manual)以了解所有这些随机数发生器的细节描述。在AnyLogic TM 的类参考手册(Class Reference)中你可以查到发生函数及其参数信息。为打开AnyLogic TM 用户手册或类参考手册,请从Help 菜单中选择对应菜单项。

1.5 计数产品客户

模型的主要目的是研究新产品如何被接受,因此我们希望能够知道在任一时刻有多少人已经购买了我们的产品。我们创建现有客户和潜在客户两个变量以计数产品客户。

创建变量

1. 在Project 窗口中双击Main 项目,打开Main 类图。

2. 创建变量potential_adopters。

3. 创建变量adopters 。

修改状态图

1. 在Project 窗口中双击adoption 项目,打开adoption 状态图。

2. 点击PotentialAdopter 状态。在Properties 窗口中,指定该状态的进入行为(Entry action)

和离开行为(Exit action)。

当进入此状态时,我们将用于计数潜在客户的变量增加1。当离开此状态时,我们将

此变量减少1。为确认所作出的改动,我们调用环境对象的setModified()函数。变量isAdopter 标明此人是否已经购买此产品(如果是,则为true ,否则为false )。

3. 用同样方法,我们设定Adopter 状态的属性。

这样你就成功创建了一个类,此类将定义主体的内部结构。现在向模型中加入主体。为将主体放置于模型环境中,你需要将建模主体(人)的对象封装到建模环境的类(Main )中去。 将主体放置于环境中

1. 在Project 窗口中双击Main 项目,打开Main 类图。

2. 将Person 类从Project 窗口中拖动到Main 类的结构图中。

3. 在Properties 窗口的General 页面中,输入对象的名称(Name ):person 。

4. 指定你希望放置于模型中的主体数量。在Properties 窗口的Replication 页面中,输入对象的数量(Number of objects):1000。

此时将自动创建所指定数量的类实例,每个实例代表一个主体。

这样我们就创建了所需数量的主体。现在我们需要使用类参数(parameters )和状态图

(statechart )来定义主体属性和行为。

1.6 配置模型

模型仿真有一系列特定的设定。一组模型的设定称之为一个实验(experiment )。你可以创建多个替代模型设定,然后只需改变此模型的当前实验即可改变模型工作配置。

实验显示于模型树中的Experiments 项目之下。

默认情况下即已创建一个实验并命名为Simulation 。这是一个简单实验(simple

experiment ),提供了过程可视化的工具。在模型参数起重要作用,并且你需要分

析这些参数如何影响模型行为,或你希望找到你的模型的最优参数时,你也可以

使用多种其他类型的实验(如优化,风险评估,变化测试)。请查阅用户手册以了

解更多细节信息。

如果我们现在即运行此模型,则它将无限期工作。由于我们只想观察在用户接受产品过程发生时模型行为是怎样的,我们需要在系统达到平衡状态时停止此模型。在此模型中,超过8年购买过程将趋于平稳。由于在此模型中一个单位模型时间对应于一年,因此我们需要在8个单位时间之后停止模型。

设置模型停止条件

1. 在Project 窗口中,点击Simulation 实验项目。

2. 在Properties 窗口的Additional 选项卡中,选中Stop at time选框。在右侧的编辑框中,输入

8。这一模型将在8个单位模型时间后停止。

1.7 运行模型

点击Build 工具条按钮以建造你的工程。如果你的工程中存在错误,则此建造操作失败,显示 Output 窗口,在其中列出你的工程中找到的错误。双击列表中的一个错误,打开此错误的位置,然后改正此错误。

在工程成功建立之后,你可以通过点击

Run 工具条按钮以开始运行此模型。到这里,你一直在AnyLogic TM 的编辑器模式中工作。模型开始运行之后,即切换到查看器模式。在查看器模式中,你可以控制模型执行,查看图表,动态改变参数,等等。

1.8 研究此过程

你可以使用AnyLogic TM 图表(chart )以对所考察过程的动态行为进行研究。

我们将创建一个图表以显示客户数目如何变化。

创建图表

1. 点击Step 工具栏按钮以准备运行模型。

2.

3. 点击

New Chart 工具条按钮。此时即出现一个图表窗口。 选择需要在图表中显示的变量。右键点击图表窗口,从弹出菜单中选择Chart Setup此

时即出现Chart Setup对话框。

4. 向下滚动Variable ,parameters ,and datasets列表,然后双击root.potential_adopters

变量,以将其加入到图表中。

5.

6. 用类似方法加入变量root.adopters 。 点击OK 。

配置图表

1. 点击Step 工具栏按钮以准备运行模型。

2. 右键点击图表窗口,从弹出菜单中选择Chart Options…在出现的对话框中设定图表的时

间范围。

现在点击

Restart 以重新开始模型,然后点击

Run 。图表中显示了变量potential_adopters和adopters 随着仿真过程如何变化。

广告在每段时期内引发固定比例的潜在客户人群进行购买。

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 1 - Simple model.alp.

1.9 考虑口碑的影响

在当前模型中,人们购买产品的原因只是由于受到广告的影响。实际上,广告效应只有在该产品刚刚投放到市场时才起主要作用。随时间推移,人们购买产品的原因更多是由于受到已经购买此产品的熟人的影响。

为考虑口碑的影响,我们应略微修改我们的模型。

修改状态图

1. 在Project 窗口中双击adoption 项目,打开adoption 状态图。 2. 向Adopter 状态加入一个内部转变。点击

Transition

状态的任一边。

工具条按钮,然后点击Adopter

3. 将此转变设置为发生于指定的延时之后。

此转变模拟一个人如何说服其熟人来购买该产品。转变率取决于这个人的说服力和联系频率。

4. 指定转变的行为(action ):

这一转变为此人的一些熟人的状态图产生信号事件。因此,模拟熟人购买该产品的转变即发生。

信号事件通过调用状态图的fireEvent()函数来产生;你可以在类参考手册的StatechartBase 类页面中找到对这个方法的描述。

5. 加入另一个从PotentialAdopter 状态到Adopter 状态的转变。

6. 这一转变模拟了由于口碑影响而带来的产品购买。当信号事件发生后这一转变也将发生。

在此转变的属性页中,从Fire 组合框中选择If signal event occurs,然后指定Signal event的类型。

7. 点击Run 工具条按钮以开始运行模型。你将看到如下图表:

你可以看到一条经典的S 形扩散曲线——这一过程与传染病扩散过程类似。

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 2 - Word of mouth.alp.

1.10 加入产品消耗逻辑

我们创建的模型并未覆盖产品被消耗,被丢弃,或被升级的情况,而这些情况都将引起对此产品的重复购买。

我们将通过假定客户在其购买的第一件产品被丢弃或消耗之后变为潜在客户来建模重复购买行为。

首先,我们定义平均产品寿命时间。

定义产品的平均寿命时间

1. 在Project 窗口中双击Main 项目,打开Main 类图。

2. 创建Discard_Time参数。假定我们的产品的平均活跃使用时间为1年。将此参数设置为

全局(global )。

修改状态图

1. 在Project 窗口中双击adoption 项目,打开adoption 状态图。 2. 加入一个从Adopter 状态到PotentialAdopter 状态的转变。

3. 设置此转变的如下属性:

这样我们就完成了替代产品购买的建模。点击Run 后研究图中的产品扩散过程。

工具条按钮以开始运行模型,然

你可以看到在此模型中未达到市场饱和。

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 3 - Replacement purchases.alp.

1.11 创建空间模型

现在我们希望将我们的模型扩展到空间,在模型空间中定义人的地点。

定义人的地点

1. 在Project 窗口中双击Person 项目,打开Person 类图。

2. 创建实数类型(real )的变量x 和y 。为这两个参数设置相同的起始值。

使用均匀分布函数uniform(),我们将人放置在坐标为0到300之间的随机位置。

创建函数以计算人们之间的距离

1. 在Project 窗口,右键点击Person 项目,然后从弹出菜单中选择New Mathematical

Function…在打开的对话框中,设定函数名称:distance 。

2. 在Properties 窗口中,将函数类型(Function type)设置为real 。 3. 定义参数,以将另一个人的位置坐标传递给此函数。

4. 指定函数表达式(Expression )。

函数sqrt()是AnyLogic TM 预定义的函数。AnyLogic TM 提供了一系列常用函数如sin(),cos(),exp()等,你可以在你的表达式中使用这些函数。在输入表达式时,你可以使用函数向导(Function Wizard ),在此向导中所有预定义函数和变量都列出供选择。为打开函数向导,点击表达式(Expression )框中你希望插入函数名称的位置,然后点击Function Wizard 按钮。滚动向导列表,找到你所需的函数名称,然后双击它。

为了解关于函数及其参数的细节描述,请参考用户手册和类参考手册(查看Func 类页面)。

修改状态图

1. 在Project 窗口中双击adoption 项目,打开adoption 状态图。 2. 点击Adopter 状态的内部转变,然后改变此转变的行为(action )。

现在人们将只与其邻居发生联系。 开始运行模型,测试其行为。

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 4 - Spatial model.alp.

1.12 创建动画

现在我们创建模型动画以可视化我们的过程。AnyLogic TM 允许创建可以在模型仿真过程中改变参数的可交互动画。

首先,创建驱动我们的主体所需的变量。

创建新变量

1. 在Project 窗口中双击Person 项目,打开Person 类图。

2. 创建变量color ,其类型为Color 。Color 是标准Java TM 类,它包含了预定义的颜色如黑

色,白色,青色,紫红色,红色,等等;这个类也允许你创建自定义颜色。这一变量将定义动画中的主体外形颜色。 AnyLogic TM 动画使用动画图表绘制。

创建一个动画图表

1. 在Project 窗口,右键点击Main 项目,然后从弹出菜单中选择New Animation…在打开

的对话框中,为模型动画输入一个名称:Animation 。 动画编辑器(animation editor)窗口将自动打开。

动画图表中的点状框指示了动画画框区域。只在此画框中绘制动画。

为查看预定义的颜色列表以及Color 类提供允许你自定义颜色的方法,请打开

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Color.html或查看你本地安装的java TM 文档。

编辑动画画框

1. 移动画框,使其坐标为(-20, -20),然后改变其大小为(520, 340)。

你可以通过改变画框的X ,Y ,Height ,Weight 属性,或拖动图形手柄(鼠标光标位置显示于状态条上)来移动任一动画画框和改变其大小。 现在我们将绘制如下图所示的动画。

我们希望在动画中显示我们所在区域的居民。我们将用不同颜色的点显示产品现有客户和潜在客户。

拖动explored area动画的限制框

1. 点击Rectangle

工具条按钮。

2. 在图中点击(-10, -10)点,然后按下鼠标键,移动鼠标到(310, 310)。此矩形应与上

图中的实心矩形相似。

现在绘制一个形体,例如小矩形,以标明动画中有一个主体。

绘制主体

1. 点击Rectangle

工具条按钮。

2. 在属性窗口中,指定此矩形的名称(Name )。

3. 设置此矩形的大小。

4. 指定此图形的数目。

我们需要为每个主体都绘制一个矩形。为此我们调用size()函数,以返回多重对象people 所含有的元素数目——即是我们模型中的主体数目。

5. 在动画中定义形体位置。

根据其x 和y 变量的值,对每一个主体分别定义其动画形体的坐标。主体也可以通过agentObject.item(index)函数来访问,其中agentObject 是建模主体的对象名称。

6. 使用如下表达式定义形体的颜色。

这一表达式检测一个人是否为顾客(即检测isAdopter 参数值)。客户将用蓝色点表示,潜在客户用灰色点表示。

现在我们向动画中加入一些标记,以研究多少人已经购买了我们的产品。

加入潜在客户标记

1. 点击

Bar Indicator

工具条按钮。

2. 在区域的限制框中点击正确位置,以将标记放置于动画中。 3. 在Properties 窗口的General 页面中,输入标记的大小:

4. 在Properties 窗口的Bar Indicator页面,选择你希望用这个标记标明的变量。

5. 设置最大显示值(Max value),改变数值颜色(Value color),并清除Show scale选框。

加入客户标志

1. 右键点击绘制的标记,从弹出菜单中选择Copy 。

2. 右键点击图表,从弹出菜单中选择Paste 。新的标记即出现于图中。将此标记放置于潜

在用户标记的右边。

3. 设置Value to indicate为变量adopters ,并且改变Value color。

向标记加入描述标签

1. 点击Text

工具条按钮。

2. 点击左边的标记下方,将标签放置于图中。

3. 定义在所创建的文本框中显示的文本。在Properties 窗口的Text 页面,在Text 编辑框

中输入Potential Adopters。

4. 改变文字字体。在Font 部分,点击Choose 按钮,在弹出的对话框中设置字体为Times

New Roman,大小为8号。

5. 用同样的方法把标签Adopters 放置于右边的标记下方。

现在我们将通过加入改变产品的平均寿命时间的控件,使动画变得可交互。

加入控件

1. 点击

Slider

工具条按钮。

2. 点击图中的标记,将滑块放置于图中。

3. 在Properties 窗口的General 页面中,输入控件的大小:

4. 在Properties 窗口的Slider 页面,选择需要控制的变量。

5. 指定最小和最大值。

6. 在动画中放置三个标签:DiscardTime ——放置于滑块下方;0.5——放置于滑块左边缘

附近;2.5——放置于滑块右边缘附近。

现在我们希望研究一个较长时间段内的扩散过程,因此将模型设置为无限期工作。

移除模型停止条件

1. 在Project 窗口中,点击Simulation 实验项目。

2. 在Properties 窗口的Additional 选项卡中,清除Stop at time选框。 这样我们就完成了创建动画。现在你可以通过点击Run

你可以看到如下图所示的动画。

工具条按钮以开始运行模型。

为增加动画速度,请关闭其他窗口:绘图窗口和根模型对象窗口。

为在运行时获得更好的图像,你可以打开抗锯齿(anti-aliasing )模式,该模式默认情况下被关闭以加快模型执行速度。

打开抗锯齿(anti-aliasing )

1. 点击Animation Settings

选项。

工具条按钮。在出现的对话框中,选择Enable anti-aliasing

为调整执行速度,使用工具条上的Decrease model speed 按钮和Increase model

speed 按钮。

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 5 - Animation.alp.

2. 扩展的产品生命周期模型

本章我们通过考虑细节信息和向你介绍一些AnyLogic 的高级特性来扩展我们的模型。

2.1 广告活动

至此,广告对我们的模型的影响被认为是恒定的。实际上,商家都会周期性地举行广告活动以促进在特定地区的产品销售。我们希望在我们的模型中考虑这个因素。

创建新变量

1. 在Project 窗口中双击Main 项目,打开Main 类图。 2. 创建变量adX ,类型为实数(real )。 3. 创建变量adY ,类型为实数(real )。

4. 创建变量adTime ,类型为实数(real )。设置起始值为: -1。 5. 创建变量adRange ,类型为实数(real )。设置起始值为: 50。

我们需要使用变量adTime 以记载上次广告活动举行的时间,用变量adX 和adY 记载上次促销区域中心的坐标位置,用变量adRange 记载该区域的半径。

我们将使用一个定时器来模拟广告活动,该定时器是AnyLogic TM 提供的一个特殊元素,用于事件规划。

创建定时器

1. 在Project 窗口中双击Main 项目,打开Main 类图。 2. 点击

Timer

工具条按钮,然后点击类图。命名此定时器为adTimer 。

3. 我们需要一个周期重复计时的定时器,因此选择Cyclic 选项。

4. 定义定时器的定时值。

5. 定义定时器的到时行为。

对于在促销区域的主体(在由adRange 指定半径的圆之内),产生其状态图事件信号,同时模拟其购买产品活动的转变发生。

由于现在购买产品使用定时器建模,我们应移除用于模拟由广告引起的产品购买的状态图转变。

修改状态图

1. 在Project 窗口中双击adoption 项目,打开adoption 状态图。

2. 点击从PotentialAdopter 状态到Adopter 状态的转变(即定时值为exponential(adEffect)的

转变),然后按Delete 键将其删除。

现在我们应对动画进行一些细小改动。我们希望使用淡紫色圆标明促销区域。

绘制圆

1. 在Project 窗口中双击animation 项目,打开动画图。 2. 点击Oval

工具条按钮,然后点击animation 图。设置如下形状属性。

圆形位置用adX 和adY 这两个变量定义,标明了当前促销区域中心的位置。只有在促销开始之后的0.2个单位模型时间内,此圆形才可见。

3. 点击Properties 窗口的Oval 选项卡,然后定义此圆的半径为前述定义的adRange 变量。

点击Run

工具条按钮以开始运行模型。

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 6 - Advertising campaigns.alp.

2.2 多产品扩散

上述建立的模型只研究了单个产品的扩散情况。现在我们希望改进我们的模型,使之能够同时研究两个不同产品的扩散情况。

首先,创建一个变量用于定义当前被广告的产品类型。

创建附加参数

1. 在Project 窗口中双击Main 项目,打开Main 类图。 2. 创建参数adColor ,类型为Color 。

现在我们应对动画进行一些细小改动。我们希望用颜色区分不同产品,将一件产品的客户标记为蓝色点,另一件产品的客户标记为红色点。促销区域页将使用该被广告的产品的颜色标记。

修改动画

1. 在Project 窗口中双击animation 项目,打开animation 图。

2. 修改促销区域形状。点击动画图表中的淡紫色圆,然后指定该形体的填充颜色(Fill Color)

为adColor 。

3. 修改主体的动画形状。在动画图中点击agentShape 矩形。在Fill color 属性中,输入

people.item(index).color。现在动画形体的颜色将为该主体定义的颜色——如果一个人是潜在客户,则为灰色;如果他是某个产品的客户,则为红色或蓝色。

现在我们应修改模拟广告活动的定时器的到时行为。

修改定时器的到时行为

1. 在Project 窗口中双击Main 项目,打开Main 类图。 2. 点击结构图中的adTimer 图标。

3. 修改定时器的到时行为。加入如下黑体所示的代码行。

adX = uniform( adRange, 300 - adRange ); adY = uniform( adRange, 300 - adRange ); adTime = getTime();

adColor = uniform() > 0.5 ? Color.blue : Color.red; for (int i=0; i

if ( p.distance(adX,adY)

我们的两个产品都将以相同时间间隔进行促销。

修改状态图

1. 在Project 窗口中双击adoption 项目,打开adoption 状态图。绘制如下的状态图。

2. 加入一个复合状态,此状态包括状态图中的两个现有状态。

3. 将此状态设置为初始。加入一个初始状态指针,并将其指向此状态。点击初始状态指针

(Initial Sate Pointer)状态的边界。

工具条按钮,然后在图中点击此状态上方一点点,然后点击此

4. 删除从PotentialAdopter 状态到Adopter 状态的转变。

5. 修改Adopter 状态内部转变的行为。输入p.adoption.fireEvent(color); 替换掉

p.adoption.fireEvent(“buy”);

6. 加入一个从复合状态到Adopter 状态的转变。设置此转变的如下属性:

7. 点击以选择PotentialAdopter 状态。向该状态的进入行为(Entry action)中加入代码行:

color = Color.lightGray;

点击

Run 况。

工具条按钮以开始运行模型。上述建立的模型研究了两个不同产品的扩散情

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 7 - Multiple products.alp.

2.3 人群移动

在当前模型中,人都固定于预先定义的地点。然而,我们希望使我们的模型更为真实,即使人能够在该区域中四处移动。

创建附加参数

1. 在Project 窗口中双击Person 项目,打开Person 类图。

2. 创建变量oldx 和oldy ,类型为实数(real )。对这两个参数,指定相同的起始值:

3. 创建变量tmoved ,类型为实数(real )。指定如下的起始值:

我们将使用定时器来建模人的移动。

创建定时器

1. 在Project 窗口中双击Person 项目,打开Person 类图。 2. 点击

Timer

工具条按钮,然后点击类图。命名此计时器为moveTimer 。

3. 我们需要一个周

期重复计时的定时器,因此选择

Cyclic 选项。

4. 定义定时器的定时值。

5. 定义定时器的到时行为。

在定时器到时时,当前的模型时间,通过函数getTime()返回,即被存储于变量tmoved 中。变量oldx 和oldy 存储了当前主体的坐标x 和y 。新坐标服从0到300之间的三角分布,且均值为150。

定义函数以平滑移动动画。

1. 在Project 窗口,右键点击Person 项目,然后从弹出菜单中选择New Algorithmic

Function…在打开的对话框中,设定函数名称为animationX. 。

2. 定义函数体:

3. 同样方法定义算法函数animationY 。

现在我们需要对动画作出一些修改。

修改主体的动画形状。

1. 在Project 窗口中双击animation 项目,打开动画图。 2. 点击动画图中的agentShape 矩形,设定如下属性:

这样我们就完成了修改模型。现在你可以通过点击

Run 观察人们在图中区域内走动。

工具条按钮来开始运行模型,并

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 8 - People movement.alp.

2.4 人群迁移

在当前的模型中,一个区域的居民数目是恒定的。实际上,人有可能从一个区域迁移到另外一个区域,我们需要在我们的模型中考虑这个因素。

我们将使用多个定时器定义人的迁移。

模拟人迁入所研究区域

1. 在Project 窗口中双击Main 项目,打开Main 类图。 2. 点击

Timer

工具条按钮,然后点击类图。命名此定时器为inMigration 。

3. 我们需要一个周期重复计时的定时器,因此选择Cyclic 选项。

4. 定义定时器的定时值。

平均情况下,每年有20个人迁入该区域(我们将迁移率指定作为exponential()函数的一个参数)。

5. 指定到时行为:

使用环境对象的setup_agentObject()函数将新的主体加入到模型中,其中agentObject 是建模主体的对象名称。此函数的第一个参数指定了将要创建的Person 类对象名称。第二个参数定义了多重对象people 的位置,新创建的对象即被加入到此位置。

现在我们将模拟人们如何迁出此区域。

模拟人迁出所研究区域

1. 在Project 窗口中双击Person 项目,打开Person 类图。 2. 点击Timer

工具条按钮,然后点击类图。命名此定时器为outMigration 。

3. 这一定时器只定时一次,因此选择Expire once选项。

4. 定义定时器的定时值。

5. 定义定时器的到时行为。

使用环境对象的dispose_agentObject()函数将新的主体移出模型,其中agentObject 是建模主体的对象名称。这一函数的参数定义了哪个主体应被移出。表达式AgentClass.this ,其中AgentClass 是定义了主体的类的名称,指定了当前主体应被移出。

为了解所研究区域中有多少人居住,你可以在图中放置一个标签,显示居民数目。

显示居民数目

1. 在Project 窗口中双击animation 项目,打开animation 图。 2. 在动画中加入文本标签,显示如下文字:

这样我们就完成了创建模型。点击Run

工具条按钮以开始运行模型。

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 9 - People migration.alp.

3. 总结

这一教程向你讲授了在AnyLogic TM 中如何创建基于主体的简单模型。在创建更为复杂的模型时,AnyLogic TM 所提供的示例模型可能会对你有用,这些示例中可能有与你的问题相似的问题,你可以采取这些示例中使用的方法。

你可以在AnyLogic TM 示例包中找到一些基于主体的模型,包括:

-

-

-

-

-

-

此外,如果你需要扩展你的模型,进行超出纯基于主体的建模之外的仿真,你可以在你的模型中无缝使用任何其他AnyLogic TM 建模技术。查阅关于建模技术和AnyLogic TM 技术支持的更多信息,请参考用户手册。

基于主体建模教程

1992-2005 XJ Technologies Company Ltd.

基于主体建模教程

版权所有 1992-2005 XJ Technologies。保留所有权利。

XJ Technologies Company Ltd

[email protected]

http://www.xjtek.com/products/anylogic

2 1992-2005 XJ Technologies http://www.xjtek.com

基于主体建模教程

目录

关于此教程…………………………………………………………………………4 1. 产品生命周期模型………………………………………………………………5 1.1 创建一个新工程………………………………………………………………5 1.2 创建主体……………………………………………………………………6 1.3 定义主体特性………………………………………………………………7 1.4 定义主体行为………………………………………………………………11 1.5 计数产品用户数……………………………………………………………14 1.6 配置模型……………………………………………………………………17 1.7 运行模型……………………………………………………………………18 1.8 研究此过程…………………………………………………………………18 1.9 考虑口碑的影响……………………………………………………………21 1.10 加入产品消耗逻辑…………………………………………………………24 1.11 创建空间模型………………………………………………………………26 1.12 创建动画……………………………………………………………………29 2. 扩展的产品生命周期模型………………………………………………………37 2.1 广告活动……………………………………………………………………37 2.2 多产品扩散…………………………………………………………………40 2.3 人群移动……………………………………………………………………44 2.4 人群迁移……………………………………………………………………47 3. 总结………………………………………………………………………………51

3 1992-2005 XJ Technologies http://www.xjtek.com

关于此教程

AnyLogic TM 支持多种不同的建模技术。本教程覆盖了基于主体(agent-based )建模的步骤,基于主体的建模已经成功地应用于包括生态学,社会学,经济学,交通模拟等等许多领域在内的广泛范围。基于主体的建模用于对市场(主体作为潜在客户),竞争和供应链(主体作为公司),人口(主体作为家庭,个人,或选举人)等进行建模。基于主体的建模允许在假定系统各个基本成员行为的情况下对系统的一般行为进行观察,而不需要关于此系统的任何全局知识。

AnyLogic TM 是唯一允许使用主体创建柔性模型,并且主体在其环境中可以相互交互的仿真工具。AnyLogic TM 支持所有现有的指定主体行为的方法——状态图(statechart ),同步和异步事件规划。

这一教程将简要向你介绍使用AnyLogic TM 创建一个仿真模型的过程。其目的是向你介绍AnyLogic TM 的用户界面和其他许多主要特性。

我们将创建一个简单的示范实例——产品生命周期模型,此模型用于预测新产品的销售情况。在第一节我们将创建经典的Bass 扩散模型。然后我们通过考虑一些细节信息和向你介绍一些AnyLogic TM 的高级特性来将此模型扩展。

请注意在如下文件夹中有一些文件供参考:Examples \ Agent Based Modeling Tutorial ,这些文件中包括了本文所述编辑过程中的一些重要记录。如果你在创建模型过程中遇到任何困难,或你希望将你的模型与参考文件相比较,你可以使用这些参考文件。你可以使用Start Page以打开这些示例。在你关闭你正在编辑的模型之后,Start Page将自动出现。

4 1992-2005 XJ Technologies http://www.xjtek.com

1. 产品生命周期模型

在这一教程中我们将创建产品生命周期模型。这一模型描述了产品的扩散过程。产品的潜在客户会受到广告和客户(那些已经购买了这种新产品的人)的口碑影响而购买产品。

1.1 创建一个新工程

首先,我们将为你的模型创建一个新工程。

创建一个新工程

1. 点击New Project

工具条按钮。此时即出现New Project对话框。

2. 点击Choose Location…按钮,然后浏览找到你希望保存你的工程文件的文件夹。 3. 指定工程名称。在Project name编辑框中,输入Product Life Cycle。 4. 点击OK 。

此时即创建了一个新工程。你可以看到结构图(structure diagram)显示于AnlyLogic TM 工作区中,Project 窗口显示于左侧面板中,Properties 窗口显示于右侧面板中。

5 1992-2005 XJ Technologies http://www.xjtek.com

当在一个工程中进行工作之后,不要忘记点击

Save

以保存此工程。

1.2 创建主体

在创建基于主体的模型时,你要做的第一件事情就是创建主体。主体是基于主体的模型的基本构建模块。基于主体的模型包括多个主体以及它们的环境。根据一个主体与哪些其他主体发生交互,每个主体都被给予一系列规则;这些交互将产生整个系统的总体行为。在这一模型中,主体是人。

为了在AnyLogic TM 中创建主体,你需要使用活动对象类(active object class)定义主体的内部结构,然后创建所需数量的类实例,每一实例即代表一个主体。

创建一个主体

1. 点击New Active Object Class

工具条按钮。

6

1992-2005 XJ Technologies http://www.xjtek.com

2. 在打开的对话框中,指定新类的名称(Name of the new class):Person 。

Person 类图即自动打开。

1.3 定义主体特性

你可以使用类参数(parameter )定义主体属性。由于所有主体都是同一个活动对象类(active object class)的实例,因此对每个主体,其基本的内部结构是相同的。类参数允许为每个主体分别定义其属性。

7 1992-2005 XJ Technologies http://www.xjtek.com

1. 在Project 窗口中,点击Person 项目。 2. 在Properties 窗口,点击New Parameter…

参数属性。

按钮。在打开的Parameter 对话框中,设定

定义每人每年联系的数目

1. 创建参数。输入名称:Contact_Rate。

2. 假定每人每年的联系频率为100。在Default value编辑框中,输入100。

1.

指定此人的说服力,即其与别人的联系中多大比例可以说服其熟人来购买此产品。

定义个人的广告建议性

3. 以同样方法创建参数,在Name 编辑框中输入Ad_Effectiveness。 4. 定义参数数值。在Default value编辑框中,输入0.011。

8 1992-2005 XJ Technologies http://www.xjtek.com

5. 你可以在Description 编辑框中输入对此参数的简短描述。输入文本用于帮助向不熟悉此模

型的人进行解释。

9

1992-2005 XJ Technologies http://www.xjtek.com

你可以看到在Parameters 表格中加入了新的参数。

定义个人的所说服力

1. 将参数命名为Adoption_Fraction。 2. 设定参数值为0.015。

创建附加参数

1. 在Project 窗口中双击Person 项目,打开Person 类图。 2. 点击

New Variable

蓝色圆圈。

工具条按钮,然后点击类图。此时图中即出现一个变量,显示为

10 1992-2005 XJ Technologies http://www.xjtek.com

一旦你将元素放置于结构图中之后,它即被选定,同时其属性将显示于Properties

窗口中。你可以根据你的模型需求,调整元素属性。

请注意Properties 窗口是上下文相关的——根据你所选择的元素类型不同,它将显

示不同的选项。如果稍后调整属性,你应首先在Project 窗口中点击一元素以将其选定,或在结构图中选定它。

3. 改变参数名称。在Properties 窗口中,在Name 编辑框中输入model 。

4. 定义变量类型(Type ):Main 。这里Main 是环境对象类。

5. 指定参数的起始值。

我们需要此变量以简化主体对环境的访问。

6. 创建变量isAdopter ,并且此变量有如下属性:

这一变量将帮助我们了解此个人是现有客户还是潜在客户。

1.4 定义主体行为

主体行为通过状态图(statechart )定义。

创建状态图

1. 在Project 窗口中双击Person 项目,打开Person 类图。

2. 首先,点击

Statechart 工具条按钮,然后点击类图。此时图中即显示状态图图标。

3. 双击此图标。即打开显示如下状态图的图表。

4. 在Properties 窗口中,改变此状态图名称为adoption 。

5. 在状态图中,点击此状态,然后按F2键,将其重命名为PotentialAdopter 。由于起始状

态指针指向此状态,因此它为起始状态。直到此状态变为活跃,这个人将一直保持为潜在客户。

6. 绘制如下的状态图。

7. 点击

State 工具条按钮,以加入更多状态,然后点击PotentialAdopter 状态之下的状

态图标。将此状态命名为Adopter 。这样在这一状态变为活跃时,这个人即变为客户。

8. 加入一个从PotentialAdopter 状态到Adopter 状态的转变。点击

Transition

钮,然后点击上方状态的边缘,然后再点击下方状态的边缘。

9. 在Properties 窗口中,从Fire 下拉选单中选择After timeout,然后指定Timeout 数值。 工具条按

此转变模拟了此人购买产品的过程。决定购买产品的决策时间与此人的广告建议性成指数关系。 exponential()函数是标准AnyLogic TM 随机数发生器。AnyLogic TM 也提供了其他随机

数分布,如正态分布,均匀分布,三角分布等。请参考用户手册(Users’ Manual)以了解所有这些随机数发生器的细节描述。在AnyLogic TM 的类参考手册(Class Reference)中你可以查到发生函数及其参数信息。为打开AnyLogic TM 用户手册或类参考手册,请从Help 菜单中选择对应菜单项。

1.5 计数产品客户

模型的主要目的是研究新产品如何被接受,因此我们希望能够知道在任一时刻有多少人已经购买了我们的产品。我们创建现有客户和潜在客户两个变量以计数产品客户。

创建变量

1. 在Project 窗口中双击Main 项目,打开Main 类图。

2. 创建变量potential_adopters。

3. 创建变量adopters 。

修改状态图

1. 在Project 窗口中双击adoption 项目,打开adoption 状态图。

2. 点击PotentialAdopter 状态。在Properties 窗口中,指定该状态的进入行为(Entry action)

和离开行为(Exit action)。

当进入此状态时,我们将用于计数潜在客户的变量增加1。当离开此状态时,我们将

此变量减少1。为确认所作出的改动,我们调用环境对象的setModified()函数。变量isAdopter 标明此人是否已经购买此产品(如果是,则为true ,否则为false )。

3. 用同样方法,我们设定Adopter 状态的属性。

这样你就成功创建了一个类,此类将定义主体的内部结构。现在向模型中加入主体。为将主体放置于模型环境中,你需要将建模主体(人)的对象封装到建模环境的类(Main )中去。 将主体放置于环境中

1. 在Project 窗口中双击Main 项目,打开Main 类图。

2. 将Person 类从Project 窗口中拖动到Main 类的结构图中。

3. 在Properties 窗口的General 页面中,输入对象的名称(Name ):person 。

4. 指定你希望放置于模型中的主体数量。在Properties 窗口的Replication 页面中,输入对象的数量(Number of objects):1000。

此时将自动创建所指定数量的类实例,每个实例代表一个主体。

这样我们就创建了所需数量的主体。现在我们需要使用类参数(parameters )和状态图

(statechart )来定义主体属性和行为。

1.6 配置模型

模型仿真有一系列特定的设定。一组模型的设定称之为一个实验(experiment )。你可以创建多个替代模型设定,然后只需改变此模型的当前实验即可改变模型工作配置。

实验显示于模型树中的Experiments 项目之下。

默认情况下即已创建一个实验并命名为Simulation 。这是一个简单实验(simple

experiment ),提供了过程可视化的工具。在模型参数起重要作用,并且你需要分

析这些参数如何影响模型行为,或你希望找到你的模型的最优参数时,你也可以

使用多种其他类型的实验(如优化,风险评估,变化测试)。请查阅用户手册以了

解更多细节信息。

如果我们现在即运行此模型,则它将无限期工作。由于我们只想观察在用户接受产品过程发生时模型行为是怎样的,我们需要在系统达到平衡状态时停止此模型。在此模型中,超过8年购买过程将趋于平稳。由于在此模型中一个单位模型时间对应于一年,因此我们需要在8个单位时间之后停止模型。

设置模型停止条件

1. 在Project 窗口中,点击Simulation 实验项目。

2. 在Properties 窗口的Additional 选项卡中,选中Stop at time选框。在右侧的编辑框中,输入

8。这一模型将在8个单位模型时间后停止。

1.7 运行模型

点击Build 工具条按钮以建造你的工程。如果你的工程中存在错误,则此建造操作失败,显示 Output 窗口,在其中列出你的工程中找到的错误。双击列表中的一个错误,打开此错误的位置,然后改正此错误。

在工程成功建立之后,你可以通过点击

Run 工具条按钮以开始运行此模型。到这里,你一直在AnyLogic TM 的编辑器模式中工作。模型开始运行之后,即切换到查看器模式。在查看器模式中,你可以控制模型执行,查看图表,动态改变参数,等等。

1.8 研究此过程

你可以使用AnyLogic TM 图表(chart )以对所考察过程的动态行为进行研究。

我们将创建一个图表以显示客户数目如何变化。

创建图表

1. 点击Step 工具栏按钮以准备运行模型。

2.

3. 点击

New Chart 工具条按钮。此时即出现一个图表窗口。 选择需要在图表中显示的变量。右键点击图表窗口,从弹出菜单中选择Chart Setup此

时即出现Chart Setup对话框。

4. 向下滚动Variable ,parameters ,and datasets列表,然后双击root.potential_adopters

变量,以将其加入到图表中。

5.

6. 用类似方法加入变量root.adopters 。 点击OK 。

配置图表

1. 点击Step 工具栏按钮以准备运行模型。

2. 右键点击图表窗口,从弹出菜单中选择Chart Options…在出现的对话框中设定图表的时

间范围。

现在点击

Restart 以重新开始模型,然后点击

Run 。图表中显示了变量potential_adopters和adopters 随着仿真过程如何变化。

广告在每段时期内引发固定比例的潜在客户人群进行购买。

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 1 - Simple model.alp.

1.9 考虑口碑的影响

在当前模型中,人们购买产品的原因只是由于受到广告的影响。实际上,广告效应只有在该产品刚刚投放到市场时才起主要作用。随时间推移,人们购买产品的原因更多是由于受到已经购买此产品的熟人的影响。

为考虑口碑的影响,我们应略微修改我们的模型。

修改状态图

1. 在Project 窗口中双击adoption 项目,打开adoption 状态图。 2. 向Adopter 状态加入一个内部转变。点击

Transition

状态的任一边。

工具条按钮,然后点击Adopter

3. 将此转变设置为发生于指定的延时之后。

此转变模拟一个人如何说服其熟人来购买该产品。转变率取决于这个人的说服力和联系频率。

4. 指定转变的行为(action ):

这一转变为此人的一些熟人的状态图产生信号事件。因此,模拟熟人购买该产品的转变即发生。

信号事件通过调用状态图的fireEvent()函数来产生;你可以在类参考手册的StatechartBase 类页面中找到对这个方法的描述。

5. 加入另一个从PotentialAdopter 状态到Adopter 状态的转变。

6. 这一转变模拟了由于口碑影响而带来的产品购买。当信号事件发生后这一转变也将发生。

在此转变的属性页中,从Fire 组合框中选择If signal event occurs,然后指定Signal event的类型。

7. 点击Run 工具条按钮以开始运行模型。你将看到如下图表:

你可以看到一条经典的S 形扩散曲线——这一过程与传染病扩散过程类似。

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 2 - Word of mouth.alp.

1.10 加入产品消耗逻辑

我们创建的模型并未覆盖产品被消耗,被丢弃,或被升级的情况,而这些情况都将引起对此产品的重复购买。

我们将通过假定客户在其购买的第一件产品被丢弃或消耗之后变为潜在客户来建模重复购买行为。

首先,我们定义平均产品寿命时间。

定义产品的平均寿命时间

1. 在Project 窗口中双击Main 项目,打开Main 类图。

2. 创建Discard_Time参数。假定我们的产品的平均活跃使用时间为1年。将此参数设置为

全局(global )。

修改状态图

1. 在Project 窗口中双击adoption 项目,打开adoption 状态图。 2. 加入一个从Adopter 状态到PotentialAdopter 状态的转变。

3. 设置此转变的如下属性:

这样我们就完成了替代产品购买的建模。点击Run 后研究图中的产品扩散过程。

工具条按钮以开始运行模型,然

你可以看到在此模型中未达到市场饱和。

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 3 - Replacement purchases.alp.

1.11 创建空间模型

现在我们希望将我们的模型扩展到空间,在模型空间中定义人的地点。

定义人的地点

1. 在Project 窗口中双击Person 项目,打开Person 类图。

2. 创建实数类型(real )的变量x 和y 。为这两个参数设置相同的起始值。

使用均匀分布函数uniform(),我们将人放置在坐标为0到300之间的随机位置。

创建函数以计算人们之间的距离

1. 在Project 窗口,右键点击Person 项目,然后从弹出菜单中选择New Mathematical

Function…在打开的对话框中,设定函数名称:distance 。

2. 在Properties 窗口中,将函数类型(Function type)设置为real 。 3. 定义参数,以将另一个人的位置坐标传递给此函数。

4. 指定函数表达式(Expression )。

函数sqrt()是AnyLogic TM 预定义的函数。AnyLogic TM 提供了一系列常用函数如sin(),cos(),exp()等,你可以在你的表达式中使用这些函数。在输入表达式时,你可以使用函数向导(Function Wizard ),在此向导中所有预定义函数和变量都列出供选择。为打开函数向导,点击表达式(Expression )框中你希望插入函数名称的位置,然后点击Function Wizard 按钮。滚动向导列表,找到你所需的函数名称,然后双击它。

为了解关于函数及其参数的细节描述,请参考用户手册和类参考手册(查看Func 类页面)。

修改状态图

1. 在Project 窗口中双击adoption 项目,打开adoption 状态图。 2. 点击Adopter 状态的内部转变,然后改变此转变的行为(action )。

现在人们将只与其邻居发生联系。 开始运行模型,测试其行为。

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 4 - Spatial model.alp.

1.12 创建动画

现在我们创建模型动画以可视化我们的过程。AnyLogic TM 允许创建可以在模型仿真过程中改变参数的可交互动画。

首先,创建驱动我们的主体所需的变量。

创建新变量

1. 在Project 窗口中双击Person 项目,打开Person 类图。

2. 创建变量color ,其类型为Color 。Color 是标准Java TM 类,它包含了预定义的颜色如黑

色,白色,青色,紫红色,红色,等等;这个类也允许你创建自定义颜色。这一变量将定义动画中的主体外形颜色。 AnyLogic TM 动画使用动画图表绘制。

创建一个动画图表

1. 在Project 窗口,右键点击Main 项目,然后从弹出菜单中选择New Animation…在打开

的对话框中,为模型动画输入一个名称:Animation 。 动画编辑器(animation editor)窗口将自动打开。

动画图表中的点状框指示了动画画框区域。只在此画框中绘制动画。

为查看预定义的颜色列表以及Color 类提供允许你自定义颜色的方法,请打开

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Color.html或查看你本地安装的java TM 文档。

编辑动画画框

1. 移动画框,使其坐标为(-20, -20),然后改变其大小为(520, 340)。

你可以通过改变画框的X ,Y ,Height ,Weight 属性,或拖动图形手柄(鼠标光标位置显示于状态条上)来移动任一动画画框和改变其大小。 现在我们将绘制如下图所示的动画。

我们希望在动画中显示我们所在区域的居民。我们将用不同颜色的点显示产品现有客户和潜在客户。

拖动explored area动画的限制框

1. 点击Rectangle

工具条按钮。

2. 在图中点击(-10, -10)点,然后按下鼠标键,移动鼠标到(310, 310)。此矩形应与上

图中的实心矩形相似。

现在绘制一个形体,例如小矩形,以标明动画中有一个主体。

绘制主体

1. 点击Rectangle

工具条按钮。

2. 在属性窗口中,指定此矩形的名称(Name )。

3. 设置此矩形的大小。

4. 指定此图形的数目。

我们需要为每个主体都绘制一个矩形。为此我们调用size()函数,以返回多重对象people 所含有的元素数目——即是我们模型中的主体数目。

5. 在动画中定义形体位置。

根据其x 和y 变量的值,对每一个主体分别定义其动画形体的坐标。主体也可以通过agentObject.item(index)函数来访问,其中agentObject 是建模主体的对象名称。

6. 使用如下表达式定义形体的颜色。

这一表达式检测一个人是否为顾客(即检测isAdopter 参数值)。客户将用蓝色点表示,潜在客户用灰色点表示。

现在我们向动画中加入一些标记,以研究多少人已经购买了我们的产品。

加入潜在客户标记

1. 点击

Bar Indicator

工具条按钮。

2. 在区域的限制框中点击正确位置,以将标记放置于动画中。 3. 在Properties 窗口的General 页面中,输入标记的大小:

4. 在Properties 窗口的Bar Indicator页面,选择你希望用这个标记标明的变量。

5. 设置最大显示值(Max value),改变数值颜色(Value color),并清除Show scale选框。

加入客户标志

1. 右键点击绘制的标记,从弹出菜单中选择Copy 。

2. 右键点击图表,从弹出菜单中选择Paste 。新的标记即出现于图中。将此标记放置于潜

在用户标记的右边。

3. 设置Value to indicate为变量adopters ,并且改变Value color。

向标记加入描述标签

1. 点击Text

工具条按钮。

2. 点击左边的标记下方,将标签放置于图中。

3. 定义在所创建的文本框中显示的文本。在Properties 窗口的Text 页面,在Text 编辑框

中输入Potential Adopters。

4. 改变文字字体。在Font 部分,点击Choose 按钮,在弹出的对话框中设置字体为Times

New Roman,大小为8号。

5. 用同样的方法把标签Adopters 放置于右边的标记下方。

现在我们将通过加入改变产品的平均寿命时间的控件,使动画变得可交互。

加入控件

1. 点击

Slider

工具条按钮。

2. 点击图中的标记,将滑块放置于图中。

3. 在Properties 窗口的General 页面中,输入控件的大小:

4. 在Properties 窗口的Slider 页面,选择需要控制的变量。

5. 指定最小和最大值。

6. 在动画中放置三个标签:DiscardTime ——放置于滑块下方;0.5——放置于滑块左边缘

附近;2.5——放置于滑块右边缘附近。

现在我们希望研究一个较长时间段内的扩散过程,因此将模型设置为无限期工作。

移除模型停止条件

1. 在Project 窗口中,点击Simulation 实验项目。

2. 在Properties 窗口的Additional 选项卡中,清除Stop at time选框。 这样我们就完成了创建动画。现在你可以通过点击Run

你可以看到如下图所示的动画。

工具条按钮以开始运行模型。

为增加动画速度,请关闭其他窗口:绘图窗口和根模型对象窗口。

为在运行时获得更好的图像,你可以打开抗锯齿(anti-aliasing )模式,该模式默认情况下被关闭以加快模型执行速度。

打开抗锯齿(anti-aliasing )

1. 点击Animation Settings

选项。

工具条按钮。在出现的对话框中,选择Enable anti-aliasing

为调整执行速度,使用工具条上的Decrease model speed 按钮和Increase model

speed 按钮。

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 5 - Animation.alp.

2. 扩展的产品生命周期模型

本章我们通过考虑细节信息和向你介绍一些AnyLogic 的高级特性来扩展我们的模型。

2.1 广告活动

至此,广告对我们的模型的影响被认为是恒定的。实际上,商家都会周期性地举行广告活动以促进在特定地区的产品销售。我们希望在我们的模型中考虑这个因素。

创建新变量

1. 在Project 窗口中双击Main 项目,打开Main 类图。 2. 创建变量adX ,类型为实数(real )。 3. 创建变量adY ,类型为实数(real )。

4. 创建变量adTime ,类型为实数(real )。设置起始值为: -1。 5. 创建变量adRange ,类型为实数(real )。设置起始值为: 50。

我们需要使用变量adTime 以记载上次广告活动举行的时间,用变量adX 和adY 记载上次促销区域中心的坐标位置,用变量adRange 记载该区域的半径。

我们将使用一个定时器来模拟广告活动,该定时器是AnyLogic TM 提供的一个特殊元素,用于事件规划。

创建定时器

1. 在Project 窗口中双击Main 项目,打开Main 类图。 2. 点击

Timer

工具条按钮,然后点击类图。命名此定时器为adTimer 。

3. 我们需要一个周期重复计时的定时器,因此选择Cyclic 选项。

4. 定义定时器的定时值。

5. 定义定时器的到时行为。

对于在促销区域的主体(在由adRange 指定半径的圆之内),产生其状态图事件信号,同时模拟其购买产品活动的转变发生。

由于现在购买产品使用定时器建模,我们应移除用于模拟由广告引起的产品购买的状态图转变。

修改状态图

1. 在Project 窗口中双击adoption 项目,打开adoption 状态图。

2. 点击从PotentialAdopter 状态到Adopter 状态的转变(即定时值为exponential(adEffect)的

转变),然后按Delete 键将其删除。

现在我们应对动画进行一些细小改动。我们希望使用淡紫色圆标明促销区域。

绘制圆

1. 在Project 窗口中双击animation 项目,打开动画图。 2. 点击Oval

工具条按钮,然后点击animation 图。设置如下形状属性。

圆形位置用adX 和adY 这两个变量定义,标明了当前促销区域中心的位置。只有在促销开始之后的0.2个单位模型时间内,此圆形才可见。

3. 点击Properties 窗口的Oval 选项卡,然后定义此圆的半径为前述定义的adRange 变量。

点击Run

工具条按钮以开始运行模型。

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 6 - Advertising campaigns.alp.

2.2 多产品扩散

上述建立的模型只研究了单个产品的扩散情况。现在我们希望改进我们的模型,使之能够同时研究两个不同产品的扩散情况。

首先,创建一个变量用于定义当前被广告的产品类型。

创建附加参数

1. 在Project 窗口中双击Main 项目,打开Main 类图。 2. 创建参数adColor ,类型为Color 。

现在我们应对动画进行一些细小改动。我们希望用颜色区分不同产品,将一件产品的客户标记为蓝色点,另一件产品的客户标记为红色点。促销区域页将使用该被广告的产品的颜色标记。

修改动画

1. 在Project 窗口中双击animation 项目,打开animation 图。

2. 修改促销区域形状。点击动画图表中的淡紫色圆,然后指定该形体的填充颜色(Fill Color)

为adColor 。

3. 修改主体的动画形状。在动画图中点击agentShape 矩形。在Fill color 属性中,输入

people.item(index).color。现在动画形体的颜色将为该主体定义的颜色——如果一个人是潜在客户,则为灰色;如果他是某个产品的客户,则为红色或蓝色。

现在我们应修改模拟广告活动的定时器的到时行为。

修改定时器的到时行为

1. 在Project 窗口中双击Main 项目,打开Main 类图。 2. 点击结构图中的adTimer 图标。

3. 修改定时器的到时行为。加入如下黑体所示的代码行。

adX = uniform( adRange, 300 - adRange ); adY = uniform( adRange, 300 - adRange ); adTime = getTime();

adColor = uniform() > 0.5 ? Color.blue : Color.red; for (int i=0; i

if ( p.distance(adX,adY)

我们的两个产品都将以相同时间间隔进行促销。

修改状态图

1. 在Project 窗口中双击adoption 项目,打开adoption 状态图。绘制如下的状态图。

2. 加入一个复合状态,此状态包括状态图中的两个现有状态。

3. 将此状态设置为初始。加入一个初始状态指针,并将其指向此状态。点击初始状态指针

(Initial Sate Pointer)状态的边界。

工具条按钮,然后在图中点击此状态上方一点点,然后点击此

4. 删除从PotentialAdopter 状态到Adopter 状态的转变。

5. 修改Adopter 状态内部转变的行为。输入p.adoption.fireEvent(color); 替换掉

p.adoption.fireEvent(“buy”);

6. 加入一个从复合状态到Adopter 状态的转变。设置此转变的如下属性:

7. 点击以选择PotentialAdopter 状态。向该状态的进入行为(Entry action)中加入代码行:

color = Color.lightGray;

点击

Run 况。

工具条按钮以开始运行模型。上述建立的模型研究了两个不同产品的扩散情

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 7 - Multiple products.alp.

2.3 人群移动

在当前模型中,人都固定于预先定义的地点。然而,我们希望使我们的模型更为真实,即使人能够在该区域中四处移动。

创建附加参数

1. 在Project 窗口中双击Person 项目,打开Person 类图。

2. 创建变量oldx 和oldy ,类型为实数(real )。对这两个参数,指定相同的起始值:

3. 创建变量tmoved ,类型为实数(real )。指定如下的起始值:

我们将使用定时器来建模人的移动。

创建定时器

1. 在Project 窗口中双击Person 项目,打开Person 类图。 2. 点击

Timer

工具条按钮,然后点击类图。命名此计时器为moveTimer 。

3. 我们需要一个周

期重复计时的定时器,因此选择

Cyclic 选项。

4. 定义定时器的定时值。

5. 定义定时器的到时行为。

在定时器到时时,当前的模型时间,通过函数getTime()返回,即被存储于变量tmoved 中。变量oldx 和oldy 存储了当前主体的坐标x 和y 。新坐标服从0到300之间的三角分布,且均值为150。

定义函数以平滑移动动画。

1. 在Project 窗口,右键点击Person 项目,然后从弹出菜单中选择New Algorithmic

Function…在打开的对话框中,设定函数名称为animationX. 。

2. 定义函数体:

3. 同样方法定义算法函数animationY 。

现在我们需要对动画作出一些修改。

修改主体的动画形状。

1. 在Project 窗口中双击animation 项目,打开动画图。 2. 点击动画图中的agentShape 矩形,设定如下属性:

这样我们就完成了修改模型。现在你可以通过点击

Run 观察人们在图中区域内走动。

工具条按钮来开始运行模型,并

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 8 - People movement.alp.

2.4 人群迁移

在当前的模型中,一个区域的居民数目是恒定的。实际上,人有可能从一个区域迁移到另外一个区域,我们需要在我们的模型中考虑这个因素。

我们将使用多个定时器定义人的迁移。

模拟人迁入所研究区域

1. 在Project 窗口中双击Main 项目,打开Main 类图。 2. 点击

Timer

工具条按钮,然后点击类图。命名此定时器为inMigration 。

3. 我们需要一个周期重复计时的定时器,因此选择Cyclic 选项。

4. 定义定时器的定时值。

平均情况下,每年有20个人迁入该区域(我们将迁移率指定作为exponential()函数的一个参数)。

5. 指定到时行为:

使用环境对象的setup_agentObject()函数将新的主体加入到模型中,其中agentObject 是建模主体的对象名称。此函数的第一个参数指定了将要创建的Person 类对象名称。第二个参数定义了多重对象people 的位置,新创建的对象即被加入到此位置。

现在我们将模拟人们如何迁出此区域。

模拟人迁出所研究区域

1. 在Project 窗口中双击Person 项目,打开Person 类图。 2. 点击Timer

工具条按钮,然后点击类图。命名此定时器为outMigration 。

3. 这一定时器只定时一次,因此选择Expire once选项。

4. 定义定时器的定时值。

5. 定义定时器的到时行为。

使用环境对象的dispose_agentObject()函数将新的主体移出模型,其中agentObject 是建模主体的对象名称。这一函数的参数定义了哪个主体应被移出。表达式AgentClass.this ,其中AgentClass 是定义了主体的类的名称,指定了当前主体应被移出。

为了解所研究区域中有多少人居住,你可以在图中放置一个标签,显示居民数目。

显示居民数目

1. 在Project 窗口中双击animation 项目,打开animation 图。 2. 在动画中加入文本标签,显示如下文字:

这样我们就完成了创建模型。点击Run

工具条按钮以开始运行模型。

此处可用的参考模型在 Examples \ Agent Based Modeling Tutorial Models \ Product

Life Cycle 9 - People migration.alp.

3. 总结

这一教程向你讲授了在AnyLogic TM 中如何创建基于主体的简单模型。在创建更为复杂的模型时,AnyLogic TM 所提供的示例模型可能会对你有用,这些示例中可能有与你的问题相似的问题,你可以采取这些示例中使用的方法。

你可以在AnyLogic TM 示例包中找到一些基于主体的模型,包括:

-

-

-

-

-

-

此外,如果你需要扩展你的模型,进行超出纯基于主体的建模之外的仿真,你可以在你的模型中无缝使用任何其他AnyLogic TM 建模技术。查阅关于建模技术和AnyLogic TM 技术支持的更多信息,请参考用户手册。


相关内容

  • 论文书写模板
  • 分类号: 单位代码:10220 密 级: 论文题目: 基于PLC的采油联合站控制系统研究 控制工程 □全日制 ■非全日制 生: 王 建 智 段玉波 教授 校外导师: 张 南 高级工程师 入学时间:20 年 月 论文完成时间:20 年 月 Thesis for the Graduate Candida ...

  • 工作流管理系统
  • 要 随着计算机在日常工作中的广泛应用,人们的许多工作已经依靠计算机来完成,与此同时,各种类型的信息系统也被广泛使用来支持这些工作.但是这些系统基本上都是独立运行的,相互之间缺乏必要的交互,协作与感知,从而使得他们子协调多个人的活动,以协同完成某一个共同的任务反面有比较严重的不足.这也是工作流管理系统 ...

  • 基于Pro E的全参数化腹板式齿轮建模
  • 基于Pro E的全参数化腹板式齿轮建模 摘要:在Pro/E环境下,结合腹板式齿轮的经验公式和键槽的标准系列,把齿轮的控制尺寸添加到参数化模块里,建立齿轮尺寸与参数间的对应关系,真正实现渐开线圆柱齿轮建模的全参数化,从而达到缩短齿轮设计周期.减少重复工作.提高设计效率的目的. 关键词:Pro/E:齿轮 ...

  • 玩具飞机毕业论文
  • 武汉轻工大学 设计(论文)题目: 玩具飞机的三维建模与ADAMS仿真 姓名: 高帅 学号: 100309912 院(系): 机械工程学院 专业: 机械制造及其自动化 指导教师: 曹梅丽 2014年5月20日 摘要 虚拟样机技术是上世纪80年逐渐兴起.基于计算机技术的一个新概念.从国内外对虚拟样机技术 ...

  • 数字城市三维建模
  • 1数字城市简介 定义:以计算机技术.多媒体技术和大规模存储技术为基础,以宽带网络为纽带,运用遥感.全球定位系统.地理信息系统.遥测.仿真-虚拟等技术,对城市进行多分辨率.多尺度.多时空和多种类的三维描述,即利用信息技术手段把城市的过去.现状和未来的全部内容在网络上进行数字化虚拟实现. 美国前总统戈尔 ...

  • BIM论文 ▏▏基于CATIA的钢桁架拱桥建模研究
  • 北京华筑建筑科学研究院专家团队及各专业高级工程师团队联合发表各专业BIM学术论文,每周二.四,小编都将为大家定期推送一篇学术论文,敬请期待. 本期论文简介 作者:华筑-比目鱼专家 赵雪锋  刘占省 高级工程师  杨露  郑晓磊  刘继 论文题目:<基于CATIA的钢桁架拱桥建模研究> 刊 ...

  • 南方电网一体化运行数据中心建设方案研究_梁寿愚
  • DOI:10.13648/j.cnki.issn1674-0629.2013.05.001 2013年第7卷第5期2013Vol. 7No. 5 南方电网技术 SOUTHERNPOWERSYSTEM TECHNOLOGY 中图分类号:TM734:TP274 特约专稿Featured Articles ...

  • 塑料异型材挤出模头模架CAD系统研究
  • 第43卷第4期2015年4月塑料工业 CHINA PLASTICS INDUSTRY ·37· 塑料异型材挤出模头模架CAD 系统研究 李 力,唐红涛,郭顺生,张 良,罗易彬 (武汉理工大学机电工程学院,湖北武汉430000) * 摘要:塑料异型材挤出模头形状复杂,但其模架部分装配结构相对固定,以塑 ...

  • 基于实例的产品设计知识获取方法及实现
  • 第14卷第1l期2002年11月 计算机辅助设计与图形学学报 JOURNALOFCOMPUTERAIDEDDESIGN&COMPUTERGRAPHICS V01.14.NO11 NOV..2002 基于实例的产品设计知识获取方法及实现 凌卫青赵艾萍谢友柏 西安交强大学润滑理论丝轴承母f究所 ...