Остановить и возобновить оптимизацию

я использую 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 последний раз использовался, но я не думаю, что у меня есть доступ к этому значению.

Как мне достичь чего-то подобного?

3

Решение

Предостережение: Это предположение — что-то для вас, чтобы попробовать.

У объекта есть член 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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]