参数不一致 CPLEX 错误 Python API
Inconsistent arguments CPLEX error Python API
我有一长串基本上基于输入数据文件的决策变量。但是,为了方便起见,让我们使用下面的示例:
我正在向我的模型添加决策变量,并且这些决策变量中的每一个都被限制在 0 和 1(含)之间。我做了以下操作:(*mylist 是我程序中的一列数据框,所以我使用了 shape[0]
)
model.variables.add(obj=mylist, ub=list(np.ones((1, mylist.shape[0])))), types=[model.variables.type.continuous] * len(mylist) )
我可能误解了 python api 是如何定义模型构造的。我收到 CPLEX 错误:参数不一致。我怀疑 ub
给我这个问题,因为当我删除它时一切正常。我应该如何以正确的方式设置 ub
? model.variables.add
函数中的 columns
参数指的是什么?
我做了一个小改动,即 ub=list(np.ones(mylist.shape[0]))
,没有出现任何错误。使用 model.variables.get_upper_bounds() 检查边界后,一切看起来都很好。
ub
参数应该是与 obj
参数相同大小的序列。因此,您应该使用 ub=[1.0]*len(mylist)
或 ub=np.ones(len(mylist))
,而不是 ub=list(np.ones((1, mylist.shape[0]))))
,等等
columns
参数允许您将 non-zeroes 添加到约束矩阵 column-wise 而不是 row-wise(后者通常通过 Cplex.linear_constraints.add
方法)。了解 columns
参数发生了什么的一种方法是查看文档中的 example。
例如:
import cplex
c = cplex.Cplex()
c.linear_constraints.add(names = ["c0", "c1", "c2"])
c.variables.add(obj = [1.0, 2.0, 3.0],
types = [c.variables.type.integer] * 3)
c.variables.add(obj = [1.0, 2.0, 3.0],
lb = [-1.0, 1.0, 0.0],
ub = [100.0, cplex.infinity, cplex.infinity],
types = [c.variables.type.integer] * 3,
names = ["var0", "var1", "var2"],
columns = [cplex.SparsePair(ind = ['c0', 2], val = [1.0, -1.0]),
[['c2'],[2.0]],
cplex.SparsePair(ind = [0, 1], val = [3.0, 4.0])])
c.write("example.lp")
在 运行 之后,LP 文件将如下所示:
Minimize
obj: x1 + 2 x2 + 3 x3 + var0 + 2 var1 + 3 var3
Subject To
c0: var0 + 3 var3 = 0
c1: 4 var3 = 0
c2: - var0 + 2 var1 = 0
Bounds
x1 >= 0
x2 >= 0
x3 >= 0
-1 <= var0 <= 100
var1 >= 1
var3 >= 0
Generals
x1 x2 x3 var0 var1 var3
End
如果您查看约束矩阵(约束 "c0")的第一行,第一列(变量 "var0")的系数为 1.0。对于第三行(具有索引 2 的约束 "c2"),第一列(变量 "var0")的系数为 -1.0。这对应于 columns
列表中的第一项(即 cplex.SparsePair(ind = ['c0', 2], val = [1.0, -1.0])
)。
我有一长串基本上基于输入数据文件的决策变量。但是,为了方便起见,让我们使用下面的示例:
我正在向我的模型添加决策变量,并且这些决策变量中的每一个都被限制在 0 和 1(含)之间。我做了以下操作:(*mylist 是我程序中的一列数据框,所以我使用了 shape[0]
)
model.variables.add(obj=mylist, ub=list(np.ones((1, mylist.shape[0])))), types=[model.variables.type.continuous] * len(mylist) )
我可能误解了 python api 是如何定义模型构造的。我收到 CPLEX 错误:参数不一致。我怀疑 ub
给我这个问题,因为当我删除它时一切正常。我应该如何以正确的方式设置 ub
? model.variables.add
函数中的 columns
参数指的是什么?
我做了一个小改动,即 ub=list(np.ones(mylist.shape[0]))
,没有出现任何错误。使用 model.variables.get_upper_bounds() 检查边界后,一切看起来都很好。
ub
参数应该是与 obj
参数相同大小的序列。因此,您应该使用 ub=[1.0]*len(mylist)
或 ub=np.ones(len(mylist))
,而不是 ub=list(np.ones((1, mylist.shape[0]))))
,等等
columns
参数允许您将 non-zeroes 添加到约束矩阵 column-wise 而不是 row-wise(后者通常通过 Cplex.linear_constraints.add
方法)。了解 columns
参数发生了什么的一种方法是查看文档中的 example。
例如:
import cplex
c = cplex.Cplex()
c.linear_constraints.add(names = ["c0", "c1", "c2"])
c.variables.add(obj = [1.0, 2.0, 3.0],
types = [c.variables.type.integer] * 3)
c.variables.add(obj = [1.0, 2.0, 3.0],
lb = [-1.0, 1.0, 0.0],
ub = [100.0, cplex.infinity, cplex.infinity],
types = [c.variables.type.integer] * 3,
names = ["var0", "var1", "var2"],
columns = [cplex.SparsePair(ind = ['c0', 2], val = [1.0, -1.0]),
[['c2'],[2.0]],
cplex.SparsePair(ind = [0, 1], val = [3.0, 4.0])])
c.write("example.lp")
在 运行 之后,LP 文件将如下所示:
Minimize
obj: x1 + 2 x2 + 3 x3 + var0 + 2 var1 + 3 var3
Subject To
c0: var0 + 3 var3 = 0
c1: 4 var3 = 0
c2: - var0 + 2 var1 = 0
Bounds
x1 >= 0
x2 >= 0
x3 >= 0
-1 <= var0 <= 100
var1 >= 1
var3 >= 0
Generals
x1 x2 x3 var0 var1 var3
End
如果您查看约束矩阵(约束 "c0")的第一行,第一列(变量 "var0")的系数为 1.0。对于第三行(具有索引 2 的约束 "c2"),第一列(变量 "var0")的系数为 -1.0。这对应于 columns
列表中的第一项(即 cplex.SparsePair(ind = ['c0', 2], val = [1.0, -1.0])
)。