【问题标题】:time-based simulation with actors model使用演员模型的基于时间的模拟
【发布时间】:2012-11-13 02:02:01
【问题描述】:

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

在阅读了一些关于基于代理的建模和函数式编程/参与者模型的内容后,我正在考虑使用消息传递范式进行重写。

这个想法很简单——每个对象都是一个actor,它们的交互将是消息,这样模拟就可以并行发生。在特定时间给定对象的配置 - 可以轻松计算其未来的后果。

问题是如何建模时间:
例如,假设对象 X 的行为取决于 A 和 B,因为无法保证参与者和消息的计算顺序,可能是当要计算 X 时,A 已经将其消息发送给 X,但 B 没有. 如何确保计算正确发生?

我希望问题很清楚
提前致谢。

【问题讨论】:

    标签: functional-programming simulation actor


    【解决方案1】:

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

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

    为这些事件正确实现同步协议是具有挑战性的,而正确的协议选择是高度特定于应用程序的。例如,一个重要因素是每个事件所需的平均计算量:如果需要的计算量很少,则通信成本将主导整个执行时间,并且很难扩展模拟。

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

    【讨论】:

    • 您好,感谢您的友好回复! 1. 确实这是一个离散事件模拟 2. 我更喜欢函数式风格的原因是我希望拥有副本和不可变的数据结构以避免数据保护的复杂性,而函数式编程范式更自然地做到了这一点. 3. 谢谢你推荐我看教科书,我一定会看的。您对确切术语的使用是一个很大的帮助,因为它可以帮助我在查找更多信息时优化搜索查询。 4. 当然,我正在检查现有库,目前我正在评估 akka
    • 不客气。您打算将 Akka 与 Scala 一起使用吗?在这种情况下,您可能想看看 Scalation (code.google.com/p/scalation),AFAIK 不支持并行执行,但具有离散事件模拟的不同“世界观”的表示,以及其他一些可能的组件对你有用。 Java 框架 JAMES II (jamesii.org) 还提供了许多您需要的组件(例如事件队列),并具有用于实验规范的 Scala 接口 (sessl.org) [免责声明:我是开发人员之一]。
    猜你喜欢
    • 2018-12-15
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多