Нет двойной границы при создании столбца - PullRequest
2 голосов
/ 07 февраля 2020

В настоящее время я внедряю генерацию столбцов (вариант с несколькими товарными потоками). Примечание: я отключил предварительное разрешение, потому что подумал, что это будет проще для создания прототипов. В этом сценарии ценообразование работает нормально: добавляются правильные переменные, соответственно изменяются ограничения и т. Д. - если во время ценообразования больше не найдено переменных, первичная граница, заданная SCIP до этого раунда, является оптимальным целевым значением.

Моя проблема заключается в том, что указанная двойная граница равна «---» каждой итерации, и SCIP не распознает решение как оптимальное.

Я не совсем понимаю, что происходит внутри, тем более что двойная решения, которые SCIP дает мне во время ценообразования ( SCIPgetDualSolLinear () ) верны, одна идея состоит в том, что целевая функция как-то вырождается.

Единственное, что я могу выяснить, это то, что у него есть что-то делать с предварительным разрешением и помечать ограничения как изменяемые.

Если я не помечаю ограничения как изменяемые, SCIP сообщает правильную двойную границу, но оценка не работает, потому что SCIPgetDualSolLinear () не удается - Я предполагаю, что пометка ограничения как модифицируемого вида держит его доступным для использования в ценообразовании? В любом случае, я удивлялся, почему исходное ограничение должно быть помечено как модифицируемое, когда переменные фактически добавляются к ограничениям, полученным из SCIPgetTransformedCons () .

Включение или отключение предварительного разрешения не Если пометить ограничения как изменяемые, SCIP создаст двойную границу, но, как уже упоминалось, цены не получатся Единственное исключение из этого: если я запускаю программу со всеми добавленными переменными и iff preolving выключен, SCIPgetDualSolLinear () не завершается ошибкой, даже если ограничения не помечены как изменяемые , В этом случае двойная граница также сообщается. Я думаю, это поддерживает мысль о том, что модифицируемый флаг как-то связан с «сохранением структуры».

Надеюсь, это описание было понятно, и кто-то может указать мне правильное направление, у меня нет идея о том, как действовать.

Спасибо

edit: я только что попытался установить ограничения, полученные из SCIPgetTransformedCons () , как изменяемые, а не исходные, но результаты по-видимому, остается прежним.

edit2, дополнительная информация: я читаю в файлах .lp и использую SCIPsetConsModifiable () во время вызова activPricerXyz () , но до вызов activPricer () .

1 Ответ

2 голосов
/ 08 февраля 2020

Что ж, решение, как и в большинстве случаев, заключается в чтении документов:)

В обычном случае, когда оценщик либо добавляет новую переменную, либо гарантирует, что больше нет переменных с отрицательным значением двойная осуществимость, указатель результата должен быть установлен в SCIP_SUCCESS. Только если оценщик отменяет ценообразование без создания новой переменной, но могут существовать дополнительные переменные с отрицательной двойной выполнимостью, указатель результата должен быть установлен в SCIP_DIDNOTRUN. В этом случае, который иногда называют «ранним ветвлением», LP-решение не будет использоваться в качестве нижней границы. Однако оценщик может сохранить действительную нижнюю границу в нижнем указателе.

В моем случае указатель успеха был установлен на SCIP_DIDNOTRUN, даже если оценщик мог гарантировать оптимальность.

...