问题描述
我非常感谢您对此优化问题的任何意见:
我未能将 1,2,3,4,5
和 i
的值 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。