蚂蚁模拟:为每个蚂蚁创建一个进程/线程更好还是其他方式?
这个简单的研究是:蚂蚁生活模拟
我正在创建一个面向对象的结构,里面有一个蚁丘的类,一个蚂蚁的类,还有一个整个模拟器的类。
现在我在思考“如何”让蚂蚁“生活”起来……
我知道有一些类似的项目刚刚开始,但我只是想头脑风暴一下,我并不是在寻找一个现成的解决方案。
老实说,我需要做一些测试来理解“什么更好”,据我所知,在Python中,线程比进程占用更少的内存。
当你启动模拟时,“蚂蚁”需要做的就是:随机移动,如果它们找到食物——>吃掉或带回蚁丘,如果它们遇到另一只来自不同蚁丘的蚂蚁正在搬运食物——>攻击——>收集食物——>继续做它们该做的事情……依此类推……这意味着我需要在蚂蚁之间以及整个环境中“共享”信息。
所以我重新考虑一下:是为每只蚂蚁创建一个进程/线程,还是其他什么?
编辑: 关于我的问题“什么更好”,我给所有收到的聪明回答都点了赞,并且在下面留言。 在我的测试之后,我会接受最好的答案。
5 个回答
我写了一个蚂蚁模拟程序,用来寻找一个好的旅行商问题解决方案。我不太推荐使用线程来实现这个程序。我是通过一个循环来计算每只蚂蚁的下一步,所以我的蚂蚁并不是同时在行动,而是在每一步后进行同步。
我觉得没有必要用线程来模拟这些蚂蚁。这样做在运行速度上没有好处,代码的优雅性也没有提升!
虽然用线程可能会稍微更接近真实情况,因为真实的蚂蚁是同时活动的,但在模拟的情况下,我认为这并不重要。
我建议你看看 stackless。Stackless 引入了一种叫做任务小线程(tasklets)的东西,这是一种微线程,能够让你享受到基于线程编程的好处,同时避免了传统线程带来的性能和复杂性问题。
不过,使用 stackless 可能会有一个问题,听说你需要用一个修改过的解释器或者 pypy 才能使用这些微线程。不过,这可能是值得的,因为有一些公司成功地使用了 stackless(比如它被用在了 EVE Online 这款游戏中)。
另外,你也可以看看 greenlet,它也提供了一种微线程的功能,而且不需要替换解释器。不过,相比于 stackless,greenlet 提供的功能比较有限。