Решатель Julia JuMP Cbc бесконечно зависает без сообщения и без выхода

Я использую язык Julia (версия 1.3.1), пакет JuMP (версия 0.20.1) и пакет Cbc (версия 0.6.6) для решения проблемы оптимизации в контейнере докеров с ubuntu: 16.04. Оптимизатор Cbc кажется зависшим, со 100% использованием процессора, без выхода и без каких-либо сообщений. Проблемы возникают редко с аналогичной проблемой и, кажется, не воспроизводятся: если я запускаю один и тот же код с теми же данными, он больше не зависает. Надеюсь, что обратная трассировка, полученная через GDB, может быть полезна.

При необходимости могу поделиться своей моделью. Он имеет 11520 переменных, 4652 ограничения, 10080 переменных, используемых в линейной целевой функции.

Это журнал оптимизатора Cbc:

Добро пожаловать в CBC MILP Solver Версия: 2.10.3 Дата сборки: 7 октября 2019 г.

командная строка - Cbc_C_Interface -threads 0 -seconds 360.0 -maxNodes 30000 -logLevel 1 -solve -quit (стратегия по умолчанию 1) секунд было изменено с 1e + 100 на 360 maxNodes было изменено с 2147483647 на 30000 Непрерывное значение цели 2.3607e + 08 - 0,11 секунды Cgl0002I 3197 фиксированных переменных Cgl0005I 7 SOS с 8323 членами Обрабатываемая модель Cgl0004I имеет 15 строк, 8323 столбца (8323 целых числа (8323 из которых двоичные)) и 26556 элементов Cbc0045I Фиксация только ненулевых переменных. Cbc0045I Предупреждение: значения mipstart нельзя использовать для построения решения.

Здесь кажется, что Cbc зависает и перестает отвечать при 100% использовании процессора.

Вот трассировка работающего процесса pid:

# 0 0x00007f163c3facc9 в ?? () из цели: /root/.julia/packages/Cbc/vWzyC/deps/usr/lib/libCbcSolver.so # 1 0x00007f163c4125b3 в ?? () из цели: /root/.julia/packages/Cbc/vWzyC/deps/usr/lib/libCbcSolver.so # 2 0x00007f163c467586 в ?? () из цели: /root/.julia/packages/Cbc/vWzyC/deps/usr/lib/libCbcSolver.so # 3 0x00007f163c46aebc в ?? () из цели: /root/.julia/packages/Cbc/vWzyC/deps/usr/lib/libCbcSolver.so # 4 0x00007f163c40594a в ?? () из цели: /root/.julia/packages/Cbc/vWzyC/deps/usr/lib/libCbcSolver.so # 5 0x00007f163c29afbe в ?? () из цели: /root/.julia/packages/Cbc/vWzyC/deps/usr/lib/libCbcSolver.so # 6 0x00007f163c2ad844 в ?? () из цели: /root/.julia/packages/Cbc/vWzyC/deps/usr/lib/libCbcSolver.so # 7 0x00007f163b8ea31f в CbcHeuristicDive :: solution (double &, int &, int &, OsiRowCut **, Cbc&SubProblem , double *) () из цели: /root/.julia/packages/Cbc/vWzyC/deps/usr/lib/libCbc.so.3 # 8 0x00007f163b8ebf42 в CbcHeuristicDive :: solution (double &, double *) () из цели : /root/.julia/packages/Cbc/vWzyC/deps/usr/lib/libCbc.so.3 # 9 0x00007f163b938fd2 в CbcModel :: resolveWithCuts (OsiCuts &, int, CbcNode *) () из target: /root/.julia /packages/Cbc/vWzyC/deps/usr/lib/libCbc.so.3 # 10 0x00007f163b9472d7 в CbcModel :: branchAndBound (int) () из цели: /root/.julia/packages/Cbc/vWzyC/deps/usr/ lib / libCbc.so.3 # 11 0x00007f163c214c47 в CbcMain1 (int, char const, CbcModel &, int () (CbcModel, int), CbcSolverUsefulData &) () из цели: / root / .julia / packages / Cbc / vWzyC / deps / usr / lib / libCbcSolver.so # 12 0x00007f163c2252ae в CbcMain1 (int, char const **, CbcModel &) () из цели: /root/.julia/packages/Cbc/vWzyC/ deps / usr / lib / libCbcSolver.so # 13 0x00007f163c19bc50 в Cbc_solve () из цели: /root/.julia/packages/Cbc/vWzyC/deps/usr/lib/libCbcSolver.so # 14 0x00007f16698e7e7 () # 15 0x000000000000000c в ?? () # 16 0x00007fff70694480 в ?? () # 17 0x00007f16604ce110 в ?? () # 18 0x000000000000262e в ?? () # 19 0x0000000000000006 в ?? () # 20 0x00007fff70694480 в ?? () # 21 0x00007f165966ab40 в ?? () # 22 0x00007f164a7ce1d0 в ?? () # 23 0x00007f164a7ce220 в ?? () # 24 0x00007f164a7ce1d0 в ?? () # 25 0x00007f1688be7b00 в ?? () в /buildworker/worker/package_linux64/build/src/array.c:738 из цели: / opt / julia / bin /../ lib / libjulia.so.1 # 26 0x00007f163d909af0 в ?? () # 27 0x00007f164439d3c0 в ?? () # 28 0x00007f1689524200 в ?? () # 29 0x0000000000000000 в ?? ()

Используя команду next в консоли gdb, CbC перехватывает ошибку StackOverflowError ().

В целевой функции слишком много терминов?

Любая помощь действительно заметна.

Спасибо


person RobIris    schedule 18.08.2020    source источник


Ответы (2)


Похоже, это проблема с Cbc. Невозможно дать больше советов без воспроизводимого примера. Я предлагаю вам попытаться упростить вашу модель и создать файл MPS.

person Oscar Dowson    schedule 18.08.2020
comment
Спасибо за ответ. Здесь ссылка, где найти файл MPS drive.google.com/drive/ u / 1 / папки / (надеюсь, это будет полезно). - person RobIris; 19.08.2020
comment
Cbc v 0.6.6 лучше обновить до Cbc v 0.7.0? Это последний релиз, но он стабильный? Есть ли способ установить тайм-аут для функции optimize! (), Чтобы справиться с подобной проблемой и принудительно завершить работу оптимизатора? В каком измерении мне нужно упростить мою модель: переменные, ограничения или количество членов в целевой функции? Огромное спасибо заранее - person RobIris; 19.08.2020
comment
При создании файла MPS появляется предупреждение: «Предупреждение: MathOptInterface.VariablePrimalStart () не поддерживается MathOptFormat.MPS.InnerModel {Float64}. Эта информация будет отброшена. ', Поэтому я думаю, что в файле MPS информация о set_start_value теряется. Я могу поделиться этим. - person RobIris; 19.08.2020
comment
После дальнейших исследований, возможно ли, что решатель Cbc будет зависеть от эвристики? в обратной трассировке я обнаружил «CbcHeuristicDive» и очень часто в решателе Cbc строку после Cbc0045I Предупреждение: значения mipstart не могут использоваться для построения решения. это одно целочисленное решение Cbc0012I для 11300000, найденное DiveCoefficient после 522 итераций и 0 узлов (0,25 секунды) - person RobIris; 19.08.2020
comment
Ссылка на привод не является общедоступной. Да, вам следует обновить версию до 0.7. Чтобы установить ограничение по времени, используйте set_optimizer_attribute(model, "seconds", 100). - person Oscar Dowson; 20.08.2020
comment
Теперь ссылка должна быть доступна, извините за это. Хорошо, обновлюсь до Cbc v 0.7.0. Я уже установил ограничение по времени в 360 секунд, но решатель не выходит после этого времени, когда он зависает, как в моем случае. После дальнейших исследований кажется, что он застрял в эвристической фазе, и по странной причине временной лимит не соблюдается. Заранее спасибо за помощь - person RobIris; 20.08.2020

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

Для более новых версий пакета:

model = Model(optimizer_with_attributes(Cbc.Optimizer
                                        ,"seconds" => 60
                                        ,"threads" => 4
                                        ,"loglevel" => 0
                                        ,"ratioGap" => 0.0001))

Или так для более старых версий пакетов:

model = Model(with_optimizer(Cbc.Optimizer
                             ,seconds=60
                             ,threads=4
                             ,loglevel=0
                             ,ratioGap=0.0001))
person MrBurch    schedule 16.02.2021