2016-03-22 8 views
2

я следующий фрагмент кода Python, чтобы определить кучу «OBJ»:Как я могу использовать «строку» для обозначения «линейного выражения» в качестве аргумента внутри функции Python Gurobi?

obj1=LinExpr(sumOFw_plusPLUSw_minus) 
obj2=LinExpr(quicksum(epsilon[s] for s in N)) 

где «sumOFw_plusPLUSw_minus» является выражением и «эпсилон» является типом Var.

Я хочу сделать его параметрическим, чтобы потом добавить более объективные выражения. Для того чтобы применить, что я пытался подготовить строку внутри цикла и вызвать приведенное выше выражение, используя эту строку, как показано ниже, но получил «GurobiError: Невозможно преобразовать аргумент выражение» в строке 5.

for j in range(1,2): 
    for i in range(1,num_obj): 
     valid_obj='obj'+str(i) 
     if j==1: 
      m.setObjective(valid_obj, GRB.MINIMIZE) 
     else: 
      m.setObjective(valid_obj, GRB.MAXIMIZE) 
     m.update()  
     m.optimize() 
+1

Не могли бы вы добавить немного больше кода, чтобы сделать ваш пример воспроизводимым? Что такое 'm',' epsilon'. Благодарю. – lrnzcig

+0

Н = диапазон (1, строка + 1), # число выборок – Ozgu

+0

м = Модель ("gurobi_model_name") – Ozgu

ответ

1

Проблема в том, что 'obj' + str [i] - это только строка Python, а не объект. Gurobi не знает, как установить значение Objective в строку, он ищет объективное выражение.

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

cost =[] 
cost[0] = LinExpr(sumOFw_plusPLUSw_minus) 
cost[1] = LinExpr(quicksum(epsilon[s] for s in N)) 
... 

Теперь вы можете установить Objective, вызвав соответствующий элемент в списке затрат в зависимости от значения индекса i. (Вы даже можете добавить различные элементы, пока они справедливы и линейна.)

valid_obj = cost[i] 

m.setObjective(valid_obj, GRB.MINIMIZE) будет работать, пока каждый элемент списка является действительным линейным выражением ваших переменных решения в модели m.