[英]How to correctly set up a scipy.optimize minimization with constraints and multiple optima?
我對 Python 非常陌生,並且在 scipy.optimize 的最小化部分遇到了一些問題。 我已經建立了一個簡單的例子來展示我想要做什么。 我的目標是確定同時最小化庫存的最低采購數量。
我購買的所有東西都分成兩種產品 - 25% 用於產品 A,75% 用於產品 B。產品 A 的一個單位的單位大小為 100,而產品 B 的單位大小為 300。我也有一個最低購買數量為 100,最高購買數量為 2000。
下面的代碼是我的目標函數的設置。
import math
from scipy.optimize import minimize
unitsize = [100, 300]
proportion = [0.25, 0.75]
minpurchase = 100
maxpurchase = 2000
def stock (purchase):
test = []
for i in xrange(len(unitsize)):
product_purchase = purchase * proportion[i]
units = math.floor(product_purchase / unitsize[i])
y = product_purchase - (units * unitsize[i])
test.append(y)
z = sum(test)
return z
我已經測試了股票功能,它似乎按預期工作。 例如,當我調用 stock(500)、stock(400) 和 stock(300) 時,它分別正確返回 100、0 和 300。
然后我嘗試按照以下方式實現最小化,並基於最小和最大購買量進行限制。
但是,當我以初始猜測為零開始時,它返回結果 100,我認為這是錯誤的結果,因為它會導致 100 個庫存並且沒有完整的單位。 我期待例如 400 的結果(其中庫存為零)。 例如,當我以 100 的初始猜測開始時,會出現同樣的問題。
cons = ({'type': 'ineq', 'fun': lambda x: x[0] - minpurchase},
{'type': 'ineq', 'fun': lambda x: x[0] + maxpurchase}
)
print minimize(lambda x: stock(x[0]), [0],
method='COBYLA',
constraints = cons,
options={'maxiter':10000})
status: 1
nfev: 106
maxcv: -0.0
success: True
fun: 100.0
x: array([ 100.])
message: 'Optimization terminated successfully.'
當我從 500 的初始猜測開始時,返回的結果是正確的 400。但是,當我從 1900 開始時,它也會返回 1600 作為結果,因為此時庫存也為零。
幾個問題:
在嘗試解決問題 2 時,我考慮過將一組測試值傳遞到初始猜測中,如下所示,但它返回“IndexError:數組的索引太多”。
知道我在這里做錯了什么嗎?
testvalues = [1000,2000]
for j in range(len(testvalues)):
print minimize(lambda x: stock(x[0]), testvalues[j],
method='COBYLA',
constraints = cons,
options={'maxiter':10000})
[...]
IndexError: too many indices for array
非常感謝任何幫助和指點,我一整天都在努力讓它工作。
引發此錯誤是因為 COBYLA 方法不處理邊界。 只有 BFGS、L-BFGS-B 和 SLSQP 方法可以。 請參閱: 文檔鏈接
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.