6

简单的学习是: 蚂蚁生活模拟

我正在创建一个面向 Anthill 的类、Ant 的类和整个模拟器的类的 OO 结构。

现在我正在头脑风暴“如何”让蚂蚁“活着”......

我知道有这样的项目才刚刚开始,但我正在集思广益,我不是在寻找刚刚准备好的菜肴

真诚地,我必须进行一些测试以了解“什么更好”,AFAIK 线程在 Python 中使用的内存比进程少。

当您开始模拟时,“蚂蚁”必须做的只是:以随机方向移动,如果他们找到食物 -> 吃/带到蚁丘,如果他们从另一个蚁丘发现另一只蚂蚁正在运输食物 -> 攻击 - > 收集食物 -> 做必须做的事情......等等......这意味着我必须在蚂蚁和整个环境中“分享”信息。

所以我重写:最好为每个 Ant 或其他东西创建一个进程/线程?

编辑:由于我的问题“什么更好”,我赞成我收到的所有聪明的答案,并且我也对它们发表了评论。经过我的测试,我将接受最佳答案。

4

5 回答 5

4

我建议看看stackless。Stackless 引入了 tasklet,它是一种微线程,可以在没有与传统线程相关的性能和复杂性问题的情况下获得基于线程的编程的好处

无堆栈的一个可能问题是,据我所知,您需要使用修改后的解释器或 pypy 来使用微线程。然而这可能是值得的,因为有些公司使用无堆栈取得了巨大的成功(例如,因为它用于 EVE Online)

还可以看看greenlet,它也为您提供了一种微线程,而无需替换解释器。然而,与 stackless greenlet 相比,仅提供有限的功能集。

于 2011-05-31T17:42:21.820 回答
3

如果你不介意 GPL,我建议你使用Khronos模拟框架,它允许你将每个蚂蚁定义为一个生成器,这样你就不需要创建线程。Khronos 引擎负责调度。

我实际上正在开发一个名为GarlicSim的竞争项目,您也可以将其用于您的模拟,但对于您的情况,Khronos 会更好。(除非你对 GPL 有疑问。)

于 2011-06-01T09:37:57.857 回答
2

我写了一个蚂蚁模拟(为了找到一个好的 TSP 解决方案)并且不推荐线程解决方案。我使用一个循环来计算每只蚂蚁的下一步,所以我的蚂蚁并没有真正同时表现(但在每一步之后同步)。

我看不出有任何理由用 Threads 来模拟那些蚂蚁。它在运行时行为方面没有优势,在优雅(代码)方面也没有优势!

诚然,使用线程可能更现实一些,因为真正的蚂蚁是并发的,但出于模拟目的,恕我直言,这是可以忽略的。

于 2011-05-31T15:17:48.637 回答
1

I agree with @delan - it seems like overkill to allocate a whole thread per Ant, especially if you are looking to scale this to a whole anthill with thousands of the critters running around.

Instead you might consider using a thread to update many ants in a single "cycle". Depending on how you write it - you need to carefully consider what data needs to be shared - you might even be able to use a pool of these threads to scale up your simulation.

Also keep in mind that in CPython the GIL prevents multiple native threads from executing code at the same time.

于 2011-05-31T14:59:36.857 回答
1

我认为线程解决方案是最好的。即使蚂蚁是个体,它们也共享环境,这正是使用线程时所允许的。过程解决方案符合实际,实现与环境的通信系统将是一项艰巨的任务。

另一种解决方案是定义蚂蚁仅在滴答声发生时才行动。然后,不需要使用线程或进程。

例如 :

import time
...
while True:
    for ant in ants:
        ant.act()
    time.sleep(tickwait)

同时,该方案更易于实施。

于 2011-05-31T15:02:43.727 回答