2016-06-16 64 views
3

我已经在Python中创建了一个遗传编程系统,但是遇到了与内存限制有关的问题。问题在于将所有人存储在我的人群中。目前,我将所有人存储在内存中,然后再生成下一代的人口,然后将其存储到内存中。这意味着我有两个人群值得记忆加载。经过一些测试后,我发现我相当快地超过了Windows的默认2GB应用程序内存大小。将对象存储在文件而不是内存中

目前,我写出了整个人口的单个树木到一个文件,然后我可以加载和重新创建人口,如果我想。我一直在考虑的不是让所有人都加载到内存中,而是通过从文件中拉出个人并仅实例化该单个人来访问个人信息。根据我对Python的readline功能的理解,它应该一次只加载一行文件,而不是整个文件。如果我这样做了,我想我只能记忆我当前操纵的个人。

我的问题是,有没有一个突出的问题,这样做,我现在没有看到?我明白,因为我正在处理磁盘而不是内存中的数据,所以我的性能会受到影响,但是对于这种情况,内存比速度更重要。另外我不想增加分配给Python程序的2GB内存。

谢谢!

+0

你有没有考虑使用数据库的原因? –

+0

从文件中提取单个记录意味着通过文件读取,直到找到正确的记录。我强烈建议移动到具有现代64位环境和合理数量的RAM的计算机。如果您想优化程序,请提供[MCVE](http://stackoverflow.com/help/mcve)。如果它目前有效,请考虑询问代码审核。 – TigerhawkT3

+0

@ IgnacioVazquez-Abrams我曾考虑过,但在每代人中至少有95%的人口被替换。它似乎并不像使用数据库是正确的方向,因为数据记录只能持续很短的时间。 – Tory

回答

2

由于RAM的限制,我会改变人口模型从世代到稳态

这个想法是反复培育一两个新的孩子,评估他们的健康状况,然后直接重新将它们引入人群中,杀死一些预先存在的人为他们腾出空间。

稳态使用传统遗传算法的一半内存,因为一次只有一个人口。

改变实现不应该太难,但你必须注意过早收敛(即调整参数,如变异率,联赛大小......)。

岛模型是另一个/附加可能性:人口被分成单独的子群(demes)。德姆斯将个人送到彼此,以帮助传播新发现的空间合适区域的消息。

通常这是一个异步机制,但是你可以使用一个同步算法,装载demes一个接一个,有极大地减少所需的内存资源。


当然,你可以写人口到一个文件,你可以加载所需的个人。如果选择这种方法,计算个体的散列签名以优化识别/加载速度可能是一个好主意。

无论如何,你应该考虑到,根据你的GP系统正在执行的任务,你可以注册一个巨大的性能。

+0

我认为稳定状态可能是我将要面对的方向。因为你没有真正的世代,你是否需要标记每个人的适应度是否被计算,然后每次迭代循环计算一次错误标记个人的健康状况,还是只要个人被添加到人口计算他们的健身? – Tory

+0

@Tory如果您使用某种形式的精英主义,您立即需要健身(您必须将新人与您想要替换的人进行比较)。 – manlio

0

请记住,如果您使用稳态,则需要一些方法让Fittest个体交叉繁殖的概率高于不适合的个体。

你能想到约上几个附加选项:

一)使用SQLLite。 (https://docs.python.org/2/library/sqlite3.html)。这将具有使用数据库的所有性能优势(可能更多)以及使用文件的简单性和易用性。

b)有一个混合非稳态模型,允许保留一个大的,未评估的Polulation,尺寸M和适合的个体大小为N的“幸存者集合”,其中M >> N。人口是一个队列的解决方案对象,但SurvivorSet是“EvaluatedSolutions”(适用于Fitness的解决方案)的有限尺寸的Heap。所以,你继续从普通人群那里获得解决方案,对它们进行评估,然后将它们放入评估解决方案堆中(按照适应度降序排列)并剪切前N个元素。这样,你的记忆力消耗保持不变,但你拥有内置精英的概念。这也允许通过只使用精英作为繁殖种群来做一些很酷的技巧,如“繁殖”。

相关问题