1

我真的很感激这个优化问题的任何输入:

在此处输入图像描述

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

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

1 回答 1

0

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

   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。

于 2021-01-01T15:12:38.670 回答