TMu*_*r83 5 optimization scipy shgo
为了熟悉全局优化方法,特别是shgo优化器,scipy.optimize v1.3.0我尝试在具有给定平均值的约束下最小化向量的方差var(x):x = [x1,...,xN]0 <= xi <= 1x
import numpy as np
from scipy.optimize import shgo
# Constraint
avg = 0.5 # Given average value of x
cons = {'type': 'eq', 'fun': lambda x: np.mean(x)-avg}
# Minimize the variance of x under the given constraint
res = shgo(lambda x: np.var(x), bounds=6*[(0, 1)], constraints=cons)
Run Code Online (Sandbox Code Playgroud)
该shgo方法在这个问题上失败了:
>>> res
fun: 0.0
message: 'Failed to find a feasible minimiser point. Lowest sampling point = 0.0'
nfev: 65
nit: 2
nlfev: 0
nlhev: 0
nljev: 0
success: False
x: array([0., 0., 0., 0., 0., 0.])
Run Code Online (Sandbox Code Playgroud)
正确的解决方案是均匀分布x = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5],可以通过使用局部优化器轻松minimize找到scipy.optimize:
from scipy.optimize import minimize
from numpy.random import random
x0 = random(6) # Random start vector
res2 = minimize(lambda x: np.var(x), x0, bounds=6*[(0, 1)], constraints=cons)
Run Code Online (Sandbox Code Playgroud)
该minimize方法对任意起始向量产生正确的结果:
>>> res2.success
True
>>> res2.x
array([0.5, 0.5, 0.5, 0.5, 0.5, 0.5])
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么shgo这个相对简单的任务失败了?我是否犯了一个错误或者shgo根本无法解决这个问题?任何帮助将不胜感激。