蚂蚁模拟:为每个蚂蚁创建一个进程/线程更好还是其他方式?

6 投票
5 回答
1133 浏览
提问于 2025-04-16 18:41

这个简单的研究是:蚂蚁生活模拟

我正在创建一个面向对象的结构,里面有一个蚁丘的类,一个蚂蚁的类,还有一个整个模拟器的类。

现在我在思考“如何”让蚂蚁“生活”起来……

我知道有一些类似的项目刚刚开始,但我只是想头脑风暴一下,我并不是在寻找一个现成的解决方案

老实说,我需要做一些测试来理解“什么更好”,据我所知,在Python中,线程比进程占用更少的内存。

当你启动模拟时,“蚂蚁”需要做的就是:随机移动,如果它们找到食物——>吃掉或带回蚁丘,如果它们遇到另一只来自不同蚁丘的蚂蚁正在搬运食物——>攻击——>收集食物——>继续做它们该做的事情……依此类推……这意味着我需要在蚂蚁之间以及整个环境中“共享”信息。

所以我重新考虑一下:是为每只蚂蚁创建一个进程/线程,还是其他什么?

编辑: 关于我的问题“什么更好”,我给所有收到的聪明回答都点了赞,并且在下面留言。 在我的测试之后,我会接受最好的答案。

5 个回答

2

我写了一个蚂蚁模拟程序,用来寻找一个好的旅行商问题解决方案。我不太推荐使用线程来实现这个程序。我是通过一个循环来计算每只蚂蚁的下一步,所以我的蚂蚁并不是同时在行动,而是在每一步后进行同步。

我觉得没有必要用线程来模拟这些蚂蚁。这样做在运行速度上没有好处,代码的优雅性也没有提升!

虽然用线程可能会稍微更接近真实情况,因为真实的蚂蚁是同时活动的,但在模拟的情况下,我认为这并不重要。

3

如果你不介意GPL这个许可证,我建议你使用Khronos这个模拟框架。它允许你把每只蚂蚁定义为一个生成器,这样你就不需要自己去创建线程了。Khronos引擎会帮你处理调度的问题。

其实我正在开发一个竞争项目,叫做GarlicSim,你也可以用它来做模拟,不过在你的情况下,Khronos会更合适。(除非你对GPL有问题。)

4

我建议你看看 stackless。Stackless 引入了一种叫做任务小线程(tasklets)的东西,这是一种微线程,能够让你享受到基于线程编程的好处,同时避免了传统线程带来的性能和复杂性问题。

不过,使用 stackless 可能会有一个问题,听说你需要用一个修改过的解释器或者 pypy 才能使用这些微线程。不过,这可能是值得的,因为有一些公司成功地使用了 stackless(比如它被用在了 EVE Online 这款游戏中)。

另外,你也可以看看 greenlet,它也提供了一种微线程的功能,而且不需要替换解释器。不过,相比于 stackless,greenlet 提供的功能比较有限。

撰写回答