使用Mystic简化200变量约束表达式耗时过长的解决办法
使用mystic处理多变量求和约束的性能优化
问题背景
需要用mystic工具生成约束条件,限制200个变量的和在0到20000之间(0 ≤ x0 + x1 + ... + x199 ≤ 20000),但原代码仅处理该约束就耗时约1小时,原代码如下:
import mystic as ms import mystic.constraints as my 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_)
性能瓶颈原因
原代码通过字符串拼接生成超长的符号表达式,再调用ms.simplify进行符号解析与简化。对于200个变量的表达式,符号引擎需要处理大量语法解析、变量绑定和逻辑化简操作,产生极高的计算开销,导致耗时剧增。
优化方案
直接通过数值约束函数定义规则,跳过符号表达式的解析与简化流程。mystic支持直接传入接收变量数组的数值函数,无需走符号处理路径,性能会得到数量级的提升:
import mystic as ms import mystic.constraints as my min_lim = 0 max_lim = 20000 # 直接定义数值约束函数:输入变量数组,返回求和是否在指定范围内 def sum_constraint(x): total = sum(x) return min_lim <= total <= max_lim # 直接生成约束,无需符号处理步骤 constrain = ms.generate_constraint(sum_constraint)
优化说明
- 避免了符号表达式的生成、解析与简化过程,直接用Python原生的
sum计算变量和,时间复杂度为O(n),200个变量的计算几乎瞬间完成。 ms.generate_constraint可以直接接收返回布尔值的约束函数,无需通过generate_solvers转换符号表达式,大幅减少不必要的计算。
内容的提问来源于stack exchange,提问作者star_it8293
相关产品推荐
相关产品推荐

