Максимизация значения уравнения с учетом ограничения в Python - PullRequest
0 голосов
/ 19 ноября 2018

Есть четыре переменные (S1, S2, S3, S4) с ограничением (S1+S2+S3+S4=100). Есть четыре заданные константы (C1, C2, C3, C4). Я хочу максимизировать значение (S1/C1 + S2/C2 + S3/C3 + S4/C4). Вот мой код на python:

#!/usr/bin/env python3

import numpy as np
from scipy.optimize import minimize

S0 = [25, 25, 25, 25]
C = [89415,8991,10944,15164]

def objective(S, C):
    total = 0
    for index in range(4):
        total = total + S[index]/C[index]        
    return -total

def constraint(S):
    return (100 - S[0] - S[1] - S[2] - S[3])

b = (0.0, 100.0)
boundaries = (b,b,b,b)
con = ({'type':'eq', 'fun':constraint})

solution = minimize(objective,S0,args=(C),method='SLSQP',bounds=boundaries,constraints=con)

print (solution)

Мой код просто возвращает начальное предположение для S как конечный результат

fun: -0.0069931517268763755 jac: array([-1.11838453e-05, -1.11222384e-04, -9.13742697e-05, -6.59456709e-05]) message: 'Optimization terminated successfully.' nfev: 6 nit: 1 njev: 1 status: 0 success: True x: array([25., 25., 25., 25.])

Куда я иду не так?

1 Ответ

0 голосов
/ 22 ноября 2018

Похоже, что различия в выходных значениях ваших функций находятся в пределах допуска по умолчанию для оптимизатора, чтобы прекратить оптимизацию вашей функции между итерациями.Помогает установка для вашего допуска меньшего значения, например 1e-12:

solution = minimize(objective,S0,args=(C),method='SLSQP',bounds=boundaries,constraints=con, tol=1e-12)

Результат:

   fun: -0.01112223334445557
     jac: array([ -1.11837871e-05,  -1.11222267e-04,  -9.13742697e-05,
        -6.59456709e-05])
 message: 'Optimization terminated successfully.'
    nfev: 192
     nit: 32
    njev: 32
  status: 0
 success: True
       x: array([  0.00000000e+00,   1.00000000e+02,   3.01980663e-14,
         0.00000000e+00])

, что примерно равно абсолютному максимальному решению [0,100,0,0].

...