Почему при использовании Mysti c в Python для оптимизации нелинейно-ограниченной оптимизации я получаю ошибку «не может просто неравенства»? - PullRequest
0 голосов
/ 20 апреля 2020

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

def objective(x):
    x0,x1,x2,x3,x4,x5,x6,x7,x8 = x
    return x0**2 + x4**2 + x8**2
equations = '''
x0 + x1 + x2 - x3 - x6 - 20 == 0.0
x4 + x3 + x5 - x1 - x7 - 150 == 0.0
x8 + x6 + x7 - x2 - x5 + 100 == 0.0
x6 == 0
x7 == 0
x0 >= 10
x4 >= 60
'''
from mystic.symbolic import generate_conditions, generate_penalty
pf = generate_penalty(generate_conditions(equations), k=1e4)
from mystic.symbolic import generate_constraint, generate_solvers, solve
cf = generate_constraint(generate_solvers(solve(equations))

При вычислении cf я получаю NotImplementedError: не могу упростить неравенства и хотел бы знать почему это может быть? Если кто-нибудь знает, как я могу расширить это так, чтобы я мог создавать ограничения с помощью функции или другим способом, я также хотел бы знать. Приветствия

1 Ответ

0 голосов
/ 21 апреля 2020

Я мисти c автор. Вы всегда должны сначала попытаться использовать solve(equations) и посмотреть, что произойдет. Это может не дать символического решения уравнений из-за неравенства. Если так, то попробуйте вместо этого сделать simplify(equalities). Это символически упрощает уравнения, поэтому в каждой строке есть только одна переменная в LHS. Решатель неравенства обычно может работать в этом случае. Если это не поможет, вы можете переписать уравнения, чтобы на LHS была только одна переменная.

>>> def objective(x):
...     x0,x1,x2,x3,x4,x5,x6,x7,x8 = x
...     return x0**2 + x4**2 + x8**2
... 
>>> import mystic
>>> equations = '''
... x0 + x1 + x2 - x3 - x6 - 20 == 0.0
... x4 + x3 + x5 - x1 - x7 - 150 == 0.0
... x8 + x6 + x7 - x2 - x5 + 100 == 0.0
... x6 == 0
... x7 == 0
... x0 >= 10
... x4 >= 60
... '''
>>> eqns = mystic.symbolic.simplify(equations)
>>> print(eqns)
x0 == -x1 - x2 + x3 + x6 + 20
x8 == x2 + x5 - x6 - x7 - 100
x4 >= 60
x7 == 0
x6 == 0
x0 >= 10
x4 == x1 - x3 - x5 + x7 + 150
>>> from mystic.symbolic import generate_constraint, generate_solvers 
>>> cf = generate_constraint(generate_solvers(eqns))
>>> cf([0,1,2,3,4,5,6,7,8])
[26, 1, 2, 3, 143, 5, 0, 0, -106]
>>> 
...