2015-03-07 6 views
0
Gurobi в python для вычисления нормы l1

Я пытаюсь рассчитать норму l1, используя Gurobi в python. Поскольку я новичок в python и Gurobi, я здесь, чтобы попросить о помощи.Gurobi in python для вычисления нормы lp

Модель:

minimize 1^T(r+ + r-) 
s.t. y - X beta = r+ - r- 
r+ >= 0 and r- >= 0 

где у есть п вектор, а Х представляет собой матрицу п-по-р. r +, r- - вектор n, а β - вектор p Вот мой код, я не знаю, что не так, может кто-нибудь помочь мне?


row col = X.shape 

# import Gurobi 
from gurobipy import * 

# model 
m = Model("l1-norm") 

# create decision variables 
r_plus = [] 
for i in range(row): 
    r_plus = m.addVar(name="r_plus%d" % i) 
r_minus = [] 
for i in range(row): 
    r_minus = m.addVar(name = "r_minu%d" % i) 
beta = [] 
for j in range(col): 
    beta = m.addVar(name = "beta%d" % j) 

# Update model to integrate new variables 
m.update() 

# set objective 
m.setObjective(sum(r_plus) + sum(r_minus), GRB.MINIMIZE) 

# add model constraint 
for i in range(row): 
m.addConstr(y[i] - quicksum(X[[i], j] * beta[j] for j in range(col)) == r_plus[i] - r_minus[i]) 

# solve 
m.optimize() 
+0

Пожалуйста отправьте сообщение об ошибке вы получите – IainDunning

+0

Спасибо за вопрос, сообщение об ошибке, которое я получил в настоящее время: ----------------------------------------- ---------------------------------- TypeError Traceback (самый последний вызов последнего) в () 22 # набор Цель ---> 23 m.setObjective (сумма (r_plus) + сумма (r_minus) , GRB.MINIMIZE) 25 # добавить ограничение модели TypeError: объект «Var» не является итерируемым –

ответ

3

Вы создаете ваши массивы переменных неправильно, он должен быть

r_plus = [] 
for i in range(row): 
    r_plus.append(m.addVar(name="r_plus%d" % i)) 
r_minus = [] 
for i in range(row): 
    r_minus.append(m.addVar(name = "r_minu%d" % i)) 
beta = [] 
for j in range(col): 
    beta.append(m.addVar(name = "beta%d" % j)) 

или более кратко

r_plus = [m.addVar(name="r_plus%d" % i) for i in range(row)] 
r_minus = [m.addVar(name="r_minu%d" % i) for i in range(row)] 
beta = [m.addVar(name = "beta%d" % j) for j in range(col)]