? 水平翻转被封装对象
1. 选中此被封装的对象
2. 点击Flip Horizontal(水平翻转)工具条按钮,或者
在结构图中右键点击被封装的对象,然后从弹出菜单中选择Flip Horizontal(水平翻转),或者
在主菜单中选择Draw|Flip Horizontal(绘制|水平翻转)。 被封装的对象可以为单一对象,或者复数对象(请不要将这个概念与模型重复混淆)。一个
复数对象代表一组属于同一类的活动对象。对象重复使你可以非常经济地表述由具有任意相互连接的对象所组成的复杂结构。在父类的结构图中,显示的复数对象名称后面将加上一个星号(如图12)。请查看第2章“复数对象”,以了解关于复数对象的细节描述。
1.5.5 根对象
一个AnyLogicTM模型是由互相封装的活动对象类所构成的一棵树(如图13)。由于每个活动对象通常代表模型中的一个逻辑部分,因此一个模型可以被分解到若干个细节层次。树的根称之为根对象。根对象代表了你的模型中的最高抽象层次。当你指定根对象的类时,你即告诉了AnyLogicTM在何处开始创建模型。
图13. 活动对象树
由于你可以修改模型的根对象,这样AnyLogicTM就可以支持简单的模型修改方法。你可以在同一个工程中创建若干个具有不同根对象的实验。这样你就可以通过改变当前实验来方便地调整你的模型结构。
? 为一个实验设置根对象
1. 在Project(工程)窗口中点击此实验。
2. 在Properties(属性)窗口,从Root object(根对象)下拉列表中选择此实验的根对象。 例如,你可以建模一辆汽车。你定义了Automobile类,这个类代表了你的模型中的最高抽象层次,因此你设置这个类为根对象类。此类中封装了代表汽车零部件的对象:轮胎,发动机,化油器,等等。这些部件也可以封装其他代表其中零件的对象,依此类推。然而,你可能需要将注意力集中在汽车的发动机上。因此你可以简单地设置Engine类为你模型的根对象类。反之亦然,你可能需要建模一个车库。这种情况下你需要在你的模型中创建新的抽象层次,并将其设置为模型等级树的顶层。与其他一些已对模型根对象进行详细定义的建模工具不同,在AnyLogicTM中你可以用非常简单的方法改变模型的结构。例如,在上面所述的例子中,进行如下操作:
1. 定义类Garage,以代表车库。
2. 将已经创建好的代表汽车的类封装到Garage类中。 3. 创建一个新的仿真实验,并将它设置为当前实验。 4. 将类Garage作为所创建的实验的根对象类。
1.5.6 活动对象的数据
你可以通过定义参数和变量来定义活动对象的数据。你也可以通过编写你自己的JavaTM代码来定义类成员变量。
1.5.6.1 参数
活动对象可以有参数。通常情况下,参数用于参数化地表示对象。当对象实例具有类中所描述的相同行为,但行为的参数值不同时,即需要使用这些参数。所有的参数在模型执行过程中都可见并且可以更改。这样你就可以在运行时通过更改参数来方便地调整你的模型。活动对象参数可以被关联到被封装的对象的参数上。这种情况下,参数的改变即被沿着活动对象树中的参数依赖关系传播下去。请查看第3章“参数”以了解对参数的细节的描述。
如果你需要建模一些数据单元随时间的连续变化,请使用变量,而不是参数。
1.5.6.2 变量
如果你需要定义一些数据单元(可能会随时间连续变化),你可以定义一个变量。一个变量可以为任意的标量类型,矩阵,或超矩阵。变量可以与其他活动对象共享。变量可以出现于随时间连续变化的微分和代数方程式,以及模型值中。在模型执行时,可以在AnyLogicTM用户界面中对变量进行观察,并且可以通过用户界面更改变量。请查看第4章“变量”以了解对变量的细节的描述。
1.5.6.3 类成员变量
你可以在活动对象类的代码窗口的Additional class code(附加的类代码)段声明JavaTM成员变量。你可以在这一对象中访问这些数据成员。请查看1.5.9“为活动对象编辑代码”以了解细节信息。
如果你只需要在一个活动对象内部,且只在离散的时刻(即,既不与其他对象共享,亦不会连续变化)对一个数据项进行访问,且你不需要在模型执行时观察或更改此数据项,则你可以声明一个成员变量。其他情况,请声明一个普通变量。
1.5.7 活动对象的行为
活动对象可以具有内部的行为。在AnyLogicTM中你可以定义离散时间行为,连续时间行为,以及混合行为。
? 连续的过程用具有连续变化变量的微分和代数方程来描述。
? 在非常简单的情况下,对象内部的离散行为可以使用定时器来定义;在事件和时间顺
序变得更为复杂的时候可以使用状态图(扩展的状态机)来定义。 ? 当离散和连续时间行为之间存在相互依赖关系时,则需要混合模型。你可以使用混合
状态图来定义混合的行为。
1.5.7.1 方程式
连续时间的行为可以通过方程式来定义。你可以定义一组微分方程,代数方程,和公式,以描述变量随时间的连续变化。请查看第5章“方程式”以了解关于方程式的细节描述。
1.5.7.2 定时器
对象内部的行为可以用定时器来定义。定时器用于计划一些用户定义的行为。在AnyLogicTM中有静态和动态两种定时器。后者用于计划多重事件。请查看第8章“定时器”,以了解关于定时器使用的细节描述。
1.5.7.3 状态图
在活动对象的生命期内,活动对象将对外部及内部事件和条件作出反应,执行操作。活动对象内部存在状态,即表明执行操作的顺序起重要作用。对某些对象,这一操作的事件顺序和时间顺序十分普遍,使得最佳的选择是使用状态转换图——状态图——来描述这些对象的行为。状态图用于显示给定某一给定算法的状态空间,导致从一个状态到另一个状态转变的事件,以及由于状态转变引起的行为。AnyLogicTM支持混合状态图——这是将离散逻辑和连续事件行为结合起来的最自然最有效的方法。在混合状态图中,你可以将一组方程式与状态图的一个状态相关联。状态转换将使连续行为发生改变。同时,你可以指定一个由连续变化变量决定的条件来触发一个转变。连续过程将驱动离散逻辑。请查看第9章“状态图”以了解对状态图的细节描述。
1.5.8 活动对象之间的相互作用
AnyLogicTM支持连续时间和离散时间的活动对象相互作用机制。结合这些机制,你可以创建活动对象的复杂接口。
1.5.8.1 变量共享
变量共享是AnyLogicTM中的连续时间相互作用机制。这些变量可以暴露于活动对象的接口之中,并且与其他活动对象共享。当属于不同活动对象的两个接口变量被关联到一起时,一个变量的(设置为输出)变化将立刻传播到另一个变量(设置为输入)那里。这就提供了连续和/或离散时间的对象相互作用。请参考第4章“变量”以了解关于变量和变量共享的细节信息。
1.5.8.2 消息传递
消息传递是AnyLogicTM中的离散时间相互作用机制。这一机制的概念是在活动对象之间传递数据单元——消息。消息在活动对象的特殊元素——端口——之间传递,并且被沿着连接线
进行导向,这些连接线将端口连接起来。消息传递可以建模通知或信号机制——在这种情况下,消息代表控制系统中被传递的命令或信号;消息传递也可以建模实体流——在这种情况下,消息用于建模现实世界中的不同对象,例如,产品,人员,卡车等等,或者网络中被传输的数据包。请参考第7章“消息传递”,以了解对端口和消息传递的细节描述。
1.5.8.3在对象之间建立相互作用
为在对象之间建立相互作用,你需要使用连接器将不同活动对象上的对应接口元素连接起来。一个连接器是一条连接两个端口或两个变量的线条。在AnyLogicTM中,连接器用于创建拓扑结构。将两个端口连接起来即代表消息将在它们之间传递。将变量连接起来即表明这些变量在任意时刻都将具有相同的值(输出变量的值将被传递到输入变量那里)。 接口元素在结构图中显示为被封装对象的边界上的小形体(请查看图14)。端口显示为方块,变量显示为三角形(指向对象内部的三角形代表输入变量,指向对象外部的三角形代表输出变量)。由于界面元素反映了一个被封装对象类的接口,因此你不能添加,删除,或移动界面元素。
图14 一个被封装对象的接口元素
被封装对象的接口元素具有如下属性: 属性
Name(名称)——[只读]此接口元素的名称
Show name(显示名称)——如果设置了此属性,则在结构他中将显示此接口元素的名称。
? 连接被封装对象的接口元素
1. 拖动一个被封装对象的接口元素到另一个被封装对象的接口元素上,或者
点击Connector(连接器)工具条按钮,点击第一个接口元素,然后点击第二个接口元素,或者
在主菜单中选择Draw|Structure|Connector(绘制|结构|连接器),点击第一个接口元素,然后点击第二个接口元素。
此时即出现连接两个接口元素的连接器(如图15)。

