簡體   English   中英

使用scipy.optimize.linprog的權重中間范圍(Simplex算法)

[英]Weight Middle Range for use of scipy.optimize.linprog (Simplex algorithm)

基本問題被賦予了這些約束(這是一個簡單的示例,我的用例遵循相同的格式,但可以引入更多的變量):

x + y = C1
C2 <= x <= C3
C4 <= y <= C5

(其中CX是常量,x和y是變量),求解。

使用scipy.optimize.linprog很容易。 從技術上講,我可以得到正確的結果。

例。 使用以下特定約束:

x + y = 50
5 <= x <= 65
10 <= y <= 40

我們得到:

>>> res = scipy.optimize.linprog([1,1], bounds=([5, 65], [10, 40]), A_eq=[[1,1]], b_eq=[50]  )
>>> res.x
array([ 40.,  10.])

從技術上講這是正確的。 請注意,第二個變量最小。 但是由於商業原因,我們希望有一個更“公平”的方法,如果可能的話,每個變量都應超過其最小值,而更多的是(但不一定與)相同:

array([ 25.,  25.])

所以我一直在考慮加權中點。 我如何使用此scipy.optimize.linprog api(或其他一些scipy優化api)來修改最小化的函數,從而為接近每個變量范圍中點的值賦予更高的優先級?

請將此答案作為草稿,以了解如何解決此類問題。 這當然不是解決問題的最佳方法,也不是解決此類問題的最有效算法。


這里的問題是,您可能無法將您的想法表達為平滑的線性目標函數。 您需要某種距離測量,在使用平滑函數的情況下,距離測量可能至少必須是二次的。

以下代碼將x向量范數的L2添加為懲罰。 這在這種情況下會有所幫助,因為L2范數的成分是二次方的,因此,希望所有成分在一個大一點和一個小一點上都相等。

from scipy.optimize import fmin_slsqp

# equality constraints as h(x) = 0
def h(x):
    return x[0] + x[1] - 50

# inequality constraints as g(x) >= 0
def g(x):
    return [
        x[0] - 5,
        -x[0] + 65,
        x[1] - 10,
        -x[1] + 40,
    ]

# target functions
f1 = lambda x: x[0] + x[1]
f2 = lambda x: x[0] + x[1] + sum(x**2)

結果:

x = fmin_slsqp(f1, (5,45), f_eqcons=h, f_ieqcons=g)
print(x)

輸出:

Optimization terminated successfully.    (Exit mode 0)
            Current function value: 50.0
            Iterations: 1
            Function evaluations: 5
            Gradient evaluations: 1
[ 10.  40.]

和懲罰版本:

x = fmin_slsqp(f2, (5,45), f_eqcons=h, f_ieqcons=g)
print(x)

版畫

Optimization terminated successfully.    (Exit mode 0)
            Current function value: 1300.0
            Iterations: 3
            Function evaluations: 12
            Gradient evaluations: 3
[ 25.  25.]

暫無
暫無

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

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