用c ++进行遗传编程,库建议?

时间:2010-05-18 13:11:26

标签: c++ genetic-algorithm genetic-programming

我希望在我参与的运营研究项目中添加一些遗传算法。目前我们有一个程序可以帮助优化一些调度,我们希望以遗传算法的形式添加一些启发式算法。在c ++中有没有用于通用遗传编程/算法的好库?或者你会建议我只编写自己的代码吗?

我应该补充一点,虽然我不熟悉c ++,但我在c ++中进行这种数学优化工作还是比较新的,因为我以前合作的小组倾向于使用专有的优化包。

我们有一个相当计算密集的适应度函数来评估,我们有一个集群来运行它,因此非常需要并行代码。

c ++是一个很好的语言吗?如果没有,请推荐一些其他的,因为我愿意学习另一种语言,如果它让生活更轻松。

谢谢!

5 个答案:

答案 0 :(得分:3)

我建议你自己滚动。 GP中90%的工作是编码基因型,如何操作,以及适合度计算。这些是针对每个不同问题/项目而改变的部分。实际的进化算法部分通常很简单。

有几个GP库(http://en.wikipedia.org/wiki/Symbolic_Regression#Implementations)。我会用这些作为例子和参考文献。

C ++是GP的不错选择,因为它们往往计算量很大。通常,适应度函数是瓶颈,所以至少要对这部分进行编译/优化是值得的。

答案 1 :(得分:1)

我使用GAUL

这是一个满足你想要的C库 (pthread / fork / openmp / mpi)
(各种交叉/变异功能)
(非GA优化:Hill-Climbing,N-M Simplex,模拟退火,禁忌,......)

为什么在有这么强大的工具时建立自己的库???

答案 2 :(得分:1)

我还没有亲自使用过,但是Age Layered Population Structure (ALPS)方法已经被用来产生人类竞争力的结果,并且已经被证明在粗糙的健身景观中找到最佳解决方案的几种流行方法。此外,该链接包含C ++ FTW中的源代码。

答案 3 :(得分:0)

我有类似的问题。我曾经遇到过一个复杂的问题,因此不希望根据固定长度的矢量来定义解决方案。即使是可变长度的向量也没有吸引力。大多数库都集中在成本函数计算便宜的情况下,这与我的问题不符。缺乏并行性是他们的另一个陷阱。期望用户分配内存供库使用,这增加了伤害。我的情况更加复杂,因为大多数库在评估之前都会检查非线性条件。同时,我需要根据评估结果检查评估期间或评估之后的非线性条件。当我需要评估解决方案以计算其成本,然后不得不重新计算解决方案以提供解决方案时,这也是不希望的。在大多数情况下,我不得不编写成本函数两次。一次用于Google Analytics(分析),一次用于演示。

面对所有这些问题,我最终设计了自己的openGA库,该库现已成熟。

  • 该库基于C ++,并随免费的Mozilla Public License 2.0一起分发。它保证使用此库不会限制您的项目,并且可以在无需征得任何许可的情况下免费用于商业目的或非商业目的。从这个意义上说,并非所有库都是透明的。
  • 它支持三种模式:单目标,多目标(NSGA-III)和交互式遗传算法(IGA)。
  • 该解决方案并非强制性的。它可以是具有任何自定义设计的任何结构,其中包含任何具有可变长度的可选值。此功能使该库适合于遗传编程(GP)应用程序。
  • 使用
  • C ++ 11。模板功能使解决方案结构设计具有灵活性。
  • 标准库足以使用此库。除此之外,没有任何依赖性。整个库还是单个头文件,以方便使用。
  • 默认情况下,该库支持并行性,除非您将其关闭。如果您具有N核CPU,则默认情况下,线程数设置为N。您可以更改设置。您还可以设置解决方案评估是在线程之间平均分配还是将其分配给已完成其工作并且当前处于空闲状态的任何线程。
  • 解决方案评估与最终成本的计算分开。这意味着您的评估功能可以模拟系统并保留大量信息。稍后将调用您的成本函数,并根据评估报告成本。您的评估结果将保留给用户以后使用。您无需重新计算。
  • 您可以在评估期间随时拒绝解决方案。不浪费时间。实际上,评估和约束检查是集成的。
  • GA assist功能可帮助您从提供的信息中生成C ++代码库。

如果这些功能符合您的需求,建议您阅读用户手册和openGA示例。

相关出版物的读者数量和引文数量以及github上最喜欢的标记都在增加,其使用量也在不断增长。

答案 4 :(得分:-1)

我建议您查看一下matlab优化工具包 - 它附带GAs out of the box,您只需编写适应度函数(以及最终生成初始种群的函数)并且我相信matlab具有一些C ++互操作性所以你可以用C ++编写函数代码。我正在将它用于我的实验,一个非常好的功能是你可以获得开箱即用的各种图表。

这么说 - 如果你的目的是学习遗传算法你最好编码它,但如果你只是想运行实验,matlab和C ++(甚至只是matlab)是一个不错的选择。