Является ли выражение равенства пиомо коммутативным?
Вот ограничение, определенное функцией:
def my_constraint(model, j):
a = sum(model.variable_1[i, j] for i in model.i) + sum(model.variable_2[o, j] for o in model.o if o != j)
b = model.variable_3[j]
# Apparently, the order matters !?
return a == b
# return b == a
model.my_constraint = pe.Constraint(model.j, rule=my_constraint)
Я предполагал, что порядок условий равенства не будет иметь значения, но если я их поменяю, я получу разные результаты.
Я не знаю, как добраться до сути этого.
Сгенерированные файлы.nl немного отличаются, но я в тупике, так как не знаю, как их интерпретировать.
Изучение файлов.nl
Два набора линий имеют разницу в знаках.
Файл 1:
[...]
24 1
32 -1
35 1
J78 3
25 1
33 -1
34 1
[...]
Файл 2:
[...]
24 -1
32 1
35 -1
J78 3
25 -1
33 1
34 -1
[...]
При подаче обоих файлов в ipopt я получаю "неосуществимое" с файлом 1 и решением с файлом 2. Если я редактирую файл 1, чтобы изменить знаки в первом или втором трехстрочном наборе, я получаю сходимость с теми же результатами как файл 2.
Таким образом, порядок в равенстве выражения не должен иметь значения, но при его изменении я получаю в файле.nl разницу знаков, которая имеет значение.
Простой пример, демонстрирующий, как порядок терминов влияет на файл.nl
from pyomo.environ import ConcreteModel, Set, Var, Constraint, Objective
from pyomo.opt import SolverFactory
model = ConcreteModel()
model.i = Set(initialize=['I1'])
model.j = Set(initialize=['J1'])
model.v1 = Var(model.i, model.j)
model.v2 = Var(model.i, model.j)
model.v3 = Var(initialize=0, bounds=(0, None))
def c1(model, i, j):
#return model.v2[i, j] == model.v1[i, j]
return model.v1[i, j] == model.v2[i, j]
model.c1 = Constraint(model.i, model.j, rule=c1)
def objective_rule(model):
return model.v3
model.objective = Objective(rule=objective_rule)
opt = SolverFactory('ipopt')
opt.solve(model, keepfiles=True)
В зависимости от порядка членов в ограничении c1, я не получаю тот же файл.nl.
В частности, оба файла идентичны, за исключением двух строк:
g3 1 1 0 # problem unknown
3 1 1 0 1 # vars, constraints, objectives, ranges, eqns
0 0 0 0 0 0 # nonlinear constrs, objs; ccons: lin, nonlin, nd, nzlb
0 0 # network constraints: nonlinear, linear
0 0 0 # nonlinear vars in constraints, objectives, both
0 0 0 1 # linear network variables; functions; arith, flags
0 0 0 0 0 # discrete variables: binary, integer, nonlinear (b,c,o)
2 1 # nonzeros in Jacobian, obj. gradient
0 0 # max name lengths: constraints, variables
0 0 0 0 0 # common exprs: b,c,o,c1,o1
C0
n0
O0 0
n0
x1
2 0
r
4 0.0
b
3
3
2 0
k2
1
2
J0 2
0 -1 # The other file reads 0 1
1 1 # 1 -1
G0 1
2 1
Решая, я получаю те же результаты. Вероятно, потому что пример - мусор.
1 ответ
Теоретическое объяснение состоит в том, что вы видите альтернативные оптимальные решения. Вполне возможно, в зависимости от формулировки проблемы, что у вас есть более одного решения, которое имеет оптимальное объективное значение. В каком порядке вы их получите, будет зависеть от порядка ограничений. Если вы используете решатель LP, вы должны иметь возможность попросить его предоставить вам все оптимальные решения.