Является ли выражение равенства пиомо коммутативным? - PullRequest
0 голосов
/ 20 декабря 2018

Вот ограничение, определенное функцией:

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 Ответ

0 голосов
/ 21 декабря 2018

Теоретическим объяснением является то, что вы видите альтернативные оптимальные решения.Вполне возможно, в зависимости от формулировки проблемы, что у вас есть более одного решения, которое имеет оптимальное объективное значение.В каком порядке вы их получите, будет зависеть от порядка ограничений.Если вы используете решатель LP, вы должны иметь возможность попросить его предоставить вам все оптимальные решения.

...