我正在尝试使用 Python API 在 Gurobi 中编写线性约束。在这张图片的第一行。 由于图片无法打开,约束为:
y_i≥(w_j a_i-γ_j)-M(1-x_ij),i=1,…,m,j=1,…,k
import pandas as pd
import numpy as np
import gurobipy as gp
from gurobipy import GRB
A=np.array([[ 7.6 , 8 ],
[ 3 , 2.7],
[ 0 , 0 ],
[ 0.8 , 0.5],
[ 6.6, 7.4],
[ 6.7, 7.8],
[ 1.9 , 2.6],
[ 3.2 , 4.6],
[ 6.4, 6.3],
[10 , 10]])
m = A.shape[0]#number of rows in A
n = A.shape[1] #number of cols in A
M = 100000
k=2#cluster the data points into k clusters
# create model
model = gp.Model('hyperplane clustering')
# create variables
# Create a (m,k) array of binary variables
# x[i,j]=1 means that point ai is assigned to cluster j
x = model.addMVar((m,k), vtype=gp.GRB.BINARY,name="x")
y = model.addVars(m,lb=0.0, ub=gp.GRB.INFINITY, vtype=gp.GRB.CONTINUOUS, name="y")
w = {}
for i in range(k):
for j in range(n):
w[i,j] = model.addVar(lb=0.0, ub=1.0, vtype=gp.GRB.CONTINUOUS, name='w_%s_%s' %(i,j))
w = gp.tupledict(w)
gamma = model.addVars(k,vtype=gp.GRB.CONTINUOUS, name="gamma")
model.update()
for i in range(m):
for j in range(k):
wj = w.select(j,'*')
wjmat = np.mat(wj).T
Amat = np.mat(A[i,:])
model.addConstr(y[i] > (-np.dot(Amat,wjmat) +gamma[j])-M*(1-x[i,j]))
我正在尝试这样写。但我总是收到错误“向量尺寸不兼容” 希望有人能帮我解决这个问题。谢谢!
最佳答案
正如评论中已经提到的,您不能将 np.dot
之类的 numpy 方法与 Gurobi 对象一起使用。由于第三个约束无法直接使用 MVar
和 Gurobi 的矩阵接口(interface)进行建模,因此我建议使用 Var
。
然后,只需将点积写为乘积之和:
import gurobipy as gp
from gurobipy import quicksum as qsum
# A = ...
m, n = A.shape
k = 2
M = 100_000
model = gp.Model('hyperplane clustering')
# Variables
x = model.addVars(m, k, vtype="B", name="x")
y = model.addVars(m, vtype="C", name="y")
w = model.addVars(k, n, ub=1.0, vtype="C", name="w")
γ = model.addVars(k, vtype="C", name="γ")
for i in range(m):
for j in range(k):
wdota = qsum(w[j, r] * A[i, r] for r in range(n))
# first constraint
model.addConstr(y[i] >= wdota - γ[j] - M*(1-x[i,j]))
# second constraint
model.addConstr(y[i] >= -1.0*wdota + γ[j] - M*(1-x[i,j]))
关于python - 如何使用 Python 在 Gurobi 中进行向量相乘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69128470/