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

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

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

我研究并想出了:

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

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

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

提前致谢!

【问题讨论】:

    标签: c++ data-structures artificial-intelligence genetic-algorithm


    【解决方案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,那么这是一个很好的例子)。

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

        【讨论】:

          猜你喜欢
          • 2020-10-08
          • 2010-11-07
          • 1970-01-01
          • 2013-02-15
          • 2015-05-08
          • 1970-01-01
          • 2018-07-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多