我可以在 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
我想找到问题的最佳解决方案。但是,解决方案(染色体)表示为整数向量(长度未知)。
据我所知,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