Как решить постоянную в отрицательной степени переменной gurobi в питоне
Я использую Gurobi с Python для решения следующей проблемы:
Максимум. (1-Var(3^{-VC})) * (среднее значение (VC)), первая сумма (C) <= 3 и C в {0,1}
Принимая во внимание, что C является двоичным вектором решения длины n. V - матрица коэффициентов (информации) размером mxn (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'
Итак, по-видимому, основной вопрос заключается в том, как использовать переменную Гуроби в качестве мощности на константу. Пожалуйста, предложите мне рассмотреть проблему, в частности, и общую реализацию в целом.