Чтобы ознакомиться с методами глобальной оптимизации и, в частности, с оптимизатором shgo
из scipy.optimize v1.3.0
, я попытался минимизировать дисперсию var(x)
вектора x = [x1,...,xN]
с помощью 0 <= xi <= 1
при условии, что x
имеет заданное среднее значение:
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)
Метод 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.])
Правильным решением будет равномерное распределение 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)
Метод minimize
дает правильный результат для произвольных начальных векторов:
>>> res2.success
True
>>> res2.x
array([0.5, 0.5, 0.5, 0.5, 0.5, 0.5])
Мой вопрос: почему shgo
не справляется с этой относительно простой задачей? Я сделал ошибку или shgo
просто не подходит для этой проблемы? Любая помощь будет принята с благодарностью.