python - 如何使用点积在 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))
解决方案
当您使用 Gurobi 矩阵表达式时,它采用如下规范形式:
max c'x
A x = b
x >= 0
因此,虽然您可以使用具有任意维数的 Model.addMVar(),但您必须将其切成一维来创建线性表达式。因此,要么将你的目标系数和 x 展平为一维数组(向量),要么进行切片,要么切换到普通的 Var 对象并以代数方式构建表达式。
推荐阅读
- python - 如何在谷歌云功能中运行exe文件?
- facebook - 您输入的电子邮件地址未与 Facebook 帐户关联错误
- typescript - 这两个泛型声明有什么区别?
- flutter - Firestore 颤振复杂查询
- jquery - Wordpress 锚定到另一个页面部分
- typescript - 如何使用 ngx-translateservice 翻译打字稿中的方法
- swift - 从 UIView 层中删除子层会导致应用程序崩溃
- javascript - node.js flash 消息问题
- java - 根据 Java 中的一个值重新排列列表
- unit-testing - 我可以将 PBIX 报告中过滤器的值提取到文本文件中进行测试吗?