2016-01-08 7 views
0

Линейная программа:Добавление линейного ограничения в CPLEX питона API

Decision Variables: 
x[] 

Maximize: Sum(i to n) (fare[i] * x[i]) 

subject to: 
x[i] <= demand[i] 

Я пытаюсь добавить линейное ограничение в CPLEX с помощью питона.

, но не удалось получить синтаксис правильно. Меня беспокоило какое-то время. Пожалуйста, игнорируйте жесткое кодирование переменных и значений.


fare = [400.0, 700.0, 600.0] 
dmd= [2, 4, 3] 
itins = [] 
for count in range(3): 
     i = Itinerary(count, 1, dmd[count], fare[count]) 
     itins.append(i) 


# problem variables 
X=[] * len(itins) 

def setupproblem(c): 

    c.objective.set_sense(c.objective.sense.maximize) 
    num_x = range(len(itins)) 
    print (num_x) 

    varnames = ["X"+str(j) for j in range(len(itins))] 
    c.variables.add(names = varnames, lb=[0.0, 0, 0], ub=[10.0, 10, 10]) 
    x = [c.variables.add(obj=fare) for i in num_x] 

i_iten = range(len(itins)) 

    c.linear_constraints.add(lin_expr = [cplex.SparsePair(ind = i_iten, 
                val = X[i]) 
              for i in range(len(itins) -1)], 
          senses = ["L"], 
          rhs = capacity, 
          names = ["capacity_"+str(i) 
             for i in i_iten]) 

Получение этой ошибки:

raise CplexError(" %d: Invalid name -- '%s'\n" % tuple(self._mat)) 
cplex.exceptions.errors.CplexError: 1210: Invalid name -- 'X' 
+0

Можете ли вы написать линейную программу, которую вы пытаетесь решить? –

+0

@serge_k: добавлена ​​линейная проблема. Он пытается максимизировать доход (номер тарифа *) с учетом ограничений. – Hansraj

+0

У вас есть странный тип ограничений при добавлении переменных: первые элементы в 'lb' и' ub' являются 'float', а остальные' int'. Являются ли 'x [1]' и 'x [2]' предполагаемыми целыми типами? В этом случае вам нужно указать типы, поскольку по умолчанию переменные инициализируются как непрерывные. –

ответ

2

В cplex.SparcePair вам необходимо указать ненулевые элементы под val и соответствующие переменные под ind. Кроме того, из вашей линейной программы ваша правая сторона должна быть dmd.

c.linear_constraints.add(lin_expr = [cplex.SparsePair(ind = xname, 
               val = [1.0]) 
             for xname in varnames], 
         senses = ["L"], 
         rhs = dmd, 
         names = ["capacity_"+str(i) 
            for i in i_iten]) 

Кроме того, я хотел бы предложить, чтобы указать целевую функцию при добавлении переменных:

c.variables.add(obj = fare, names = varnames, lb=[0.0, 0, 0], ub=[10.0, 10, 10]) 
+0

Пробовал это, но он говорит _raise CplexError («Несогласованные аргументы») _ – Hansraj

+0

Я получил его работу. очень незначительная модификация. 'c.linear_constraints.add (lin_expr = [cplex.SparsePair (ind = [xname], val = [1.0]) для xname в varn], senses = [" L "] * len (varnames), rhs = dmd) ' Но перед странной проблемой. Строка кода для добавления нового линейного ограничения отлично работает в интерактивном режиме python. Но когда я запускаю код через файл, он терпит неудачу. Есть идеи? – Hansraj

0

c.linear_constraints.add(lin_expr=[cplex.SparsePair(ind=[xname], val=[1.0]) for xname in varn], senses=["L"] * len(varnames), rhs=dmd)

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

Эта строка должна быть первой. c.variables.add(varnames)

Спасибо serge_k за ваши первоначальные указатели!

Смежные вопросы