Я хочу использовать NLopt для моей задачи нелинейной оптимизации. Я тестирую пример кода на странице учебника введите описание ссылки здесь, C ++ пример. Работает хорошо. Но функция, которую я хочу минимизировать, должна возвращать вектор. Что, на странице учебника это имеет
double minf;
nlopt::result result = opt.optimize(x, minf);
printf("found minimum at f(%g,%g) = %g ", x[0],x[1],minf);
Я надеюсь, что minf — это вектор, поэтому я просто поменяю его на одномерный вектор для проверки.
std::vector<double> minf(1);
nlopt::result result = opt.optimize(x, minf);
printf("found minimum at f(%g,%g) = %g ", x[0],x[1],minf[0]);
Тогда это имеет ошибкиnltest2.cpp:44:44: error: no matching function for call to ‘nlopt::opt::optimize(std::vector<double>&, std::vector<double>&)’
Есть ли способ, которым я могу позволить ему перевернуть вектор?
Более того (если вы не можете ответить на этот вопрос, это нормально.) Я надеюсь использовать матричную библиотеку броненосца. Лучше бы я смог (я включил нужный файл h)
mat minf(1,1);
nlopt::result result = opt.optimize(x, minf);
printf("found minimum at f(%g,%g) = %g ", x[0],x[1],minf(1,1));
Это вызывает ошибки, конечно …
Спасибо за Ваш ответ!!
Фактически, если мы хотим поместить вектор для оптимизации, это становится многоцелевой задачей оптимизации. Я не уверен, что NLopt сможет это сделать. Когда вы хотите оптимизировать вектор, вы можете сделать один из правильных способов — превратить ваш вектор в скаляр. например, вы хотите оптимизировать [x, y], вы можете использовать z = x + y и оптимизировать z. Это может выглядеть неправильно, но иногда это работает. Или используйте более продвинутый способ, называемый «фронт Парето». Смотрите следующий слайд
изменить вектор на скаляр
Других решений пока нет …