我正在研究POC,以了解pyomo是否适用于我的应用程序,我可以使用一些帮助来确定下面的错误是否可以解决,如果我的意图无法实现。
添加约束“ split_comp_color”后,出现错误:“ CPLEXDirect不支持度数为None的表达式。”我找不到与此主题相关的任何帖子。最初,此约束的表达式取决于我无法学习的变量值。相反,我更改了表达式以查找每个组合,然后乘以变量,如果任意/全部为零,则这些变量将取消。基本上,我要尝试做的是,对于每个外观,我都想验证顶部,底部和鞋子的色调是否满足公式不平等性。这可能吗?有一个更好的方法吗?我不明白为什么表达式是度数None,在这里我期望三个(三个变量彼此是多个)。谁能解释为什么会这样?
我正在使用命令$ python toy_abstract.py toy_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)
实际结果:
pyomo.solvers.plugins.solvers.cplex_direct.DegreeError:CPLEXDirect不支持度数为None的表达式。 expr:top_cnt [Look1,5115232-100] * bottom_cnt [Look1,5108339-001] * shoe_cnt [Look1,5181676-001] + top_cnt [Look1,5115232-100] * bottom_cnt [Look1,5108339-001] * shoe_cnt [Look1 ,5120179-001] + ...
答案 0 :(得分:1)
不。 Cplex只能执行线性和(某些)二次模型。
但是,您具有x[i,p]*y[i,q]*z[i,r]
形式的表达式,其中x,y和z均为二进制变量。我们可以使用众所周知的重新格式化线性化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}