为什么在Python中使用Mystic来优化非线性约束优化时,我会收到“无法简单地不等式”错误?

问题描述 投票:0回答:1

我正在尝试使用Mystic优化以下问题。我目前收到一个我不理解的错误,希望对图书馆更熟悉的人可以提供帮助。

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:can not notify不等式',想知道为什么会这样吗?如果有人知道我将如何扩展它,以便我可以通过函数或以其他方式创建约束,我也很想知道。干杯

python optimization nonlinear-optimization mystic
1个回答
0
投票

我是神秘作家。您应该始终首先尝试仅使用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]
>>> 
© www.soinside.com 2019 - 2024. All rights reserved.