Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyomo错误:CPLEXDirect不支持度为None的表达式_Python_Cplex_Nonlinear Optimization_Pyomo - Fatal编程技术网

Python pyomo错误:CPLEXDirect不支持度为None的表达式

Python pyomo错误:CPLEXDirect不支持度为None的表达式,python,cplex,nonlinear-optimization,pyomo,Python,Cplex,Nonlinear Optimization,Pyomo,我正在做一个POC,看看pyomo是否能为我的应用程序工作,如果我的意图不可能,我可以使用一些帮助来确定是否有以下错误的修复 在添加约束“split_comp_color”后,我得到了一个错误:“CPLEXDirect不支持degree None的表达式。”我无法找到任何与此主题相关的帖子。最初,这个约束的表达式依赖于变量值,我知道这是不可能的。相反,我改变了表达式,找到每个组合并乘以变量,如果其中任何/全部为零,这些变量将被取消。基本上就是我想做的,对于每一个外观,我都想验证上衣、鞋底和鞋子的

我正在做一个POC,看看pyomo是否能为我的应用程序工作,如果我的意图不可能,我可以使用一些帮助来确定是否有以下错误的修复

在添加约束“split_comp_color”后,我得到了一个错误:“CPLEXDirect不支持degree None的表达式。”我无法找到任何与此主题相关的帖子。最初,这个约束的表达式依赖于变量值,我知道这是不可能的。相反,我改变了表达式,找到每个组合并乘以变量,如果其中任何/全部为零,这些变量将被取消。基本上就是我想做的,对于每一个外观,我都想验证上衣、鞋底和鞋子的色调是否符合公式。这可能吗?有更好的方法吗?我不明白为什么这个表达式是无度表达式,而我期望有三个(这三个变量是彼此的倍数)。有人能解释为什么会这样吗

我使用命令$pythontoy\u abstract.pytoy\u data.dat运行代码

提前感谢您的帮助! 克里斯汀

下面只是与问题相关的代码片段,但可以提供其他代码

model = AbstractModel()  

model.tops = Set()  
model.bottoms = Set()  
model.shoes = Set()  
model.looks = Set()  

model.theta = Param(within=NonNegativeIntegers)  
model.tol = Param(within=NonNegativeIntegers)  
model.hue_tops = Param(model.tops, within=UnitInterval)  
model.hue_bottoms = Param(model.bottoms, within=UnitInterval)  
model.hue_shoes = Param(model.shoes, within=UnitInterval)  

model.top_cnt = Var(model.looks * model.tops, domain=Binary)  
model.bottom_cnt = Var(model.looks * model.bottoms, domain=Binary)  
model.shoe_cnt = Var(model.looks * model.shoes, domain=Binary)  


def split_comp_color(model, look):  
    theta = model.theta  # 30  
    tol = model.tol  # 10  
    return sum([model.top_cnt[look, top] * model.bottom_cnt[look, bottom] * model.shoe_cnt[look, shoe] * int(((p[0]-p[1])-math.floor(p[0]-p[1]) > ((180-theta/2)-tol/2)/360) & ((p[0]-p[1])-math.floor(p[0]-p[1]) < ((180-theta/2)+tol/2)/360) & ((p[0]-p[2])-math.floor(p[0]-p[2]) > ((180+theta/2)-tol/2)/360) & ((p[0]-p[2])-math.floor(p[0]-p[2]) < ((180+theta/2)+tol/2)/360)) for top in model.tops for bottom in model.bottoms for shoe in model.shoes for p in permutations(np.array([model.hue_tops[top], model.hue_bottoms[bottom], model.hue_shoes[shoe]]), 3)]) >= 0.1  


model.split_comp_color = Constraint(model.looks, rule=split_comp_color)
model=AbstractModel()
model.tops=Set()
model.bottoms=Set()
model.shoes=Set()
model.looks=Set()
model.theta=Param(内=非负整数)
model.tol=Param(内=非负整数)
model.hue_tops=Param(model.tops,in=UnitInterval)
model.hue_bottoms=参数(model.bottoms,in=UnitInterval)
model.hue_shoes=Param(model.shoes,in=UnitInterval)
model.top_cnt=Var(model.looks*model.top,domain=Binary)
model.bottom_cnt=Var(model.looks*model.bottoms,domain=Binary)
model.shoe_cnt=Var(model.looks*model.shoes,domain=Binary)
def拆分组件颜色(型号、外观):
θ=模型θ#30
tol=model.tol#10
返回金额([模型.顶部.顶部.顶部.顶部.cnt[看,看,顶部,看,顶部][模型.底部.底部.看,底部]*模型.鞋.鞋.鞋.看,鞋.cnt[看,鞋子.看,鞋子.鞋.鞋.鞋.鞋.看,鞋.看,鞋.鞋.鞋.cnt[1]鞋.鞋.鞋.看,鞋.看,鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.鞋.内((((((((((((((p(p[0[0[0[0[0[0[p[p[p[p[0 p[2])<((180+theta/2)+tol/2)/360)模型中的顶部。模型中的底部。模型中的底部。排列中的p的鞋子(np.数组([model.hue_-tops[top],model.hue_-bottoms[bottom],model.hue_-shoes[shoe]],3)]>=0.1
model.split\u comp\u color=约束(model.looks,rule=split\u comp\u color)
实际结果:

pyomo.solvers.plugins.solvers.cplex_direct.DegreeError:CPLEXDirect不支持degree None的表达式。
expr:top_-cnt[look15115232-100]*bottom_-cnt[look15108339-001]*shoe_-cnt[look15181676-001]+top_-cnt[look15115232-100]*bottom_-cnt[look15108339-001]+…

否。Cplex只能建立线性和(某些)二次模型

但是,对于x、y和z都是二进制变量的表达式,形式为
x[i,p]*y[i,q]*z[i,r]
。我们可以使用一个众所周知的重新公式将
xyz[i,p,q,r]=x[i,p]*y[i,q]*z[i,r]
线性化:

xyz[i,p,q,r] <= x[i,p]
xyz[i,p,q,r] <= y[i,q]
xyz[i,p,q,r] <= z[i,r]
xyz[i,p,q,r] >= x[i,p]+y[i,q]+z[i,r]-2
xyz[i,p,q,r] in {0,1}

xyz[i,p,q,r]我不是pyomo专家,但CPLEX无法处理3级表达式(请参阅)。我猜pyomo中有一个小错误,他们忘记填写适当的值(3)在错误消息中,
None
是默认值。谢谢@rkersh,你知道还有其他可以处理三次方程的免费解算器吗?你可以在上看看非线性解算器。那里可能有一个你感兴趣的解算器。如果你需要保证数学全局最优性,你应该看看
couenne
。否则,
ipopt
通常是一个不错的选择。我已将约束重构为较低阶,但现在错误为“ValueError:未初始化的NumericValue对象top\u cnt[Look15116088-020]没有值”。是否可以使用约束中的变量同时考虑3个变量来求解?