Scipy сворачивает, не принимает во внимание ограничения - PullRequest
1 голос
/ 03 июля 2019

Я новичок в программировании и пытался решить задачу математической оптимизации с помощью Python.

Идея проблемы состоит в том, чтобы минимизировать значение функции при соблюдении некоторых ограничений.Это может показаться очень простым, однако по какой-то причине результат, который я получаю, явно не удовлетворяет ограничениям.

Рассматриваемая функция заключается в следующем (у меня недостаточно репутационных баллов для публикации изображений уравнений LaTeX):

f (a, b, c, d) = 2 * a + 3 * b + c + 2 * d

Со следующими ограничениями:

  • a + b = 2
  • c + d = 8
  • a + c = 3
  • b + d = 7

Я использовал scipy.optimize.minimize в Python, чтобы попытаться решить его, вот мой код:

import numpy as np
import scipy
from scipy.optimize import minimize as min

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

cons = ({'type' : 'eq','fun': lambda x: np.array([x[0]+x[1]-2])},
{'type' : 'eq','fun': lambda x: np.array([x[2]+x[3]-8])}, 
{'type':'eq' , 'fun': lambda x: np.array([x[0]+x[2]-3])}, 
{'type':'eq' , 'fun': lambda x: np.array([x[1]+x[3]-7])},
{'type':'ineq' , 'fun': lambda x: np.array([x[0]])},
{'type':'ineq' , 'fun': lambda x: np.array([x[1]])},
{'type':'ineq' , 'fun': lambda x: np.array([x[2]])},
{'type':'ineq' , 'fun': lambda x: np.array([x[3]])},
{'type':'ineq' , 'fun':f})

u = min(f,[1.5,0.5,1.5,6.5],constraints=cons,method='Nelder-Mead',options={'Disp':True,'maxiter':2})

print(u)
print(f(u.x))

Он дает мне некоторые значения для a, b, c, d, которые не удовлетворяют равенствам.Я пытался изменить метод оптимизации, но это не помогло.

Любой совет будет очень признателен, спасибо за чтение!

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Ваша целевая функция линейна, а ограничения равенства линейны, поэтому задачу достаточно просто решить вручную.Если вы сделаете это, вы увидите пару интересных фактов:

  • Одно из ваших ограничений является избыточным.Например, вы можете отбросить a + c = 3, потому что это уравнение подразумевается другими тремя.

  • У вас осталось три линейных уравнения и четыре неизвестных.Решением такой системы является прямая линия в четырехмерном пространстве.Интересно, что в этой строке ваша целевая функция постоянная .Он имеет значение 19 в каждой точке линии.Таким образом (с учетом ограничений неравенства) каждая точка на линии с неотрицательными координатами является решением.В частности, ваша начальная точка [1.5,0.5,1.5,6.5] находится на линии, так что это решение.То же самое можно сказать о [1.9, 0.1, 1.1, 6.9], [1.65, 0.35, 1.35, 6.65] или фактически о любой точке вида [0, 2, 3, 5] + a*[1, -1, -1, 1], для которой компоненты не являются отрицательными.

0 голосов
/ 03 июля 2019

Привет из документации кажется, что единственным методом, доступным для минимизации ограничения, являются COBYLA и SLSQP, и, в частности, при использовании ограничения 'eq' , только SLSQP , Это может работать:

u = min(f,[1.5,0.5,1.5,6.5],constraints=cons,method='SLSQP')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...