You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用mystic求解约束优化问题时约束失效及函数值异常

解决mystic差分进化不遵守等式约束的问题

问题根源

mystic默认生成的约束是软约束,差分进化算法在迭代时可能优先优化目标函数,导致约束被忽略;同时默认的进化参数(种群规模、迭代次数等)不足以让算法收敛到可行域内。

解决方案

需要从两个核心方面调整代码:

  1. 使用StrictConstraint强制约束生效,确保每次迭代前修正解到可行域;
  2. 调整差分进化的参数,提升算法收敛到可行解的能力。

修正后的完整代码

# %pip install mystic
import mystic as my
import numpy as np

def objective(X):
    x0, x1, x2 = X
    return -x0*x1*x2  # 转为最小化问题,对应最大化原目标函数

bounds = [(0., 1e5)]*3

eqn = "x0 + x1 + x2 - 100 == 0.0"

# 生成严格约束:强制每次评估前将解修正到可行域
constraint = my.constraints.StrictConstraint(
    my.symbolic.generate_constraint(
        my.symbolic.generate_solvers(my.symbolic.simplify(eqn))
    )
)

mon = my.monitors.VerboseMonitor(10)

# 调整差分进化参数:增加种群规模、迭代次数,优化变异和重组概率
result = my.solvers.diffev2(
    objective, 
    x0=bounds, 
    bounds=bounds, 
    constraints=constraint, 
    disp=True, 
    full_output=True, 
    itermon=mon,
    popsize=20,  # 增大种群规模,提升搜索能力
    maxiter=1000,  # 增加迭代次数,确保收敛
    mutation=(0.5, 1),  # 调整变异范围
    recombination=0.7  # 调整重组概率
)

# 输出结果
print("最优解:", result[0])
print("最小化目标函数值:", result[1])
print("原目标函数最大值:", -result[1])

关键说明

  • StrictConstraint的作用:它会在每次评估目标函数前,自动将当前解修正为满足约束的可行解,彻底避免算法偏离可行域;
  • 目标函数调整:mystic默认是最小化器,因此最大化x0*x1*x2需要转为最小化-x0*x1*x2;
  • 进化参数调整:增大popsize可以提升搜索空间的覆盖范围,增加maxiter确保算法有足够时间收敛到最优解,调整mutation和recombination可以平衡搜索的探索与开发能力。

运行修正后的代码,会收敛到预期的最优解[33.33333333, 33.33333333, 33.33333333],对应的原目标函数最大值为(100/3)^3 ≈ 37037.037。

内容的提问来源于stack exchange,提问作者Ken Nod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:52:58