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>
,这样看起来更自然。
string
与 vector<char>
类似,但更麻烦。
【讨论】:
【参考方案2】:专门回答你的问题。我不确定你的建议是什么。您谈论数组和字符串类。您是否在谈论 STL 容器类,您可以在其中拥有队列、位集、向量、链表等。如果您是,我会为您的总体建议一个向量(最接近 C 数组的东西)和一个位集为您的染色体担心内存容量。否则,因为您已经在使用您的 dna 字符串表示的向量。 ("10110110")
对于想法和涉足的好工具。建议您下载并初步使用此库。它适用于主要的编译器。适用于 unix 变体。有所有的源代码。
所有框架的东西都为你完成了,你会学到很多东西。稍后您可以从头开始编写自己的代码或从这些类继承。如果需要,您也可以在商业代码中使用它们。
因为它们是对象,您可以轻松地将 DNA 的表示从整数更改为实数,再到结构,再到树再到位数组等。
总是需要学习治疗,但这是值得的。
我用它来生成数千个神经网络,然后用一个简单的适应度函数将它们剔除,然后真正运行它们。
加利布
http://lancet.mit.edu/ga/
【讨论】:
看起来很有趣。然而,我会坚持我现在所知道的魔鬼。干杯【参考方案3】:假设您想自己编写代码(如果您想要一个外部库 kingchris 似乎有一个不错的库),这实际上取决于您需要进行什么样的操作。为了在内存方面获得最大的收益,您可以使用任何整数类型并通过位掩码等设置/操作各个位。现在,就易用性而言,这种方法可能不是最佳的......上面的字符串示例将起作用好的,但是它再次与短裤没有显着不同,这里您现在只是用 8 位值表示“0”或“1”,而不是 16 位值。此外,再次取决于操作,字符串大小写可能会变得笨拙。因此,如果您可以提供有关该算法的更多信息,我们可能会提供更多反馈。我自己喜欢将单个位作为整数(位集)的一部分,但如果您不习惯掩码、移位和所有这些好东西,它可能不适合您。
【讨论】:
【参考方案4】:我建议为每个总体成员编写一个类,这样可以大大简化事情,因为您可以将所有与成员相关的函数保存在同一个位置,并用实际数据很好地包装。
如果您需要一个“布尔数组”,我建议您使用一个 int 或几个 int(然后使用掩码和逐位操作来访问(修改/翻转)每个位),具体取决于您的染色体数。
我通常对人口使用某种集合类,因为仅仅一个人口成员数组不允许您简单地添加到您的人口中。我建议实现某种动态列表(如果您熟悉 ArrayList,那么这是一个很好的例子)。
我用上面的方法在遗传算法上取得了巨大的成功。如果你准备好你的成员类,它可以真正简化事情,让你专注于编码更好的遗传算法,而不是担心你的数据结构。
【讨论】:
以上是关于C ++中遗传算法的最佳数据结构?的主要内容,如果未能解决你的问题,请参考以下文章