Оптимизация данных - PullRequest
       11

Оптимизация данных

0 голосов
/ 25 апреля 2019

У меня есть некоторые предполагаемые входные данные (X0), которые я хочу оптимизировать в нескольких функциях, как описано ниже.

X0 = [A, B, C, D, E, F, G, H, I, J, K] # каждый элемент имеет значение с плавающей запятой

Функции:

F1 = A + B + C + D - 200 = 0

F2 = C + D + E - 50 = 0

F3 = C + D + E + F + G - 45 = 0

F4 = E + F + G + H + I + J + K - 67 = 0

F5 = H + I + J + K - 64 = 0

Я не уверен, как Сципи может оптимизировать входные данные в нескольких функциях. Я подготовил сценарий ниже; Я не уверен, отзывчив ли он.

from scipy.optimize import minimize    

x0 = np.array([1. for i in range(11)])    
def my_function(A, B, C, D, E, F, G, H, I, J, K):
    F1 = A + B + C + D - 200
    F2 = C + D + E - 50
    F3 = C + D + E + F + G - 45
    F4 = E + F + G + H + I + J + K - 67
    F5 = H + I + J + K - 64
    return F1 + F2 +F3 +F4 + F5

cons = ({'type': 'ineq', 'my_function': lambda A, B, C, D:  A + B + C + D - 200},
    {'type': 'ineq', 'my_function': lambda C, D, E: C + D + E - 50},
    {'type': 'ineq', 'my_function': lambda C, D, E, F, G: C + D + E + F + G - 45},
    {'type': 'ineq', 'my_function': lambda E, F, G, H, I, J, K: E + F + G + H + I + J + K - 67},
    {'type': 'ineq', 'my_function': lambda H, I, J, K: H + I + J + K - 64})

res = minimize(my_function, x0, method='BFGS', constraints=cons )

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Вы рядом. Используйте тип eq (равенство) вместо неравенства. Кроме того, ваши ограничения должны получать только один аргумент, который является массивом значений, и вы просто получаете доступ к их позициям.

Проверьте следующее:

from scipy.optimize import minimize    

x0 = np.random.random(size=[11])
def my_function(X):
    A, B, C, D, E, F, G, H, I, J, K = X
    F1 = A + B + C + D - 200
    F2 = C + D + E - 50
    F3 = C + D + E + F + G - 45
    F4 = E + F + G + H + I + J + K - 67
    F5 = H + I + J + K - 64
    return F1 + F2 +F3 +F4 + F5

cons = ({'type': 'eq', 'fun': lambda X: X[0] + X[1] + X[2] + X[3] - 200},
    {'type': 'eq', 'fun': lambda X: X[2] + X[3] + X[4] - 50},
    {'type': 'eq', 'fun': lambda X: X[2] + X[3] + X[4] + X[5] + X[6] - 45},
    {'type': 'eq', 'fun': lambda X: X[4] + X[5] + X[6] + X[7] + X[8] + X[9] + X[10] - 67},
    {'type': 'eq', 'fun': lambda X: X[7] + X[8] + X[9] + X[10] - 64})

res = minimize(my_function, x0, constraints=cons)

Возвращает

success: True
x: array([79.27328348, 78.72671652, 21.16500123, 20.83499877,  8.        ,
       -2.5794818 , -2.4205182 , 15.7738023 , 16.59847106, 15.92703282,
       15.70069382])
0 голосов
/ 28 апреля 2019

В приведенном ниже сценарии я хотел сгенерировать ограничения по всей форме цикла (cons2), но результаты, выводимые из цикла, отличаются от того, который я использовал в форме без цикла (cons2).Я ожидал получить одинаковый результат от обоих.

from scipy.optimize import minimize

import numpy as np

np.random.seed(15)

x0 = np.random.random(size=[11])


def my_function(X):
    A, B, C, D, E, F, G, H, I, J, K = X
    F1 = A + B + C + D - 200
    F2 = C + D + E - 50
    F3 = C + D + E + F + G - 45
    F4 = E + F + G + H + I + J + K - 67
    F5 = H + I + J + K - 64
    return F1 + F2 +F3 +F4 + F5

#the constraints without loop
cons1 = ({'type': 'eq', 'fun': lambda X: X[0] + X[1] + X[2] + X[3] - 200},
    {'type': 'eq', 'fun': lambda X: X[2] + X[3] + X[4] - 50},
    {'type': 'eq', 'fun': lambda X: X[2] + X[3] + X[4] + X[5] + X[6] - 45},
    {'type': 'eq', 'fun': lambda X: X[4] + X[5] + X[6] + X[7] + X[8] + X[9] + X[10] - 67},
    {'type': 'eq', 'fun': lambda X: X[7] + X[8] + X[9] + X[10] - 64})

data = [200, 50, 45, 67, 64]
ran = [[0,3], [2,4], [2,6], [4,10], [7,10]]
_tmp= []

#the constraints with loop
for hh in range(5):    
     _tmp.append({'type': 'eq', 'fun': lambda X: sum([X[i] for i in range(ran[hh][0], ran[hh][1]+1)]) - data[hh]})

cons2 = tuple(_tmp)

#the outputs below must be the same, but it's not.

res1 = minimize(my_function, x0, constraints=cons1)
res2 = minimize(my_function, x0, constraints=cons2)
print res1.x
print res2.x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...