8

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

我应该补充一点,虽然我对 c++ 并不陌生,但我对在 c++ 中进行这种数学优化工作还是相当陌生,因为我之前与之合作的小组倾向于使用专有的优化包。

我们有一个计算量相当大的适应度函数来评估,并且我们有一个集群来运行它,所以并行化代码是非常可取的。

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

谢谢!

4

5 回答 5

4

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

那里有几个 GP 库(http://en.wikipedia.org/wiki/Symbolic_Regression#Implementations)。不过,我会将这些用作示例和参考。

C++ 是 GP 的一个不错的选择,因为它们往往是计算密集型的。通常,适应度函数是瓶颈,因此至少对这部分进行编译/优化是值得的。

于 2010-05-18T15:12:43.803 回答
1

我用高卢

这是一个你想要的 C 库。
( pthread/fork/openmp/mpi )
( 各种交叉/变异函数 )
( 非 GA 优化: Hill-Climbing, NM Simplex, Simulated annealing, Tabu, ... )

既然有这么强大的工具,为什么还要建立自己的库???

于 2010-09-26T21:58:14.597 回答
1

我还没有亲自使用过,但是年龄分层人口结构 (ALPS)方法已被用于生成人类竞争结果,并且已被证明在粗略的适应度环境中寻找最佳解决方案方面优于几种流行的方法。此外,该链接还包含 C++ FTW 中的源代码。

于 2010-10-11T12:52:28.297 回答
0

我有过类似的问题。我曾经遇到过一个复杂的问题,并且不希望根据固定长度向量定义解决方案。即使是可变长度的向量看起来也没有吸引力。大多数图书馆都专注于成本函数计算成本低的情况,这与我的问题不匹配。缺乏并行性是他们的另一个陷阱。期望用户分配内存供库使用是雪上加霜。我的案例更加复杂,因为大多数库在评估之前都会检查非线性条件。同时,我需要根据评估结果在评估期间或评估之后检查非线性条件。当我需要评估解决方案以计算其成本然后我不得不重新计算解决方案以呈现它时,这也是不可取的。在大多数情况下,我不得不写两次成本函数。一次用于 GA,一次用于演示。

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

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

如果这些功能符合您的需要,我建议您查看用户手册和 openGA 的示例。

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

于 2019-10-16T08:26:06.953 回答
-2

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

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

于 2010-05-22T09:02:46.917 回答