CPLEX12.9: Сильное ветвление недоступно для проблем со смешанными целыми числами? - PullRequest
1 голос
/ 07 ноября 2019

Я хочу получить хорошие оценки ветвления с помощью cplex и python, и в качестве первого шага я просто попытался использовать «cplex.advanced.strong_branching» для решения очень простой проблемы MILP (мой код точно следовал примеру использования этой функции). Однако он сказал мне, что «Ошибка CPLEX 1017: недоступно для задач со смешанными целыми числами», что меня сильно смутило, поскольку SB должен быть традиционным алгоритмом ветвления и ограничения. Но когда я использовал его для решения проблемы с LP, он работал хорошо.

Ошибка, похоже, возникла из "CPXXstrongbranch", базового API C / C ++, что также заставило меня задуматься о том, как cplex может принимать решения SB, когда я устанавливаю параметр стратегии ветвления в SB. Подобный вопрос в том, что я знаю, что Python API не имеет важной функции "CPXgetcallbacknodelp", так как же может работать "cplex.advanced.strong_branching"? Может ли это быть причиной этой ошибки?

Я не совсем понимаю, как "CPXstrongbranch" работает в C, поэтому следующая информация может быть неверной: я пытался использовать "CPXstrongbranch" в пользовательской ветвиобратный вызов примера "adlpex1.c" и возникла та же ошибка;это остановило меня, чтобы использовать "ctypes", чтобы получить функцию "CPXgetcallbacknodelp".

Может ли быть проблема с версией? Cplex блокирует доступ SB? Потому что я прочитал статью, которая опиралась на оценки SB в Cplex 12.6.1 и C API. Или я просто сделал несколько ошибок.

Мой вопрос заключается в том, может ли Cplex выполнять SB и доставлять результаты пользователям в проблеме MILP.

1 Ответ

1 голос
/ 07 ноября 2019

cplex.advanced.strong_branching не выполняет разветвления. Документ немного сбивает с толку здесь. Эта функция вычисляет сильное ветвление оценки для переменных, которые вы передаете (или всех переменных, если вы не передаете список).

Для этого требуется LP, потому что обычно в MIPВ дереве поиска вы вызываете эту функцию с текущим ослаблением LP.

Если вы хотите использовать CPLEX с сильным ветвлением, тогда установите для параметра выбора переменной значение "сильное ветвление":

with cplex.Cplex() as cpx:
    cpx.parameters.mip.strategy.variableselect.set(cpx.parameters.mip.strategy.variableselect.values.strong_branching)
    cpx.solve()

The *Функция 1011 * необходима только в том случае, если вы хотите реализовать собственный алгоритм ветвления.

...