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

时间:2015-11-10 09:31:22

标签: c++ nlopt

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

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

编辑 - 问题的微小解释:

我有一套积分。我想用启发式排序这一点。这种启发式是一些复杂的东西。如果我们在每个连续点之间画线,那么它们之间的交叉线数量就越少。我正在考虑接近gentic算法的东西,在那里我可以将解决方案表示为有序索引的染色体。

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

1 个答案:

答案 0 :(得分:1)

您有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()保持有效,直到向量不修改其内部存储。

您肯定需要转换回数据,您可以使用相同的原则进行转换。

修改

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

Juste包含#include <nlopt.hpp>以C ++方式调用nlopt。

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