CPLEX: доступ к сильным значениям ветвления через API Python

Я работаю над некоторыми расширенными эвристиками ветвления для смешанного целочисленного программирования, используя CPLEX (12.9) с помощью API Python (3.6). Часть решений о ветвлении должна основываться на оценке сильных ветвлений (SB) переменных. Хотя я могу запросить оценку псевдостоимости переменных напрямую через API [1], кажется, нет простого способа получить рассчитанные оценки SB. Поэтому я хочу реализовать расчет самостоятельно. Я нашел старое сообщение на форуме, описывающее, как максимально эффективно реализовать сильные вычисления ветвления [2] с помощью C-API. К сожалению, описанный метод использует библиотечные вызовы (например, CPXgetcallbacknodelp()), для которых я не могу найти соответствующие методы Python.

Это оставляет меня с тремя вопросами:

  1. Есть ли вызов API, чтобы получить баллы SB, которые я пропустил?
  2. Я упустил из виду питона оболочка для CPXgetcallbacknodelp() и т. д.?
  3. Есть ли простой способ добавить оболочки для неподдерживаемых вызовов C-API для оболочки cplex python (может быть, путем расширения сгенерированных SWIG файлов Python)?

[1] https://www.ibm.com/support/knowledgecenter/SSSA5P_12.9.0/ilog.odms.cplex.help/refpythoncplex/html/cplex.callbacks.ControlCallback-class.html

[2] https://www.ibm.com/developerworks/community/forums/html/threadTopic?id=77777777-0000-0000-0000-000014479565&ps=25

На форуме IBM Developer Answers здесь есть связанный вопрос.

rkersh 29.04.2019 22:11

Мой вопрос касается эффективного расчета/получения баллов SB. Я знаю, как реализовать обратные вызовы в целом.

CharJ 29.04.2019 23:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
2
318
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Невозможно получить доступ непосредственный к nodelp через CPLEX Python API. Если вы используете один из обратных вызовов, унаследованных от HSCallback, вы можете вызвать для него solve() и т. д.

Что вы можете сделать (хотя это может быть неэффективно), так это клонировать исходную проблему, передавать ее обратному вызову при ее создании, а затем на каждом узле вызывать Cplex.advanced.strong_branching().

Спасибо за ваш полезный ответ. Чтобы использовать advanced.strong_branching на каждом узле, клон моей проблемы должен знать, какие переменные уже использовались для ветвления над текущим узлом (не так ли?).

CharJ 30.04.2019 09:15

Я думаю, вам не нужно знать, какие переменные были разветвлены сами по себе. С другой стороны, вам нужно знать, какие из них зафиксированы в текущем узле, что вы можете получить, посмотрев границы. Это будет включать в себя переменные, которые были разветвлены, а также те, которые были выведены с помощью других средств.

Xavier Nodet 30.04.2019 10:59

Хорошая точка зрения. Таким образом, в основном я мог бы сделать следующее (сокращение и предварительное решение отключены на данный момент): - Сохраняйте копию проблемы в отдельной переменной. - В каждом узле запрашивайте текущие границы переменных и добавляйте их в копию. - Используйте strong_branching при копировании и сборе результатов. Кажется разумным. Я проведу некоторое исследование того, как можно использовать теплый старт для ускорения процесса.

CharJ 30.04.2019 11:40

Я также придумал другую стратегию, которая может быть быстрее. Используйте nodecallback и branchcallback. В обратном вызове ветвей добавьте ветки для каждой переменной, для которой я хочу рассчитать оценку SB (sb-узлы), и одну псевдоветвь, которая состоит из той же проблемы, что и текущий узел (псевдоузел). В обратном вызове node всегда сначала выбирайте sb-узлы и решайте их, устанавливая ограничение симплексной итерации на некоторое значение. Соберите информацию, сгенерированную sb-узлами, и передайте ее псевдоузлу, чтобы принять реальное решение о ветвлении.

CharJ 30.04.2019 12:15

Другие вопросы по теме