【问题标题】:Inconsistent arguments CPLEX error Python API参数不一致 CPLEX 错误 Python API
【发布时间】:2017-01-23 20:44:56
【问题描述】:

我有一长串基本上基于输入数据文件的决策变量。但是,为方便起见,让我们使用下面的示例: 我将决策变量添加到我的模型中,并且这些决策变量中的每一个都被限制在 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参数是指什么?

【问题讨论】:

    标签: python cplex


    【解决方案1】:

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

    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]))。

    【讨论】:

    • 非常感谢您的解释!我现在慢慢习惯了 api。
    【解决方案2】:

    我做了一个小改动,ub=list(np.ones(mylist.shape[0])),没有出错。使用 model.variables.get_upper_bounds() 检查边界后,一切正常。

    【讨论】:

    • 这看起来应该是评论,而不是答案(见here)。
    • 感谢您告诉我! :)
    猜你喜欢
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2016-01-19
    • 1970-01-01
    • 2020-09-29
    • 2019-07-20
    相关资源
    最近更新 更多