python - 如何使用 Python 在 Gurobi 中进行向量相乘?

标签 python math gurobi

我正在尝试使用 Python API 在 Gurobi 中编写线性约束。在这张图片的第一行。 enter image description here 由于图片无法打开,约束为:

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/

相关文章:

python - Ubuntu 上的 Django、Pyenv 和 Git 文件结构

python - 将自定义类型与 argparse 一起使用时出现正常参数错误

python - 显示直方图条形轮廓

python - 从 gurobipy 获取矩阵格式的约束

python - 为什么在使用 Model.copy() 后得到 "GurobiError: Variable not in model"?

python - Flask SQL 没有这样的表

javascript - 将scrollTop转换为增量值

algorithm - 找到两条线段的交点

python - Tkinter、变量和函数

python - Gurobi 线性表达式与常数的乘法