2012-04-23 58 views
6

我在想如何将一个“ant-farm simulator”的属性端口转移到Erlang。这里的基本概要:Erlang的稀疏世界结构

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

2)蚂蚁占据一个时隙

3)蚁群占据位置50,50

4)食品被随机放置在地图周围

5)蚂蚁在时间寻求食物,并把它返回到菌落

6)只有一个对象移动一个空间可以一次在一个插槽中。

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

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

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

1)蚂蚁告诉它目前的插槽“我想搬到北”

2)插槽调用插槽北部和说:“请更新您的内容现在包含蚂蚁“pid”“

3)如果北槽已经有一只蚂蚁,它会发送一个”拒绝“响应,滴答下来到包含蚂蚁的槽(然后蚂蚁)。如果更新有效,则“授予”将沿着链发送,并且蚂蚁更新其内部状态。

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

任何人都可以提出更好的解决方案吗?

---编辑----

让我通过死锁问题步骤:

1)蚂蚁1问插槽A到 “北转” 到插槽2 2)蚂蚁2问插槽B至“转移南”到插槽1 3)插槽1发送一个转移请求到时隙2和等待答复 4)插槽2发送一个转移请求到插槽1和等待答复

从代码透视这将很容易实现,但也会因为每个插槽只听取回复f而导致死锁从另一个插槽。我想“正确的方式”可能是在传输过程中自动拒绝所有传输请求。

+0

,我喜欢你的做法一般的声音,并同意要避免致命的怀抱。也许你可以通过添加蚂蚁不能交换位置的规则来解决你致命的拥抱问题。相反,他们必须绕过彼此,或者至少有一个。也就是说,需要一只蚂蚁去一个相邻的空地点。 – 2012-04-23 18:57:20

+0

为什么这些请求必须是同步和阻塞?您可以发送请求,然后等待消息,包括其他请求和对请求的答复。 – rvirding 2012-04-23 22:00:20

回答

1

你的蚂蚁是否在他正在移动的插槽上进行投射,要求允许移动。然后蚂蚁等待演员回应,告诉它是否成功。如果移动成功,蚂蚁更新自己的状态以表示他在新的位置。如果失败了,他再次执行他的搜索逻辑。如果你结束了A和B想交换插槽,你不会有一个僵局,但他们俩都觉得他们必须寻找其他的选择。

如果您的网格是大量占用,你可能想的插槽执行轮询逻辑,允许发放到邻近的蚂蚁,告诉他们,如果他们的逻辑导致他们那里,他们可以进入。 (想象一下,一个网格,它50x50-2蚂蚁,你就会明白为什么这会是逻辑的一个很好的变化。)

决不使用电话,除非你绝对,肯定,毫无疑问,没有无法生存他们。然后,拼命摆脱他们,如果有同类型的方法调用,或类型,可以使对方通话对方一个机会。

0

我假设当它不能向北时,它会尝试不同的方向呢?那么僵局在哪里?

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

+0

我更新了操作 – 2012-04-23 19:23:38