如何在python中解决常数到负的gurobi变量幂

时间:2015-07-13 11:31:21

标签: python gurobi

我正在使用Gurobi和Python来解决以下问题:

  

最大。 (1-Var(3 ^ { - VC}))*(平均值(VC))s。吨。 sum(C)< = 3且C在{0,1}

然而,C是长度为n的二元决策向量。 V是大小为m×n(m <= n)的系数(信息)矩阵。这是我的python代码:

from gurobipy import *
import numpy as np

# EXAMPLE DATA SET
# ----------------------------------------------
V = np.matrix((
            (1,1,1,1,0,0),
            (0,1,1,1,1,0),
            (1,1,0,0,0,1),
            (0,0,0,1,1,1)))
V = V.tolist()

# LOCAL FUNCTIONS 
# ----------------------------------------------

# V times C
def V_x_C(V,C):
    VC = {}
    for i in range(np.shape(V)[0]):
        ij_sum = 0;
        for j in range(len(C)):
            ij_sum +=  V[i][j]*C[j]
        VC[i] = ij_sum
    return VC

# Square
def sqr(vec):
    sqr_vec = {}
    for i in range(len(vec)):
        sqr_vec[i] = vec[i]*vec[i]    
    return sqr_vec

# Variance
def variance(vec):
    mean_vec = sum(vec)/len(vec)
    diff_vec = vec-mean_vec
    sqdf_vec = sqr(diff_vec)
    var_vec  = (sum(sqdf_vec))/len(vec)
    return var_vec

# Power
def pwr(scalr,vec):
    reslt = {}
    for i in range(len(vec)):
        reslt[i] = scalr**vec[i]
    return reslt

# ObjVar
def objVar(V,C):
    VC = V_x_C(V,C)
    negVC = np.dot(-1,VC.values())
    pwrVC = pwr(3,negVC) 
    varVC = variance(1-pwrVC)
    return varVC

# ObjMean
def objMean(V,C):
    VC = V_x_C(V,C)
    sumVC = 0
    for i in range(len(VC)):
        sumVC += VC[i]
    meanVC = float(sumVC)/len(VC)
    return meanVC

# OPTIMIZATION
# ----------------------------------------------

# Create a new model
m = Model("My Model")

# Optimization Variables
C = {}
for i in range(np.shape(V)[1]):
    C[i] = m.addVar(vtype=GRB.BINARY)

# The objective is to maximize the costs
m.modelSense = GRB.MAXIMIZE

# Integrate new variables
m.update()

# Objective Function
m.setObjective( (1-objVar(V,C))*(objMean(V,C)) )

# Constraint
m.addConstr( quicksum ([C[i] for i in range(np.shape(V)[1])]) <= 3)

m.optimize()

# Publish results
for v in m.getVars(): 
    print('%s %g' % (v.varName, v.x))

我收到以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/asif/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 682, in runfile
    execfile(filename, namespace)
  File "/home/asif/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 78, in execfile
    builtins.execfile(filename, *where)
  File "/media/Win7/DATA/MPS-GSMR/PLANNER/TestPython/question_gurobi_form.py", line 83, in <module>
    m.setObjective( (1-objVar(V,C))*(objMean(V,C)) )
  File "/media/Win7/DATA/MPS-GSMR/PLANNER/TestPython/question_gurobi_form.py", line 52, in objVar
    pwrVC = pwr(3,negVC) 
  File "/media/Win7/DATA/MPS-GSMR/PLANNER/TestPython/question_gurobi_form.py", line 45, in pwr
    reslt[i] = scalr**vec[i]
TypeError: unsupported operand type(s) for ** or pow(): 'int' and 'LinExpr'

显然,主要问题是如何使用gurobi变量作为常量的幂。请建议我特别解决这个错误以及整体实施。

0 个答案:

没有答案