参数不一致CPLEX错误Python API

时间:2017-01-23 20:44:56

标签: python cplex

我有很长的决策变量列表,基本上都是基于输入数据文件。但是,为方便起见,我们使用以下示例: 我将决策变量添加到我的模型中,并且每个决策变量都被约束在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正在给我这个问题,因为当我删除它时一切正常。我该如何以正确的方式设置ubcolumns函数中的model.variables.add参数是指什么?

2 个答案:

答案 0 :(得分:1)

ub参数应该是与obj参数大小相同的序列。因此,您需要使用ub=list(np.ones((1, mylist.shape[0]))))ub=[1.0]*len(mylist)等,而不是ub=np.ones(len(mylist))

columns参数允许您按列而不是逐行地向约束矩阵添加非零(后者通常通过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]))。

答案 1 :(得分:0)

我做了一个小的改动,ub=list(np.ones(mylist.shape[0]))并且没有错误。使用model.variables.get_upper_bounds()检查边界后,一切看起来都很好。