Я хочу найти лучшее решение для проблемы. Однако решение (хромосома) представляется как вектор целых чисел (длина неизвестна).
Насколько я знаю, НЛОПТ принимает double*
в качестве входа. Кроме того, количество атрибутов является constant
, Так можно ли обернуться и передать std::vector<int>
?
РЕДАКТИРОВАТЬ — Крошечное описание проблемы:
У меня есть набор очков. Я хочу разобраться в этом, используя эвристику. Эта эвристика немного сложна. Это меньшее возможное количество линий пересечения между ними, если мы проводим линию между каждой последовательной точкой. Я думал о чем-то близком к гениальному алгоритму, где я могу представить решение в виде хромосомы упорядоченных индексов.
Я выбрал NLOPT, потому что у меня был очень успешный предыдущий эксперимент с ним. Я знаю, что это может быть решено с использованием многих других генетических библиотек или библиотек алгоритмов пчел. Но здесь я спрашиваю про NLOPT сам.
У тебя есть 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>
называть nlopt способом C ++.
Увидеть : http://ab-initio.mit.edu/wiki/index.php/NLopt_C-plus-plus_Reference
Других решений пока нет …