C ++中遗传算法的最佳数据结构?

Posted

技术标签:

【中文标题】C ++中遗传算法的最佳数据结构?【英文标题】:Best Data Structure for Genetic Algorithm in C++? 【发布时间】:2009-07-09 04:47:13 【问题描述】:

我需要实现为我的问题(大学项目)定制的遗传算法,第一个版本将其编码为短矩阵(每条染色体的位数 x 人口大小)。

这是一个糟糕的设计,因为我声明了一个简短但仅使用“0”和“1”值...但它只是一个原型,它按预期工作,现在是时候让我开发一个新的、改进的版本。性能在这里很重要,但简单性也值得赞赏。

我研究并想出了:

对于染色体: - 字符串类(如“0100100010”) - 布尔数组 - 向量(向量似乎针对 bool 进行了优化) - Bitset(听起来最自然)

对于人口: - C 数组[] - 矢量 - 队列

我倾向于为染色体选择向量,为流行选择数组,但我想听听任何对此主题有经验的人的意见。

提前致谢!

【问题讨论】:

【参考方案1】:

我猜你想要随机访问人口和基因。您说性能很重要,我将其解释为执行速度。所以你可能最好使用vector<> 用于染色体和vector<char> 用于基因。 vector<char> 的原因是 bitset<>vector<bool> 针对内存消耗进行了优化,因此速度很慢。 vector<char> 将以 x8 内存为代价提供更高的速度(假设 char = 系统上的字节)。因此,如果您想要速度,请使用vector<char>。如果内存消耗是最重要的,那么使用vector<bool>bitset<>bitset<> 在这里似乎是一个自然的选择,但是,请记住,它是以位数为模板的,这意味着 a) 基因的数量必须在编译时固定并已知(我猜这是big no-no),并且 b) 如果您使用不同的大小,那么您使用的每个bitset 方法的每个bitset 大小都会得到一个副本(尽管内联可能会否定这一点),即代码膨胀。总的来说,如果你不想要vector<char>,我猜vector<bool> 更适合你。

如果你关心vector<char>的美观,你可以typedef char gene;,然后使用vector<gene>,这样看起来更自然。

stringvector<char> 类似,但更麻烦。

【讨论】:

【参考方案2】:

专门回答你的问题。我不确定你的建议是什么。您谈论数组和字符串类。您是否在谈论 STL 容器类,您可以在其中拥有队列、位集、向量、链表等。如果您是,我会为您的总体建议一个向量(最接近 C 数组的东西)和一个位集为您的染色体担心内存容量。否则,因为您已经在使用您的 dna 字符串表示的向量。 ("10110110")

对于想法和涉足的好工具。建议您下载并初步使用此库。它适用于主要的编译器。适用于 unix 变体。有所有的源代码。

所有框架的东西都为你完成了,你会学到很多东西。稍后您可以从头开始编写自己的代码或从这些类继承。如果需要,您也可以在商业代码中使用它们。

因为它们是对象,您可以轻松地将 DNA 的表示从整数更改为实数,再到结构,再到树再到位数组等。

总是需要学习治疗,但这是值得的。

我用它来生成数千个神经网络,然后用一个简单的适应度函数将它们剔除,然后真正运行它们。

加利布

http://lancet.mit.edu/ga/

【讨论】:

看起来很有趣。然而,我会坚持我现在所知道的魔鬼。干杯【参考方案3】:

假设您想自己编写代码(如果您想要一个外部库 kingchris 似乎有一个不错的库),这实际上取决于您需要进行什么样的操作。为了在内存方面获得最大的收益,您可以使用任何整数类型并通过位掩码等设置/操作各个位。现在,就易用性而言,这种方法可能不是最佳的......上面的字符串示例将起作用好的,但是它再次与短裤没有显着不同,这里您现在只是用 8 位值表示“0”或“1”,而不是 16 位值。此外,再次取决于操作,字符串大小写可能会变得笨拙。因此,如果您可以提供有关该算法的更多信息,我们可能会提供更多反馈。我自己喜欢将单个位作为整数(位集)的一部分,但如果您不习惯掩码、移位和所有这些好东西,它可能不适合您。

【讨论】:

【参考方案4】:

我建议为每个总体成员编写一个类,这样可以大大简化事情,因为您可以将所有与成员相关的函数保存在同一个位置,并用实际数据很好地包装。

如果您需要一个“布尔数组”,我建议您使用一个 int 或几个 int(然后使用掩码和逐位操作来访问(修改/翻转)每个位),具体取决于您的染色体数。

我通常对人口使用某种集合类,因为仅仅一个人口成员数组不允许您简单地添加到您的人口中。我建议实现某种动态列表(如果您熟悉 ArrayList,那么这是一个很好的例子)。

我用上面的方法在遗传算法上取得了巨大的成功。如果你准备好你的成员类,它可以真正简化事情,让你专注于编码更好的遗传算法,而不是担心你的数据结构。

【讨论】:

以上是关于C ++中遗传算法的最佳数据结构?的主要内容,如果未能解决你的问题,请参考以下文章

遗传算法中保证和不变的交叉方法

ga遗传算法如何提高精度

c ++排序矢量快速配对作为遗传学习算法的一部分

matlab的遗传算法如何使用分类精度作为适应度函数

多目标遗传算法 ------ NSGA-II (部分源码解析) 交叉操作 crossover.c

[MATLAB] 利用遗传算法函数求目标函数的最优解