Concurrency Erlang中的稀疏世界结构

Concurrency Erlang中的稀疏世界结构,concurrency,erlang,Concurrency,Erlang,我正在考虑如何将一个“蚂蚁农场模拟器”从属性端口移植到Erlang。以下是基本情况: 1) 定义一个100×100的“插槽”世界 2) 蚂蚁占据一个位置 3) 蚁群占据位置50,50 4) 食物在地图上随意摆放 5) 蚂蚁一次移动一个空间来寻找食物,然后把食物带回蚁群 6) 一次只能有一个对象位于插槽中 这个问题的目标是尽可能保持系统的并发性。在Clojure中,通过拥有一个代理线程池来解决上述问题,每个代理为单个ant运行AI。然后这些蚂蚁通过事务更新全局状态 我一直在想的就是那个全球国家。我

我正在考虑如何将一个“蚂蚁农场模拟器”从属性端口移植到Erlang。以下是基本情况:

1) 定义一个100×100的“插槽”世界

2) 蚂蚁占据一个位置

3) 蚁群占据位置50,50

4) 食物在地图上随意摆放

5) 蚂蚁一次移动一个空间来寻找食物,然后把食物带回蚁群

6) 一次只能有一个对象位于插槽中

这个问题的目标是尽可能保持系统的并发性。在Clojure中,通过拥有一个代理线程池来解决上述问题,每个代理为单个ant运行AI。然后这些蚂蚁通过事务更新全局状态

我一直在想的就是那个全球国家。我们如何构建“游戏世界”

我的第一个想法是为每个ant设置一个Erlang进程,然后为映射中的每个插槽设置一个进程。要移动,蚂蚁会执行以下操作:

1) 蚂蚁告诉它现在的位置“我想向北移动”

2) 插槽将插槽调到北面,并显示“请更新您的内容,使其包含ant”pid

3) 如果北槽已经有一只蚂蚁,它将发送一个“拒绝”响应,该响应将向下延伸到包含蚂蚁的槽(然后是蚂蚁)。如果更新有效,那么“已授予”将被发送到链下,ant将更新其内部状态

我唯一不喜欢这种方法的地方是,在移动过程中,ant、其插槽和目标插槽都被“锁定”,直到整个事务完成。这就为死锁打开了大门。也就是说,两只蚂蚁可能同时尝试交换位置,每个位置都在等待另一个

有人能提出更好的解决方案吗

---编辑----

让我逐步解决死锁问题:

1) 蚂蚁1要求插槽A“向北转移”到插槽2 2) 蚂蚁2要求插槽B“向南转移”到插槽1 3) 插槽1向插槽2发送传输请求并等待回复 4) 插槽2向插槽1发送传输请求并等待回复


从代码的角度来看,这很容易实现,但也会死锁,因为每个插槽只侦听来自另一个插槽的响应。我认为“正确的方法”可能是在传输过程中自动拒绝所有传输请求。

我假设当它无法北上时,它会尝试下一个不同的方向?那么僵局在哪里呢


我可以想象,如果田地里非常拥挤,但不是死锁,就会出现饥饿的情况。

让你的蚂蚁向他要移动的位置投一个球,请求移动的许可。然后,蚂蚁等待cast响应,告诉它移动是否成功。如果移动成功,蚂蚁会更新自己的状态,表明自己在新的位置。如果失败,他将再次执行搜索逻辑。如果最终A和B尝试交换插槽,则不会出现死锁,但他们都会认为必须寻找其他选项

如果你的网格被大量占用,你可能希望插槽执行轮询逻辑,向相邻的蚂蚁发出许可,告诉他们如果他们的逻辑引导他们到那里,他们可能会进入。(想象一个网格上有50x50-2只蚂蚁,你就会明白为什么这是一个很好的逻辑变化。)


永远不要使用电话,除非你绝对地、积极地、毫无疑问地离不开电话。然后,如果有可能出现相同类型的进程相互调用,或者可能出现可以相互调用的进程类型,请尽最大努力消除它们。

我喜欢您的方法的一般声音,并且同意您希望避免这种致命的拥抱。也许你可以通过增加蚂蚁不能交换位置的规则来解决你致命的拥抱。相反,它们必须相互绕行,或者至少有一个绕行。也就是说,要求蚂蚁去相邻的空位置。为什么请求必须是同步的和阻塞的?您可以发送一个请求,然后坐下来等待消息,包括其他请求和对您请求的答复。