Ошибка pyomo: CPLEXDirect не поддерживает выражения степени None

Я работаю над 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. выражение: 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] + ...


person Christine Buckler    schedule 16.01.2019    source источник
comment
Я не специалист по пиомо, но CPLEX не может обрабатывать выражения степени 3 (см. здесь). Я предполагаю, что в pyomo есть небольшая ошибка, когда они забывают указать соответствующее значение (3) в сообщении об ошибке, а значение по умолчанию - None.   -  person rkersh    schedule 16.01.2019
comment
спасибо @rkersh, знаете ли вы о каких-либо других бесплатных решателях, которые могут обрабатывать уравнения 3-й степени?   -  person Christine Buckler    schedule 16.01.2019
comment
Вы можете взглянуть на нелинейные решатели в NEOS. Там есть FAQ по НЛП, который может вас заинтересовать.   -  person rkersh    schedule 16.01.2019
comment
Если вам нужна гарантированная математическая глобальная оптимальность, вам следует взглянуть на couenne. В противном случае ipopt - вообще хороший вариант.   -  person Qi Chen    schedule 17.01.2019
comment
Я изменил ограничение на более низкий порядок, но теперь возникает ошибка ValueError: нет значения для неинициализированного объекта NumericValue top_cnt [Look1,5116088-020]. Можно ли использовать переменные в ограничении для решения с учетом сразу 3 переменных?   -  person Christine Buckler    schedule 18.01.2019
comment
@QiChen Я видел, как вы прокомментировали это сообщение по теме: stackoverflow. com / questions / 46357217 / Можно ли это переписать для работы как дизъюнкции?   -  person Christine Buckler    schedule 18.01.2019
comment
Я немного не понимаю, в чем заключается ваша проблема сопоставления оттенков и что вы пытаетесь решить с ее помощью. Не могли бы вы рассказать поподробнее?   -  person Qi Chen    schedule 18.01.2019


Ответы (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}
person Erwin Kalvelagen    schedule 19.01.2019