решение проблемы минимизации с использованием scipy.optimize в python - PullRequest
0 голосов
/ 10 июля 2020

У меня вопрос по поводу решения задачи минимизации с помощью scipy.optimize в python. У меня есть одномерный массив (x), содержащий около 2000 элементов в качестве переменных этой задачи, и list из {constraint,dict} элементов в качестве ограничений задачи оптимизации. Проблема в том, что я хочу вычислить сумму большого количества переменных в пределах for l oop, чтобы определить целевую функцию и ограничения. Я приложил простой пример своего кода ниже, но следует учитывать, что из-за сложности моего кода невозможно выполнить расчет без for циклов. Однако, делая это, я сталкиваюсь с этой ошибкой: 'function' object is not iterable.

def objective(x):
    sum = 0
    for i in range(1, 1000):
        sum += x[i]
    return sum

def constraints(x):
    constraint = []
    for i in range(1, 1000):
        sum = 0
        for j in range(1, 100):
            sum += j*x[i]
        constraint.append({'type': 'ineq', 'fun': 10 - sum})
    return constraint
sol = minimize(objective, x0, method='slsqp', constraints=constraints)
 

1 Ответ

0 голосов
/ 11 июля 2020

посмотрел видео, на которое вы ссылались, и подумал, что вы, возможно, неправильно поняли пару вещей. Я начну с простого примера c, чтобы вы начали.

Если мы возьмем приведенный ниже код:

from scipy.optimize import minimize

def objective(x):
    x1=x[0]
    x2=x[1]
    x3=x[2]
    x4=x[3]
    return x1+x2+x3+x4

x0=(1,1,1,1)
solution=minimize(objective,x0)    

Простая установка. Вы видите, что цель python функция возвращает математическую функцию . Эта математическая функция - это то, что вы минимизируете. Обратите внимание, как все ваши переменные определяются путем вызова значения из списка значений (в данном случае x0). Таким образом, x1 - это x0 [0], x2 - это x0 [1], et c.

В приведенном выше примере вы не определяете x0, и у вас нет уравнения. Наконец, sum - это функция python (она принимает сумму списка). Вместо этого, чтобы сделать то, что вы sh должны делать, давайте перепишем приведенное выше, используя для l oop now:

from scipy.optimize import minimize
import numpy as np

def objective(x):
    equation = 0
    for i in range(4):
        equation += x[i]
    return equation

x0=np.ones(4)
solution=minimize(objective,x0)

Это даст вам тот же результат, что и выше; однако теперь вы можете видеть, что я заменил сумму на уравнение (теперь у вас не будет проблем со встроенными функциями python), и теперь вы определили свои переменные). Я не собираюсь go через весь ваш код, но я надеюсь, что этот пример достаточно проясняет, чтобы вы начали.

Если вам нужны 1000-е значения x, просто дайте x0 массив из 1000 значений .

Изменить:

Чтобы решить проблему во 2-й части вашего кода:

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

def constraints(x):
    constraint = []
    for i in range(4):
        value = 0
        for j in range(4):
            value += 10-j*x[i]
        constraint.append(value)
    return constraint


x0=np.ones(4)
con={'type': 'ineq', 'fun': constraints}
sol = minimize(objective, x0, method='slsqp', constraints=con)

Редактировать 2: Вы можете использовать ту же идеологию, указанную выше, для создания второго ограничения:

from scipy.optimize import minimize
import numpy as np

def objective(x):
    equation = 0
    for i in range(4):
        equation += x[i]
    return equation

def constraints(x):
    constraint = []
    for i in range(4):
        value = 0
        for j in range(4):
            value += 10-j*x[i]
        constraint.append(value)
    return constraint

def constraints2(x):
    constraint2 = []
    for a in range(4):
        value = 0
        for b in range(4):
            value += 5-a*x[b]
        constraint2.append(value)
    return constraint2

x0=np.ones(4)
con={'type': 'ineq', 'fun': constraints}
con2={'type': 'eq', 'fun': constraints2}
combined=[con,con2]
sol = minimize(objective, x0, method='slsqp', constraints=combined)

Это работает без какие-либо проблемы или ошибки, так что я не вижу проблемы, с которой вы столкнулись.

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