Предостережение: Это предположение - что-то для вас, чтобы попробовать.
Объект имеет член 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
Что вы подразумеваете под '' ', но я не думаю, что у меня есть доступ к этому значению'''. Какой смысл оптимизировать, если вы не можете прочитать результат? И о каком теплом мы говорим? Установка начальной или всей решающей внутренней части? – sascha
@sascha Я пытаюсь получить доступ к размеру шага, который использовался при завершении оптимизации, чтобы я мог снова начать процесс с этого размера шага. Я отредактировал сообщение, чтобы попытаться сделать это более ясным. – arman
В вашем случае params является начальным состоянием переменных для оптимизации, вы ставите последний (или лучший) результат там и начинаете оптимизацию с этим –