3

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

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

我四处研究并提出:

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

对于人口: - C Array[] - Vector - Queue

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

提前致谢!

4

4 回答 4

7

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

如果你在意美感的vector<char>话可以typedef char gene;再用vector<gene>,看起来更自然。

Astring和 a 一样,vector<char>但是比较麻烦。

于 2009-07-09T06:12:32.600 回答
1

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

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

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

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

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

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

加利布

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

于 2009-07-09T05:07:07.397 回答
0

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

于 2009-07-09T05:22:54.197 回答
0

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

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

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

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

于 2009-07-09T06:26:19.797 回答