Почему scipy.optimize.mminimize не использует предоставленные начальные догадки - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть приложение, написанное на python для расчета минимального возвращаемого значения из функции. Я использую scipy.optimize.mminimize с SLSQP в качестве метода оптимизации. Он работает в al oop и для экономии времени и удаления его от простого нахождения локальных минимумов мне нужно использовать x0, который я предоставляю. Кажется, проблема в том, что мне все равно, что я даю. Он просто начинает оптимизацию при случайных значениях. Что я делаю не так?

Я написал небольшое тестовое приложение для проверки x0 на минимизаторе:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
global log
log = []
counter = 0
def callback(x):
    global counter
    counter += 1
    log.append(x)
    print('u_guessx',x)
    return True


def objectivefunction(x, *arg):
    SUM = 2*x[0]**3 + 3*(3-x[0])**2 - 5*x[2]**1 + 50
    return SUM




# Defining Initial Conditions
u_guess = np.array([0 for u in range(3)])
#u_guess = np.zeros(4)
print("u shape: ",u_guess.shape)
print("u_init: ",u_guess)

#Simulation loop:
bounds_u = [(0,20) for i in u_guess]


# Run Optimizer
solution_guess = minimize(objectivefunction,
                          u_guess,
                          method = 'SLSQP',
                          callback = callback,
                          bounds=bounds_u,
                          options={'ftol': 1e-9, 'disp': True},
                          )
u_guess = solution_guess.x
u_opt = u_guess.item(0)



print("type(solution_guess.x): ",type(solution_guess.x))
print("u_opt: ",u_opt)
print("solution_guess.x: ",solution_guess.x)
#print("log: ",log)
print("counter: ",counter )

1 Ответ

0 голосов
/ 21 февраля 2020

Прежде всего, не так ли ваша целевая функция () не так? Я подозреваю, что это должно быть

def objectivefunction(x, *arg):
  SUM = 2*x[0]**3 + 3*(3-x[1])**2 - 5*x[2]**1 + 50
  return SUM

В исходной функции x [1] не используется, и поэтому алгоритм нечувствителен к x [1].

Во-вторых, обратный вызов функции ( ) вызывается после каждой итерации. Поэтому первый вывод - это не начальное условие, а первое предположение для минимумов на основе ваших начальных условий. Если я запускаю исправленную программу и меняю начальные условия, она выдает разные догадки. Но для разных прогонов с одними и теми же начальными условиями он всегда выдает одни и те же догадки. Случайности нет (при условии, что я использую исправленную версию targetfunction).

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