Минимизация функции с помощью scipy.minimize - PullRequest
1 голос
/ 17 июня 2020

Я совершенно новичок в scipy.

Две переменные (x1 и x2) тестируются внутри pandas фрейма данных и дают результат p.

Я ищу, чтобы найти x1 и x2, так что p минимизировано.

Границы x1 и x2 одинаковы (-4,4)

Вот мой текущий код

def objective(x):

    x1 = x[0]
    x2 = x[1]
    df.loc[(df['H3'] <= x1) & (df['A3'] >= x2), 'BH'] = 'Y'
    df.loc[(df['H3'] > x1) | (df['A3'] < x2), 'BH'] = 'N'
    df.loc[(df['BH'] == 'Y') & (df['SPR'] == 'A'), 'PH'] = -1
    df.loc[(df['BH'] == 'Y') & (df['SPR'] == 'H'), 'PH'] = df['SPC'] - 1
    df.loc[df['BH'] == 'N','PH'] = 0
    df.loc[df['SPR'] == 'D','PH'] = 0

    p = df['PH'].sum()

    return p

x0 = [0,0]

b1 = (-4,4)
b2 = (-4,4)
bnds= (b1,b2)

sol = minimize (objective,x0,method='SLSQP',bounds=bnds)

Однако, это только кажется возвращает ответ для x1 = 0 и x2 = 0 и не пробует никаких других значений в пределах ...

Что мне здесь не хватает?

Спасибо

1 Ответ

0 голосов
/ 17 июня 2020

Если я правильно интерпретирую вашу целевую функцию, похоже, она ищет определенные символы c в массиве символов. Это делает вашу функцию недифференцируемой. Поэтому использование решателя на основе градиента, такого как SLSQP, не сработает, поскольку градиент везде будет нулевым. Попробуйте вместо этого использовать дифференциальную эволюцию или медовуху Нельдера. Это алгоритмы без градиента в scipy optimize. Кроме того, если x имеет дискретное значение и может быть только в пределах -4,4, тогда существует только 81 возможное значение, и это также можно легко решить с помощью грубой силы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...