簡體   English   中英

在 python 中使用 scipy.optimize 解決最小化問題

[英]solving a minimization problem using scipy.optimize in python

我有一個關於在 python 中使用scipy.optimize解決最小化問題的問題。 我有一個一維數組 ( x ),其中包含大約 2000 個元素作為這個問題的變量,還有一個{constraint,dict}元素list作為優化問題的約束。
問題是我想計算for循環中大量變量的總和,以定義目標 function 和約束。 我在下面附上了我的代碼的一個簡單示例,但是應該考慮到根據我的代碼的復雜性,沒有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)
 

看了你引用的視頻,認為你可能誤解了一些事情。 我將從一個基本示例開始,以幫助您入門。

如果我們采用以下代碼:

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 function目標返回數學 function 數學 function 是您要最小化的。 請注意如何通過調用值列表的值(在本例中為 x0)來定義所有變量。 因此 x1 是 x0[0],x2 是 x0[1],等等。

在上面的示例中,您沒有定義 x0,也沒有方程式。 最后, sum 是一個 python function (它需要一個列表的總和)。 相反,為了做你想做的事,現在讓我們使用 for 循環重寫上面的代碼:

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)

這將為您提供與上述完全相同的 output; 但是現在您可以看到我已將 sum 更改為方程(現在您不會遇到內置 python 函數的問題),並且您現在已經定義了變量)。 我不會通過你所有的代碼去 go,但我希望這個例子足夠清楚,它能讓你繼續。

如果你想要 1000 個 x 值,只需給 x0 一個包含 1000 個值的數組。

編輯:

要解決代碼第二部分中的問題:

假設您使用 sum 固定。 同樣,約束是一個輸入 function (數學)的字典。 我沒有得到你得到的錯誤,所以我不知道它來自哪里。 但是您可以使用上面的示例創建約束 function 。

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)

這工作沒有任何問題或錯誤,所以再一次,我沒有看到你遇到的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM