SCIPincludeBranchruleMybranchingrule() вызывается много раз

StackOverflow https://stackoverflow.com//questions/25018191

  •  21-12-2019
  •  | 
  •  

Вопрос

Я включаю свое собственное правило ветвления в SCIP и использую SCIPincludeBranchruleMybranchingrule() функция для инициализации некоторых данных правила ветвления.Одна из вещей, которые я делаю, это звоню в SCIPgetNVars() функция.Когда я запускаю код, я вижу, что функция вызывается много раз (не один раз, как я думал, до запуска алгоритма B&B), и получаю следующую ошибку, вызванную SCIPgetNVars() функция:

[src/scip/scip.c:10048] ERROR: invalid SCIP stage <0>

Я смущен использованием SCIPincludeBranchruleMybranchingrule(), поскольку в документации указано, что эту функцию можно использовать для инициализации данных правила ветвления.Я хотел бы инициализировать некоторые данные, которые можно использовать на каждом узле B&B, возможно, данные правила ветвления не являются правильным способом сделать это.

Я буду признателен за любую помощь!

Это было полезно?

Решение

Здесь важно отметить, что пока нет проблем, для которых вы хотите получить доступ к переменным.

Правила ветвления SCIP предоставляют несколько обратных вызовов для инициализации данных.А include- обратный вызов вызывается только один раз, когда начинается scip, он же в SCIP_STAGE_INIT стадия SCIP.На этом этапе вы хотите, чтобы правило ветвления сообщало SCIP о своем существовании и, при необходимости, вводило некоторые пользовательские параметры, которые независимый от проблемы.

Есть еще две функции обратного вызова, которые позволяют хранить данные, которые лучше подходят для того, что вы собираетесь делать; SCIPbranchruleInitsolMybranchingrule который называется незадолго до того, как (предусмотренная) проблема должна быть решена с помощью ветви и связанного, и SCIPbranchruleInitMybranchingrule, который вызывается после преобразования только что прочитанной задачи.

Поскольку выполнение правила ветвления ограничено процессом ветвления и привязки, ваш обратный вызов SCIPbranchruleInitSolMybranchingrule который вам следует реализовать, переместив туда всю инициализацию данных, специфичных для конкретной проблемы.Не забудьте также реализовать SCIPbranchruleExitsolMybranchrule для освобождения сохраненных данных каждый раз, когда поиск по принципу ветвей и границ завершается, либо если поиск был прекращен, либо если был достигнут предел времени, либо если SCIP решил, что требуется еще один перезапуск.

К вашему сведению:Данные, выделенные во время обратного вызова включения, можно освободить с помощью SCIPbranchruleFreeMybranchingrule-callback, который выполняется один раз, когда SCIP собирается завершить работу и освободить всю оставшуюся системную память.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top