Pyomo: отправка параметров = потоков в решатель cbc вызывает ошибку

Активировать многопоточность можно в командной строке:

$cbc -threads=6
Welcome to the CBC MILP Solver
Version: 2.9.9
Build Date: Aug 21 2017
$command line - cbc -threads=6 (default strategy 1)
threads was changed from 0 to 6

Но когда я пытаюсь активировать эту опцию в коде pyomo

opt = SolverFactory('cbc')
result = opt.solve(instance, options="threads=4")

Я получаю сообщение об ошибке:

File "/usr/local/lib/python3.9/dist-packages/pyomo/opt/base/solvers.py", line 561, in solve
    self.options.update(kwds.pop('options', {}))
  File "/usr/local/lib/python3.9/dist-packages/pyutilib/misc/misc.py", line 360, in update
    if type(d[k]) is dict:
TypeError: string indices must be integers

Любые идеи?


person Elizaveta Golubeva    schedule 16.03.2021    source источник


Ответы (1)


Аргумент ключевого слова options ожидает словарь. Если вы хотите использовать тот же синтаксис, что и в командной строке, вам нужно options_string

opt.solve(instance, options_string="threads=4")
opt.solve(instance, options={"threads": 4})
person ruaridhw    schedule 18.03.2021
comment
Спасибо! Согласно misc.py я догадался, что этот аргумент ожидает словарь. Ошибок больше нет, но используется только один поток, а не 4. Я использую AbstractModel. Должен ли я использовать только ConcreteModel для активации многопоточности? - person Elizaveta Golubeva; 18.03.2021
comment
@ElizavetaGolubeva гарантирует, что исполняемый файл CBC является многопоточным. Если вы компилировали из исходного кода, вам следовало бы указать это в качестве опции. Кроме того, насколько мне известно, несколько потоков полезны только на этапах ветвления и привязки решения. PS: Я также написал оболочку решателя для Pyomo, чтобы упростить выбор решателей и получение конечных результатов переменных, если вы хотите это проверить: github.com/judejeh/PyomoSolverWrapper - person EJay; 30.03.2021