我在想如何将一个“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而导致死锁从另一个插槽。我想“正确的方式”可能是在传输过程中自动拒绝所有传输请求。
,我喜欢你的做法一般的声音,并同意要避免致命的怀抱。也许你可以通过添加蚂蚁不能交换位置的规则来解决你致命的拥抱问题。相反,他们必须绕过彼此,或者至少有一个。也就是说,需要一只蚂蚁去一个相邻的空地点。 – 2012-04-23 18:57:20
为什么这些请求必须是同步和阻塞?您可以发送请求,然后等待消息,包括其他请求和对请求的答复。 – rvirding 2012-04-23 22:00:20