Добавление ограничений CPLEX Python API

Данные, с которыми я работаю, не так просты, как в документации. Поскольку мои переменные в основном зависят от файла ввода данных, я буду использовать следующий простой пример, чтобы объяснить, чего я пытаюсь достичь. У меня есть следующие ограничения:

x1 + x2 + x3 = 1
x4 + x5 + x6 + x7 =1
x8 + x9 = 1

Я думаю об использовании цикла for для многократного вызова c.linear_constraints.add() функция. Есть ли лучший способ сделать это?

1 ответ

Решение

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

import cplex
c = cplex.Cplex()
c.variables.add(names=["x{0}".format(i+1) for i in range(9)])
c.linear_constraints.add(lin_expr=[[[0, 1, 2], [1.0, 1.0, 1.0]],
                                   [[3, 4, 5, 6], [1.0, 1.0, 1.0, 1.0]],
                                   [[7, 8], [1.0, 1.0]]],
                         rhs=[1.0, 1.0, 1.0],
                         names=["c{0}".format(i+1) for i in range(3)])
c.write("example.lp")

Это производит следующий файл LP:

Minimize
 obj:
Subject To
 c1: x1 + x2 + x3  = 1
 c2: x4 + x5 + x6 + x7  = 1
 c3: x8 + x9  = 1
End

Таким образом, было бы лучше прочитать во входном файле, сохранить информацию об ограничениях в некоторой структуре данных (списки или что-то еще), а затем вызвать c.linear_constraints.add один раз в конце (или все X-ограничения, если ваш входной файл очень большой).

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