我可以在 nlopt 中表示染色体吗?

Can I represent a chromosome in nlopt?

我想找到问题的最佳解决方案。但是,解决方案(染色体)表示为整数向量(长度未知)。

据我所知,NLOPT 接受 double* 作为输入。此外,属性的数量是constant。那么是否可以环绕并传递 std::vector<int>?

编辑 - 问题的微小描述:

我有一套要点。我想使用启发式对这一点进行排序。这种启发式有些复杂。如果我们在每个连续的点之间画线,它们之间交叉线的数量可能会更少。我在想一些接近 gentic 算法的东西,我可以将解决方案表示为有序索引的染色体。

我选择 NLOPT 是因为我之前用它做过非常成功的实验。我知道它可以使用许多其他遗传或蜜蜂算法库来解决。但在这里我问的是 NLOPT it self。

您有一个 vector<int> 作为输入,但是您的库需要一个 double* 和一个恒定大小。

你可以这样做:

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{

  std::vector<int> iVector = {1, 2, 3, 4};
  std::vector<double> dVector;

  dVector.resize(iVector.size());

  std::transform(iVector.begin(), iVector.end(), dVector.begin(), [&] (auto i) -> double { return static_cast<double>(i); } );

  for (auto d : dVector)
  {
      std::cout << d << std::endl;
  }

  std::cout << &dVector[0] << std::endl;

}

您可以使用 &dVector[0] 作为 double * 访问矢量数据。 dVector.size() 的常量大小在向量不修改其内部存储之前一直有效。

你肯定需要将数据转换回来,你可以用同样的原理来做。

编辑

否则,有一个直接包装 C API 的 NLopt C++ 引用,因此您可以直接传递 vector<double>.

只需包含 #include <nlopt.hpp> 即可以 C++ 方式调用 nlopt。

参见:http://ab-initio.mit.edu/wiki/index.php/NLopt_C-plus-plus_Reference