scipy 的 shgo 优化器无法最小化方差

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根本无法解决这个问题?任何帮助将不胜感激。