簡體   English   中英

如何正確設置帶有約束和多重優化的 scipy.optimize 最小化?

[英]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 作為結果,因為此時庫存也為零。

幾個問題:

  1. 有沒有辦法讓它在初始猜測為 0 的情況下工作?
  2. 在這個例子中,解空間中有多個最優解(400、800、1200、1600、2000)。 是否可以設置優化,使其找到整個最優向量,然后返回最低項(即 400)?

在嘗試解決問題 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.

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