【问题标题】:Dual infeasible due to empty column 'x1' in Python w/Cplex/Docplex由于 Python w/Cplex/Docplex 中的空列“x1”,双重不可行
【发布时间】:2021-04-08 06:10:21
【问题描述】:

我非常感谢您为这个优化问题提供任何意见:

我未能为ij 的变量分配值1,2,3,4,5,我认为这就是我收到此错误的原因:

Dual infeasible due to empty column x1. 

我走对了吗?


import cplex
import docplex

col_vars = ["x1", "x2", "x3", "x4", "x5"]
variables= len(col_vars)
numberofx= 5
constraintNames=["xixj"]

from docplex.mp.model import Model

mdl = Model(name="Homework10_2", log_output=True)

x=mdl.continuous_var_list(numberofx)

myObjective=mdl.sum(x[i] for i in range(numberofx))
print(myObjective)
mdl.maximize(myObjective)
   
for j in range(numberofx): 
    if  (x[j] != x[i] for i in range(variables)):
        continue
        myConstraint=mdl.sum(x[j]+x[i] for i in range(variables))<=1
        mdl.add(myConstraint, name=constraintNames[j])
    #mdl.add(x[j] != x[i] for i in range(variables))

mdl.export_as_lp("Homework10.lp")

mdl.solve()
mdl.print_solution()

【问题讨论】:

    标签: python cplex docplex operations-research


    【解决方案1】:

    实际上,您的代码存在一些严重问题。 一、测试:

       if  (x[j] != x[i] for i in range(variables)):
    

    是错误的,因为它测试了 Python 生成器的布尔值(在 Python 文档中查找)。 所以这个测试总是正确的,但是它找到了continue 指令并重新开始,没有发布任何约束。

    如果想法是发布每对不同变量小于 1 的约束,您应该使用索引来引用变量,并测试索引是否相等或差异,而不是变量。 DOcplex 变量是复杂的 Python 对象,对于这些对象,==!= 等运算符已重载具有非标准行为,简而言之,返回约束对象。

    在您的情况下,一个简单的解决方案是在索引上循环两次:

    n_vars = len(x)
    for i in range(n_vars):
        for j in range(n_vars):
            if i < j:
                mdl.add( x[i] + x[j] <= 1)
    

    请注意,我避免使用 i &lt; j 测试为不同索引的每一对 (i,j) 发布两个约束。

    第二个约束 x >= 0 是隐式的,因为变量的默认下限是 0。

    【讨论】:

    • 非常感谢 Philippe,这真的很有帮助!!非常感谢!
    猜你喜欢
    • 2019-07-20
    • 2020-10-30
    • 2019-10-12
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 2017-04-27
    相关资源
    最近更新 更多