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(约束满足容忍度)值较宽松,同时初始采样点可能集中在边界区域,算法未严格校验约束的可行性,导致即使约束不满足也判定为成功。
正确使用约束函数的方法
等式约束的正确写法:
等式约束的函数必须返回0表示满足约束,返回非0值表示偏差。例如,要约束变量和为3,应写为:lambda x: x.sum() - 3 # 当x.sum()=3时返回0,满足约束严格约束校验:
通过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)手动验证约束:
无论算法返回是否成功,都可以手动检查结果是否满足约束:constraint_fun = lambda x: x.sum() - 3 print("约束偏差值:", constraint_fun(result.x)) # 若值接近0(在constraint_tol范围内),说明约束满足
内容的提问来源于stack exchange,提问作者Christopher
相关产品推荐
相关产品推荐

