Erlang中的稀疏世界结构

时间:2012-04-23 17:13:06

标签: concurrency erlang

我正在考虑如何将“ant-farm模拟器”的属性移植到Erlang。这是基本的纲要:

1)定义100x100的“插槽”世界

2)蚂蚁占据一个插槽

3)蚁群占据位置50,50

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

5)蚂蚁每次移动一个空间寻找食物并将其带回殖民地

6)一次只能有一个对象在一个插槽中。

此问题的目标是使系统尽可能保持并发。在Clojure中,上面的问题通过拥有一个代理程序的线程池来解决,每个代理程序运行一个蚁群的AI。然后这些蚂蚁通过交易更新全局状态。

这是我一直在思考的全球状态。我们如何构建“游戏世界”?

我的第一个想法是为每个蚂蚁创建一个Erlang进程,然后为地图中的每个插槽创建一个进程。要移动,蚂蚁会执行以下操作:

1)蚂蚁告诉它当前位置“我想向北移动”

2)插槽向北调用插槽并显示“请更新您的内容,现在包含ant”pid“”

3)如果北槽已经有一个蚂蚁,它会发送一个“拒绝”的响应,然后向下流入包含蚂蚁(然后是蚂蚁)的插槽。如果更新有效,那么“授权”将在链中发送,并且ant会更新其内部状态。

我唯一不喜欢这种方法的是,在移动过程中,ant,它的插槽和目标插槽都被“锁定”,直到整个事务完成。然后这会打开僵局。也就是说,两只蚂蚁可能试图同时交换位置,每个插槽都在等待另一个。

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

--- ---- EDIT

让我逐步解决僵局问题:

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

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

2 个答案:

答案 0 :(得分:1)

让你的蚂蚁向他要移动的位置施放,请求移动许可。然后蚂蚁等待演员回应,告诉它移动是否成功。如果移动成功,蚂蚁会更新他自己的状态以表明他在新的位置。如果失败,他再次执行他的搜索逻辑。如果最终A和B试图交换插槽,你就不会陷入僵局,但他们都认为他们必须寻找其他选择。

如果您的网格占用很多,您可能希望插槽执行轮询逻辑,向邻近的蚂蚁发放权限,告诉他们如果他们的逻辑引导他们,他们可能会进入。 (想象一下它上面有50x50-2蚂蚁的网格,你就会明白为什么这会是一个很好的逻辑变化。)

从不使用通话,除非你绝对,积极,没有问题,没有他们就无法生存。然后,如果有相同类型的进程可能相互调用,或者可以相互调用的类型,则尽量摆脱它们。

答案 1 :(得分:0)

我认为当它无法向北移动时,接下来会尝试不同的方向吗?那么僵局在哪里?

如果场地非常拥挤,我可以想象饥饿,但不是死锁。