ошибка pyomo: CPLEXDirect не поддерживает выражения степени None - PullRequest
0 голосов
/ 16 января 2019

Я работаю над POC, чтобы посмотреть, будет ли pyomo работать для моего приложения, и я мог бы использовать некоторую помощь, чтобы определить, есть ли исправление для ошибки, описанной ниже, или если мое намерение невозможно.

После добавления ограничения «split_comp_color» я получаю сообщение об ошибке: «CPLEXDirect не поддерживает выражения степени None». Мне не удалось найти каких-либо соответствующих сообщений на эту тему. Первоначально выражение для этого ограничения зависело от значений переменных, которые я узнал, невозможно. Вместо этого я изменил выражение, чтобы найти каждую комбинацию и умножить на переменные, которые отменят, если какие-либо / все будут нули. В основном то, что я пытаюсь сделать, для каждого взгляда я хочу убедиться, что оттенки верха, низа и туфли соответствуют неравенству формулы. Это возможно? Есть лучший способ сделать это? Я не понимаю, почему выражение имеет степень None, где я ожидал бы три (три переменные кратны друг другу). Кто-нибудь может объяснить, почему это так?

Я запускаю код с помощью команды $ python toy_abstract.py toy_data.dat

Спасибо за любую помощь заранее! Christine

Ниже приведены только фрагменты, относящиеся к вопросу, но можно указать дополнительный код.

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] + ...

1 Ответ

0 голосов
/ 19 января 2019

Нет.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}
...