我已经用Python创建了一个基因编程系统,但是我遇到了与内存限制相关的麻烦。问题在于将我的人口中的所有个体存储在记忆中。目前,我将所有个体存储在内存中,然后重现下一代的群体,然后将其存储到内存中。这意味着我在内存中加载了两个人口。经过一些测试,我发现我很快就超过了Windows的默认2GB应用程序内存大小。
目前,我将整个人口的单个树写到一个文件中,然后我可以根据需要加载并重新创建人口。我一直在考虑的是,不是让所有个人都加载到内存中,而是通过从文件中提取个人来访问个人信息,而只是实例化那个单独的个体。根据我对Python的readline功能的理解,它应该一次只从文件加载一行,而不是整个文件。如果我这样做,我想我只能在记忆中存储我当前正在操纵的人。
我的问题是,这样做是否存在一个下划线问题,我现在还没有看到?我理解,因为我处理磁盘上的数据而不是内存中的数据,我的性能会受到影响,但对于这种情况,内存比速度更重要。另外,我不想增加分配给Python程序的2GB内存。
谢谢!
答案 0 :(得分:2)
鉴于RAM限制,我将人口模型从世代改为 稳定状态 。
这个想法是迭代地培育一个或两个新的孩子,评估他们的适应性,然后将他们直接重新引入人群中,杀死一些先前存在的个体,为他们腾出空间。
稳态使用传统遗传算法的一半的内存,因为一次只有一个人口。
改变实施不应该太难,但你必须注意早熟收敛(即调整参数,如突变率,锦标赛大小......)。
岛屿模型 是另一种/另外一种可能性:人口被分成不同的子群体(demes)。 Demes派遣个人互相帮助传播新发现的空间适合区域的新闻。
通常它是异步机制,但您可以使用同步算法,逐个加载demes,大大减少所需的内存资源。< / p>
当然,您可以将人口编写到文件中,然后只需加载所需的个人。如果您选择这种方法,计算个体的哈希签名以优化识别/加载速度可能是个好主意。
无论如何,您应该考虑到,根据您的GP系统正在执行的任务,您可以注册大量的性能。
答案 1 :(得分:0)
请记住,如果你使用稳态,你需要有一些方法让Fittest个体交叉繁殖的概率高于不太适合的个体。
您可以考虑的其他几个选项是:
a)使用SQLLite。 (https://docs.python.org/2/library/sqlite3.html)。这将具有使用数据库(可能更多)的所有性能优势以及使用文件的简单性和易用性。
b)存在混合非稳态模型,其允许保持大的,未评估的Polulation,大小M和&#34; Survivor Set&#34;适合的个体大小为N,其中M>&gt; N. Population是解决方案对象的队列,但SurvivorSet是一个有限大小的Heap&#34; EvaluatedSolutions&#34; (用Fitness装饰的解决方案)。因此,您继续从常规群体中获取解决方案,对其进行评估,然后将它们放入EvaluatedSolution堆中(按适应性降序排序)并裁剪前N个元素。这样,你的记忆消耗量保持不变,但是你已经内置了精英的概念。这也可以做出很好的技巧,例如&#34;育种&#34;仅使用精英作为繁殖种群。