首页 > 解决方案 > 如何使用点积在 gurobi-python 中进行目标函数?

问题描述

致 ADM:请不要删除我的问题,这是关于 gurobi-python 中的点积,而不是 numpy !!!

过去,我使用 m.addvars 添加决策变量。

我的目标函数是大规模求和,需要运行多次。

我发现目标函数的构建需要很长时间。

代码如下:

    import gurobipy
    M = gurobipy.Model()
    # set decision variables
    x = M.addVars(n, m, vtype=gurobipy.GRB.BINARY, name='x')
    # n and m are very large


    # set obj
    obj = gurobipy.quicksum(A[ii, jj] * x[ii, jj]
                            for ii in range(n)
                            for jj in range(m))
    # A is a dense matrix (ndarray), shaped like x
    M.setObjective(obj, sense=gurobipy.GRB.MAXIMIZE)

如何优化这段代码

我尝试将 x 构造为矩阵,就像这样

x = M.addMvar((n,m), vtype=gurobipy.GRB.BINARY, name='x')

但是,当我尝试在 A 和 x 之间进行点积时,python 会引发错误。

M.setObjective(A * x, sense=gurobipy,GRB.MAXIMIZE)  # now, the A is a numpy.matrix

如何在不遍历生成的列表的情况下重写此代码

obj = gurobipy.quicksum(A[ii, jj] * x[ii, jj]
                        for ii in range(n)
                        for jj in range(m))

标签: pythonnumpygurobi

解决方案


当您使用 Gurobi 矩阵表达式时,它采用如下规范形式:

max c'x
    A x = b
    x >= 0

因此,虽然您可以使用具有任意维数的 Model.addMVar(),但您必须将其切成一维来创建线性表达式。因此,要么将你的目标系数和 x 展平为一维数组(向量),要么进行切片,要么切换到普通的 Var 对象并以代数方式构建表达式。


推荐阅读