使用mystic求解约束优化问题时约束失效及函数值异常
解决mystic差分进化不遵守等式约束的问题
问题根源
mystic默认生成的约束是软约束,差分进化算法在迭代时可能优先优化目标函数,导致约束被忽略;同时默认的进化参数(种群规模、迭代次数等)不足以让算法收敛到可行域内。
解决方案
需要从两个核心方面调整代码:
- 使用
StrictConstraint强制约束生效,确保每次迭代前修正解到可行域; - 调整差分进化的参数,提升算法收敛到可行解的能力。
修正后的完整代码
# %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
相关产品推荐
相关产品推荐

