演员模型的基于时间的模拟

aki*_*iva 5 simulation functional-programming actor

我们有一个单线程应用程序,可以模拟数十万个对象随着时间的推移与共享内存模型的交互.
显然,它无法扩展到多CPU硬件.

在阅读了一些基于代理的建模和函数式编程/演员模型后,我正在考虑使用消息传递范例进行重写.

这个想法非常简单 - 每个对象都是一个参与者,他们的交互将是消息,因此模拟可以并行发生.给定特定时间的对象配置 - 可以轻松计算其未来后果.

问题是如何建模时间:
例如让我们假设对象X的行为取决于A和B,因为演员和消息计算顺序不能保证可能是当要计算X时A已经发送它给X的信息,但B没有.如何确保计算正确?

我希望
提前感谢这个问题.

Rol*_*ald 8

您使用消息传递并行化(离散事件?)模拟的方法是众所周知的,并且本身不需要功能样式(当然,这并不妨碍您像这样实现它).

您描述事件时间的基本问题也称为局部因果关系约束(例如,参见本教科书).基本上,您需要使用同步协议来确保每个对象(或代理)以正确的顺序处理其消息.在并行离散事件模拟领域,这些对象称为逻辑进程,它们通过事件(即带时间戳的消息)进行通信.

正确地为这些事件实现同步协议具有挑战性,并且正确选择协议是高度针对特定应用的.例如,一个重要因素是每个事件所需的平均计算量:如果需要的计算量很少,则通信成本将占据总体执行时间,并且难以扩展模拟.

因此,我建议在从头开始之前在您打算使用的actor框架之上寻找现有的解决方案/库.

  • 嗨,谢谢你的回复!1.确实这是一个离散事件模拟2.我更喜欢这种功能风格的原因是我希望拥有副本和不可变数据结构以避免数据保护的复杂性,而这在功能编程范例中更自然地完成了.谢谢你把我推荐给教科书,我明确地看一下.您使用确切的术语是一个很好的帮助,因为它可以帮助我在查找更多信息时优化搜索查询.当然,我正在考试现有的图书馆,目前我正在评估akka (2认同)
  • 别客气。您打算将 Akka 与 Scala 一起使用吗?在这种情况下,您可能需要查看 Scalation (https://code.google.com/p/scalation),AFAIK 不支持并行执行,但具有离散事件不同“世界观”的表示模拟,以及其他一些可能对您有用的组件。Java 框架 JAMES II (http://jamesii.org) 还提供了许多您需要的组件(例如事件队列),并具有用于实验规范的 Scala 接口(http://sessl.org)[免责声明:我'我的开发人员之一]。 (2认同)