2016-09-19 7 views
3

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

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

+0

Что вы подразумеваете под '' ', но я не думаю, что у меня есть доступ к этому значению'''. Какой смысл оптимизировать, если вы не можете прочитать результат? И о каком теплом мы говорим? Установка начальной или всей решающей внутренней части? – sascha

+0

@sascha Я пытаюсь получить доступ к размеру шага, который использовался при завершении оптимизации, чтобы я мог снова начать процесс с этого размера шага. Я отредактировал сообщение, чтобы попытаться сделать это более ясным. – arman

+0

В вашем случае params является начальным состоянием переменных для оптимизации, вы ставите последний (или лучший) результат там и начинаете оптимизацию с этим –

ответ

1

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

Объект имеет член 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(); 

UPDATE:

Для подсмотра значения dx объекта требуется немного взлома/обмана.Стандарт nlopt.h обрабатывает nlopt_opt как непрозрачный указатель. Фактическое определение структуры только доступно от nlopt-internal.h, что означает, что вы должны иметь полный источник и извлекать из этого определение структуры.

Это, если вы хотите положительное подтверждение того, что значения изменились. Возможно, вы сможете сделать [по каким-то причинам], что вы получаете разные значения (например, ваша функция ограничения обнаруживает что-то), не заглядывая в dx.

Или вы можете «прикрывать его», предоставляя обновленные значения с помощью API в соответствии с его назначением.

Я попытался тестовой программой, и не видел dx изменений, но я не знаю, мало [читать: ничего] о NL оптимизации, так что я понятия не имею, если мой тест был действительной или покажут действительные изменения в dx

 Смежные вопросы

  • Нет связанных вопросов^_^