跳到主要内容

实体间交互

通用交互

多主体系统仿真建模最重要的部分之一就是定义交互机制

  • 建模不同主体间交互时,需要站在一个主体视角下解决"找谁"和"做什么"的问题
例子
  • DeFi用户Agent 找DEX Agent交易某种代币
  • DeFi借贷协议Agent根据Oracle协议Agent的提供的价格更新抵押因子
  • C天体根据A和B天体状态更新运动状态
  • 每个元胞根据邻居状态更新自己下一步状态
  • 所谓"不同主体间",包括不同实体种群的个体之间、同种群中不同个体之间、同种群个体与观察者之间、不同种群观察者之间
  • 交互方式:包括获取主体对象、访问对象状态和触发对象行为
  • 由于 HoloMind 以流程表达实体行为,所以以下各种形式交互都是指在流程内建模的方法

同种群交互

  • 个体的行为可以直接调用自己的另一个行为
  • 个体可以直接访问观察者的属性,调用观察者行为
  • 个体或观察者不能直接访问本种群其它个体属性或调用其行为
提示

更普遍的交互方式是任意种群个体间的交互,详见下

通过请求交互

在实体行为流程中使用请求组件可以获取对方对象本身、访问对方属性、触发对方行为

提示

请求是应用最多的交互方式,在确定目标实体方面提供了强大的方法

请求获得目标实体

  • 相当于Find someone,以主体视角下解决"找谁"的问题,可以使用请求组件的默认模式
  • 使用请求组件的三种形式都能获得目标实体对象
  • 在当前流程请求动作后计算中以"This.Entity"访问 ,或后续组件的计算中以 "ask_component_name.Entity" 访问请求到的实体对象

请求访问对象属性

  • 访问对方属性相当于Ask someone's Property,使用请求组件的访问模式

  • 仅限于访问单个体或观察者的若干属性的场合

  • 使用请求到的属性

    获取的属性可以被添加其引用对象到当前画布用于图形化建模,也可以在当前流程请求动作后计算中以"This.property_name"形式访问,或后续组件的计算公式中以 "ask_component_name.property_name" 形式访问

提示

严格意义上,请求可以面向任何对象包括请求者自己(请求对象使用Self关键字),只是太麻烦没必要,因为无论属性和方法都可以直接访问和调用。

请求调用对方行为

  • 一个实体A可以请求另一个实体B执行其被动行为,请使用请求组件的调用模式

    Web3领域示例
    • DeFi交易者请求Uniswap交易指定代币,请求关系示意如下左图
    • 在Trader画布中的图形化建模表达请求调用,如下右图
  • 相当于Ask someone to do Something

提示

请求调用是最常用的交互方式,尤其在Web3领域模拟一个智能合约时,因为智能合约的工作基本上是"被动的",依赖于EOA账户发起交易。

  • 当然对方行为也可以定义成一个获取属性值的流程,请求调用的结果相当于访问对方属性值

表达式访问实体属性

  • 表达式中可以使用点语法访问其它个体对象的属性
  • 语法格式: "entity_single_objcet.property_name",其中entity``_single_object仅限于个体或观察者,不能为[Entity]
例子

在实体A的流程公式计算中可以使用"B_entity_object.Individuals.choice().property_name"访问到一个B实体随机个体的某个属性。

通过流程动作元素进行特定交互

运动交互

  • 显然Agent在Cell空间中运动时涉及二者交互,如Cell将感知其上的Agent,Agent可以定位Cell空间坐标等,他们的空间关系详见下节空间运动交互
  • 使用以下流程组件就能方便的实现二者的交互,而无需考虑实现细节专注建模即可
    • 移动组件负责控制Agent在空间中的运动(如前进、后退、转向等)
    • 置于组件负责设置Agent在空间中的位置
  • 任意主体都可以创建Agent或Link实体的个体
  • 在行为流程中使用创建组件实现
  • 表达式可以访问创建组件输出的实体对象List
  • 任意主体都能(请求调用实体的Die内置行为来销毁实体
    • 当调用目标为Agent个体时,销毁该个体,所有与之相连的Link个体也将一同销毁
    • 当调用目标为Link个体时,销毁该个体,与之相关的Agent个体不受影响
  • 任意主体都能(请求)调用Link实体的RemoveNode观察者内置行为,来销毁所有与传入Agent个体相连的Link个体,但不会影响该Agent
  • 由于个体在模拟过程中可能被创建和销毁,系统计算将考虑其实时存在性,如:一个包含100个个体对象列表 L = Trader.individuals ,在10个个体被销毁后,len(L) 函数的计算结果为90,直接访问已消亡个体属性或调用其行为均会导致系统报错
  • 当任意实体在流程执行在一半时被销毁,则系统将实时结束其作为执行者的当前进程
提示

HoloMind 的实体内置方法中,凡是能够影响状态的(即Die和RemoveNode),都必须以流程建模的方式使用相应组件调用(请求和调用),而不能在公式中使用Entity_object.method的表达式,详见技术说明的内置行为章节.

通过上级属性间接交互

  • 如交易者通过观察全局价格变量做出决策

    InteractionsBetweenEntities003.png

通过条件开始事件间接交互

通过消息直接交互

更新

随着 HoloMind 的不断迭代升级,对象间交互方式可能会更加强大丰富。

案例

模型案例:请求调用行为

Web3用户不断向DEX发起交易引起代币价格变化

空间运动交互

交互机制

  • 涉及Agent与Cell的对象间交互

  • Cell是组成空间的基本单元,每个是边长为1的正方形,Cells以点阵形式排列,每个单元的中心都是整数,中心坐标是该Cell个体的名义坐标,如下图

    InteractionsBetweenEntities004.png

  • Agent在空间中运动是连续的,可以处于任意Cell上的任意点,即其内置属性Coordinates的List中的X坐标和Y坐标都是Float

  • 当前系统将Agent视为点,因此可以清晰定义所处的Cell,而一个Cell也没有容纳Agent数量的限制,尽管Agent本身有视觉大小(由Size和Shape决定)可能占据超过1个Cell的面积

  • Cell空间范围虽然有限,但可以在水平和竖直方向被设置为是否环绕

  • 环绕模式下,Agent移动至边界后会继续运动从另一侧边界重新进入空间

  • 当Agent移动至不环绕边界时会被迫停止运动,即便此时移动距离移动距离还没有完成

  • 当Agent恰好向角落顶点持续移动时,如果水平和竖直两个方向均为环绕,则它将从对角顶点重新进入空间,但是只要有一个方向不为环绕,它将被迫停止在顶点前(的最大可行步处

  • Agent可以通过指定一个半径获得邻居Agent对象列表(GetNeighbors)和邻居Cell对象列表(GetNeighborCells

实体在"物理世界"中的外观

  • 呈现在世界视窗
  • Cells作为背景,空间样式执行其内置属性,如Color
  • Agent呈现为运动的对象,样式执行其内置属性,如ShapeColor
  • Link不出现

    InteractionsBetweenEntities004+1.png

案例

模型案例

狼在草原移动

关系网络交互

交互机制

  • 涉及Agent和Link的对象间交互
  • 想象Link就像手柄将两端的Agent联系成"哑铃",很多这样的"哑铃"组成了关系网络
  • Agent可以在这样的社会网络中"顺藤摸瓜"找到自己的关系密切者,如通过调用Link观察者的内置行为GetRelatives实现
  • 可以在网络中移除节点或连边,相应的Agent实体不受影响,但销毁了节点Agent实体,相应的Link实体也会消亡

实体在"关系网"中的呈现

  • 网络视图
  • Agent呈现为节点,样式支持按其内置属性,如ShapeColorSize
  • Link呈现为连边,样式支持按其内置属性,如LineTypeColorThickness
  • Cell不出现

    InteractionsBetweenEntities005.png

案例

模型案例

访问网络关系密切者:每个网络节点获取自己的度(即邻居节点的数量),可以从节点度分布看到这是一个随机网络