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

scipy.optimize.shgo等式约束未生效的技术咨询

scipy.optimize.shgo 约束函数的正确使用方法

当你设置的等式约束函数始终返回1.0(等式约束要求返回值为0)时,shgo却返回成功终止的结果,这是因为默认配置下算法对约束的校验不够严格,且初始采样阶段未触发不可行判定。

你的代码示例:

from scipy.optimize import shgo
shgo(func=lambda x: -x.sum(), bounds=[(0, 1)]*5, constraints=({'type':'eq','fun': lambda x: 1.0}))

返回结果:

fun: -5.0
funl: array([-5.])

message: 'Optimization terminated successfully.'
nfev: 39
nit: 2
nlfev: 6
nlhev: 0
nljev: 1
success: True
x: array([1., 1., 1., 1., 1.]])
xl: array([[1., 1., 1., 1., 1.]])

问题原因

shgo默认的constraint_tol(约束满足容忍度)值较宽松,同时初始采样点可能集中在边界区域,算法未严格校验约束的可行性,导致即使约束不满足也判定为成功。

正确使用约束函数的方法

  1. 等式约束的正确写法:
    等式约束的函数必须返回0表示满足约束,返回非0值表示偏差。例如,要约束变量和为3,应写为:

    lambda x: x.sum() - 3  # 当x.sum()=3时返回0,满足约束
    
  2. 严格约束校验:
    通过constraint_tol参数缩小约束允许的误差,确保算法仅接受满足约束的解:

    result = shgo(func=lambda x: -x.sum(),
                 bounds=[(0, 1)]*5,
                 constraints=({'type':'eq','fun': lambda x: x.sum() - 3}),
                 constraint_tol=1e-6)
    
  3. 手动验证约束:
    无论算法返回是否成功,都可以手动检查结果是否满足约束:

    constraint_fun = lambda x: x.sum() - 3
    print("约束偏差值:", constraint_fun(result.x))
    # 若值接近0(在constraint_tol范围内),说明约束满足
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:24:31