2016-04-21 3 views
-1

я просто начать с CPLEX Python API и я получил проблему с созданием linear_constraints для моей моделиCPLEX питон сумма ограничение

Я хочу сделать что-то вроде этого:

dvar float+ x[] 

Minimize: Sum(i in I) C[i] * x[i] 

subject to: 
sum(i in I) x[i] <= constantValue 

и моя проблема заключается в том, что я не знаю, как сделать ограничение в Python API

cpx.linear_constraints.add(
      lin_expr= 1, 
      senses=["L"], 
      rhs=constantValue, 
      range_values= 2, 

Что я хочу спросить у что мне нужно ввести в 1) и 2), чтобы получить SUM из х [I] таблицы, которые также должны быть переменная решения ,

+0

Я рекомендовал бы, чтобы вы посмотрите на примеры, которые поставляются вместе с CPLEX (например, lpex1.py, и т.д.). – rkersh

ответ

2

Вот пример:

>>> import cplex 
>>> c = cplex.Cplex() 
>>> c.variables.add(names = ["x1", "x2", "x3"]) 
>>> c.linear_constraints.add(lin_expr = [cplex.SparsePair(ind = ["x1", "x3"], val = [1.0, -1.0]), 
           cplex.SparsePair(ind = ["x1", "x2"], val = [1.0, 1.0]), 
           cplex.SparsePair(ind = ["x1", "x2", "x3"], val = [-1.0] * 3), 
           cplex.SparsePair(ind = ["x2", "x3"], val = [10.0, -2.0])], 
         senses = ["E", "L", "G", "R"], 
         rhs = [0.0, 1.0, -1.0, 2.0], 
         range_values = [0.0, 0.0, 0.0, -10.0], 
         names = ["c0", "c1", "c2", "c3"],) 
>>> c.linear_constraints.get_rhs() 
[0.0, 1.0, -1.0, 2.0] 

, где range_values ​​список поплавков, указав разницу между стороной левой и правой стороной каждого линейного ограничения. Если range_values ​​[i]> 0 (ноль), то ограничение i определяется как rhs [i] < = rhs [i] + range_values ​​[i]. Если range_values ​​[i] < 0 (ноль), то ограничение i определяется как rhs [i] + range_value [i] < = a * x < = rhs [i]. Я бы предложил оставить его по умолчанию (пустое).

Чтобы определить сумму просто указать все переменные и вектор из единиц, например,

NumCols = 10 
vars = [ 'x'+str(n) for n in xrange(1,NumCols+1) ] 
coef = [1]*NumCols 
cpx.linear_constraints.add(
     lin_expr= [cplex.SparsePair(ind = vars, val = coef)] , 
     senses=["L"], 
     rhs=[constantValue]) 
+0

Вы можете рассмотреть возможность размещения второго примера в верхней части вашего ответа и просто сказать, что необязательный аргумент range_values ​​может быть опущен (он напрямую отвечает на вопрос). Пример сверху может быть немного подавляющим. Кроме того, стоит отметить, что существует несколько способов сделать это. Вы можете использовать индексы вместо имен, списки списков вместо использования SparsePair и т. Д. – rkersh