【问题标题】:Scipy / Mystic taking too long to simplify expressionScipy / Mystic 花费太长时间来简化表达式
【发布时间】:2023-02-23 00:32:39
【问题描述】:

我正在尝试使用 mystic 来创建我的约束的简化表达式。我有一个包含 200 个元素的数组。我首先测试 1 个约束,它限制了最小和最大限制之间的所有变量的总和,如下所示:

0 <= x0 + x1 + x2 + ....... x198 + x199 <= 20000

问题是这个过程花费的时间太长,无法仅针对这 1 个约束进行简化 - 大约 1 小时(甚至还没有添加其他约束)。我该如何解决这个问题?

min_lim = 0
max_lim = 20000

def constraint_func():
    variable_num = ['x'+str(i) for i in range(200)]
    constrain_eq = f'{min_lim} <=' + ' + '.join(variable_num) + f' <= {max_lim}'
    return constrain_eq

eqn = ms.simplify(constraint_func(), all=True)
constrain = ms.generate_constraint(ms.generate_solvers(eqn), join=my.constraints.and_)

【问题讨论】:

  • 我不认为 mystic 可以在单个表达式中处理多个方程式/不等式——您需要在单独的行中添加每个边界。

标签: python scipy scipy-optimize mystic


【解决方案1】:

Mystic 无法在同一个等式中同时处理 &lt;=。本质上,它挂在电话上。如果您按如下方式修改代码,简化操作只需一秒钟左右(在我古老的 MacOS 上)。

import mystic.symbolic as ms
min_lim = 0
max_lim = 20000

def constraint_func():
    variable_num = ['x'+str(i) for i in range(200)]
    constraint_1 = f'{min_lim} <= ' + ' + '.join(variable_num)
    constraint_2 = f'{max_lim} >= ' + ' + '.join(variable_num)
    return '
'.join([constraint_1, constraint_2])

eqn = ms.simplify(constraint_func(), all=True)

顺便说一句,还有一个微妙的潜在问题。这两个约束都将通过在左侧隔离的 x0 进行简化。您可以交替隔离两个不同的目标变量(分别为x0 和x1),然后合并简化的方程式,如下所示:

>>> import mystic.symbolic as ms
>>> min_lim = 0
>>> max_lim = 20000
>>> variable_num = ['x'+str(i) for i in range(200)]
>>> constraint_1 = f'{min_lim} <= ' + ' + '.join(variable_num)
>>> constraint_2 = f'{max_lim} >= ' + ' + '.join(variable_num)
>>> eqn1 = ms.simplify(constraint_1, all=True, target='x0')
>>> eqn2 = ms.simplify(constraint_2, all=True, target='x1')
>>> eqn = '
'.join([eqn1,eqn2])

我不能说以上两种简化中哪一种更适合你,它通常取决于问题。

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 2019-10-27
    • 2016-05-15
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多