shgo最小化失败原因探究:线性约束下无可行解问题
问题
尝试在scipy.optimize.shgo中应用线性约束时,程序无法找到可行解。以下是最简复现代码:
from scipy.optimize import shgo, rosen # 定义线性不等式约束:x[i+1] ≥ x[i] + 0.1 constraints = [{'type': 'ineq', 'fun': lambda x, i=i: x[i+1] - x[i] - 0.1} for i in range(2)] # 变量边界 bounds = [(0, 20)]*3 # 调用shgo(默认采样方法) result = shgo(rosen, bounds, constraints=constraints) print("Optimal solution:", result.x) print("Optimal value:", result.fun)
已知存在满足约束的解(例如rosen((0.1, 0.21, 0.32))返回13.046181),但运行上述代码后输出:
Optimal solution: None Optimal value: None
解决方法
修改shgo的sampling_method参数为'halton'或'sobol'即可正常运行:
result = shgo(rosen, bounds, sampling_method='halton', constraints=constraints)
运行结果:
Optimal solution: [1.08960341 1.18960341 1.41515624] Optimal value: 0.04453888080946618
原因说明
默认的'simplicial'采样方法通过单纯形网格生成初始样本点,这种采样方式在处理线性不等式约束划定的狭窄可行域时(本例中可行域要求x[1] ≥ x[0]+0.1、x[2] ≥ x[1]+0.1,是原边界空间的一个小角落),很难生成落在可行域内的初始点,导致后续无法找到可行解。
而'halton'和'sobol'属于低差异序列采样,能更均匀地覆盖整个搜索空间,更容易命中约束定义的可行区域,因此可以顺利完成优化。
内容的提问来源于stack exchange,提问作者Simd
相关产品推荐
相关产品推荐

