微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

由于 Python w/Cplex/Docplex 中的空列“x1”,双重不可行

如何解决由于 Python w/Cplex/Docplex 中的空列“x1”,双重不可行

我非常感谢您对此优化问题的任何意见:

enter image description here

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

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()

解决方法

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

   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 < j 测试为不同索引的每对 (i,j) 发布两个约束。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。