2015-12-21 337 views
1

我試圖弄清楚什麼是錯我的執行意想不到的解決方案,我希望得到的結果是[5, 10],我不明白它是如何得到[7.5, 7.5]x1應該是一半x2。從筆者線性規劃,等式約束

from scipy.optimize import linprog 
import numpy as np 

c = [-1, -1] 

A_eq = np.array([ 
    [1, 0.5], 
    [1, -0.5], 
]) 

b_eq = [15, 0] 

x0_bounds = (0, None) 
x1_bounds = (0, None) 

res = linprog(
    c, 
    A_eq=A_eq.transpose(), 
    b_eq=b_eq, 
    bounds=(x0_bounds, x1_bounds), 
    options={"disp": True}) 

print res.x 
# =>                                             
# Optimization terminated successfully.                                    
#   Current function value: -15.000000                                   
#   Iterations: 2                                        
# [ 7.5 7.5]                                     

更新:

正如有人說這裏不需要矩陣轉置。 問題是在基質本身中,爲了獲得期望的結果,這是[5, 10],它必須是:

A_eq = np.array([ 
    [1, 1], 
    [1, -0.5], 
]) 

回答

2

scipy linprog docs

最小化:C^T * X

除:

A_ub * X < = b_ub

A_eq * X == b_eq

所以,你現在解以下公式:

Minimize -x1 -x2 

符合,*

x1 + x2 = 15 (i) 
0.5 * x1 - 0.5 * x2 = 0 (ii) 

現在,(二)意味着,X1 = X2 (所以你想要的解決方案是不可行的),然後(i)修正x1 = x2 = 7.5。所以,linprog()返回的解決方案確實是正確的。既然你期待着不同的結果,也許你應該看看你將問題轉化爲代碼的方式,因爲我認爲這就是你會發現問題和解決方案的地方。

*)由於您正在進行轉置。

+0

謝謝,原來的問題是沒有矩陣換位,這樣做可能是因爲晚上不知不覺,可能是因爲晚了,基本上找到了如何達到預期結果,矩陣的第一行必須是'[1,1]',再次感謝。 –

+0

@RustyRobot很高興聽到您發現問題出在哪裏。不用謝! :) –

2

您的問題是:

x1 + x2 == 15 
0.5 * x1 - 0.5 * x2 == 0 

minimize -x1 -x2 

所以,很顯然你有x1 == x2(第二個制約因素),從而x1 = x2 = 7.5(第一約束)。

看着你的問題,你可能不想轉A

res = linprog(
    c, 
    A_eq=A_eq, 
    b_eq=b_eq, 
    bounds=(x0_bounds, x1_bounds), 
    options={"disp": True} 
) 

爲什麼給你的問題:

x1 + 0.5 * x2 == 15 
x1 - 0.5 * x2 == 0 

minimize -x1 -x2 

,你會得到x1 = 7.5x2 = 15(唯一可能的值)。