scala - 如何设计时钟驱动的多智能体模拟

标签 scala simulation actor

我想为真实世界的制造过程创建一个多代理仿真模型来评估一些调度规则。模拟需要生成事件日志以评估调度规则与真实制造事件日志相比的时间效果。

如何将“当前模拟时间”合并到这种多代理、消息传递密集型模拟中?

背景:
经典的离散事件模拟(它很好地处理了时间推进)不能在这里应用,因为系统中的代理代表相对复杂的行为和路由要求,加上调度规则要求它们频繁通信。这个和其他过程的复杂性也排除了集中调度方法。

在制造科学领域,有数以千计的论文使用多代理模拟来解决一些与制造相关的问题。但是,我还没有找到一篇论文来详细描述这些模拟的内部工作原理或实现细节。

不幸的是,在系统中使用离散时间步长的最短处理时间可能不可行,因为处理时间的范围在 0.1 秒到 24 小时之间。我的模拟有可能在以后的项目中用于假设评估,因此模拟需要尽可能快地运行——没有选择通宵模拟运行。

问题规模约为500个资源和1000-10000个产品代理,其中大部分已完成,不再参与任何进一步的通信或资源占用。

因此,作为通信的结果,新事件可以触发代理在其原始“下一次”事件到达之前做某事。例如,代理当前在持续一个小时的资源上被阻止。然而,另一个更高优先级的代理立即需要该资源,并要求第一个代理释放该资源。

在某种意义上,我需要一种方法来创建经典消息传递代理模拟和离散事件模拟的混合体。

我考虑了一个涉及每条消息的中介代理 - 一个消息路由器和时间执行器,它发送消息和计时器滴答事件。中介代理还为各种代理保留下一个事件时间的列表。但是,我觉得应该有更好的方法来解决我的问题,因为这个概念给中介代理带来了巨大的压力。

更新

花了一些时间,但我似乎设法创建了一个小型框架,并将 DES 和 Agent 概念合二为一。我敢肯定它不是什么新鲜事,但至少是独一无二的:http://code.google.com/p/tidra-framework/如果你有兴趣。

最佳答案

这个问题听起来好像应该通过使用并行离散事件模拟来解决 - 您计划实现的中介代理('参与每条消息','发送消息和计时器tick events')现在似乎正在做一个离散事件模拟器的工作。您可以通过并行使用更多此类模拟器,然后使用同步算法来维持因果关系等,从而将此规模扩展到所需的问题规模(有关详细信息,请参见例如 this book)。当然,这需要付出相当大的努力,首先真正尝试顺序算法可能会更好。

增强通过事件相互通信的逻辑过程(= 代理)的经典 DES View 的一个好方法可能是混合来自其他用于描述离散事件系统的形式主义的一些想法,例如 DEVS .在 DEVS 中,每个实体都可以指定它处于某种状态的持续时间(例如,代理阻塞资源),并且只会被传入消息中断(然后相应地改变其状态,例如代理释放资源)。

顺便说一句,您认为在何种意义上代理过于复杂而无法使用离散事件模拟来处理?如果您将每个代理视为一个逻辑过程,那么从模拟的角度来看它有多复杂并不重要——或者我在这里弄错了什么?

关于scala - 如何设计时钟驱动的多智能体模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1041343/

相关文章:

右侧的 Scala 类型注释?

scala - 以下命令式代码最有效的功能版本是什么?

用于模拟应用程序的 C++ normal_distribution 函数

r - 如何使用 R 包 depmix 从拟合的 HMM 中模拟随机状态?

scala - 在 Spray 路由中调用 Actor 并等待 Actor 的响应

scala - 建立多用户大网站的建议(1. scala lift/spring roo 2. 数据库 mongoDB/Postgre ORM/MySql ORM 3. Web 服务器环境 Tomcat 等..)

java - scala - bash : hw. scala:权限被拒绝

network-programming - ns2中TCP syn攻击模拟

performance - Scala 有状态 Actor ,递归调用比使用 vars 更快?

scala - 无法使用akka java api的UnTypedActorFactory创建 Actor