scipy.optimize.minimize с ограничениями не работает должным образом - PullRequest
0 голосов
/ 04 августа 2020

Я хотел бы найти оптимальное решение проблемы, описанной на прилагаемом рисунке https://i.stack.imgur.com/W6fhf.jpg

Мой код

from scipy.optimize import minimize

def create_constraints(t, tau, ub):
constraints = [{
    'type': 'ineq',
    'fun': lambda x: x[0] * (-1),
}]

con1 = {
    'type': 'ineq',
    'fun': lambda x: x[0] - x[1] + tau[0],
}

constraints.append(con1)

con2 = {
    'type': 'ineq',
    'fun': lambda x: x[1] - ub + tau[1],
}

constraints.append(con2)

return constraints


def f(x):
    return (x[0] + x[1]) * (-1)


t0 = np.array([1, 10])
tau0 = [5, 5]
cons = create_constraints(t0, tau0, 30)
res = minimize(f, t0, constraints=cons, method='trust-constr')

с указанными выше параметрами для ограничения Я ожидаю, что оптимальное решение будет близко к [20, 25]. Однако результат оптимизации x: array([ 6.66666669, 18.33333334]). Что я делаю не так? почему минимизатор не работает должным образом?

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 04 августа 2020

Я обнаружил, что если я создаю ограничения таким образом

def create_constraints_2(t, tau, ub):
    constr_f = lambda x: np.array([
        x[0] * (-1),
        x[0] - x[1] + tau[0],
        x[1] - ub + tau[1],
    ])
    
    return NonlinearConstraint(constr_f, -np.inf, 0)

И затем вызываю функции

cons_2 = create_constraints_2(t0, tau0, 30)
minimize(f, t0, constraints=cons_2, method='trust-constr')

Тогда все работает нормально. Результат: x: array([19.99974476, 24.99993157])

...