я использую nlopt
С ++ интерфейс для решения задач нелинейной оптимизации.
nlopt::opt opt;
opt.set_maxeval(10);
opt.set_max_objective(foo);
double result;
std::vector<double> params(10,0);
opt.optimize(params, result);
// later on in the code
opt.optimize(params, result); // this uses the updated param values, but the step size starts from scratch
Тем не менее, я хотел бы, чтобы последняя строка продолжала оптимизировать не только с последней params
значение, но и с step_size
последний раз использовался, но я не думаю, что у меня есть доступ к этому значению.
Как мне достичь чего-то подобного?
Предостережение: Это предположение — что-то для вас, чтобы попробовать.
У объекта есть член double *dx
который хранит шаг. Если вы делаете не явно указать значения для начального шага, dx
значение выделяется в начале nlopt_optimize
со значениями по умолчанию и освобождается в конце.
Посмотрите документацию по API: http://ab-initio.mit.edu/wiki/index.php/NLopt_Reference
Есть две интересующие функции: nlopt_get_initial_step
а также nlopt_set_initial_step
,
Обычное использование использует значения по вашему выбору, звоните set_initial_step
с ними. Затем вы звоните optimize
, Затем вы повторяете этот процесс со своими собственными новыми значениями.
Но, для чего вы хотите, попробуйте это:
Изначально используйте get_initial_step
чтобы получить значения по умолчанию. Затем сделайте явный набор с set_initial_step
, Это сделает внутренний dx
массив в объекте сохраняется после optimize
называется. Я проверил это в nlopt
исходный код.
Теперь звоните optimize
,
Теперь взгляните на dx
массив внутри объекта.
Если Вы получаете обновленные значения — вы дома бесплатно. Если нет, то вам может потребоваться написать собственный код.
Вы можете просто продолжить звонить optimize
но не делать set_initial_step
звоните во второй или третий раз.
Псевдокод для «нормального» случая:
// normal usage
obj.set_initial_step(my_values_1);
obj.optimize();
obj.set_initial_step(my_values_2);
obj.optimize();
Псевдокод для «трюка»:
// special usage
obj.get_initial_step(x,my_values_1);
obj.set_initial_step(my_values_1);
obj.optimize();
// check to see if the values have been updated relative to my_values_1
// if the trick works, this should use the updated values
obj.optimize();
// if the trick works, this should use the updated values
obj.optimize();
ОБНОВИТЬ:
Подглядывать за объектом dx
значение требует немного взлома / хитрости. Стандарт nlopt.h
лечит nlopt_opt
в качестве непрозрачного указателя. Фактическое определение структуры только Доступна с nlopt-internal.h
Это означает, что вы должны иметь полный исходный код и извлечь из него определение структуры.
Это если вы хотите положительное подтверждение того, что значения изменились. Возможно, вы сможете сделать вывод [каким-то способом], что вы получаете разные значения (например, ваши функции предела обнаруживают что-то), не заглядывая в dx
,
Или вы можете «сделать это», предоставив обновленные значения с помощью API по назначению.
Я попробовал тестовую программу и не увидел dx
изменить, но я немного знаю [читай: ничего] об оптимизации NL, поэтому я понятия не имею, был ли мой контрольный пример верным или покажет действительные изменения в dx
Других решений пока нет …