2017-08-25 215 views
0

我正在使用scipy.optimize.linprog庫來計算使用simplex方法的最小化。我在我的教科書中正在處理這個問題,我希望有人能夠指出我正確的方向,因爲我沒有得到我期望的輸出。問題是:Python linprog最小化 - 單純形法

Minimize   w = 10*y1 + 15*y2 + 25*y3 
Subject to:  y1 + y2 + y3 >= 1000 
        y1 - 2*y2 >= 0 
          y3 >= 340 
with    y1 >= 0, y2 >= 0 

我寫了這個代碼是:

import numpy as np 
import pandas as pd 
from scipy.optimize import linprog 
A = np.array([ 
[1, 1, 1], 
[1,-2, 0], 
[0, 0, 1]]) 
b = np.array([1000,0,340]) 
c = np.array([-10,-15,-25]) 
res = linprog(c, A_ub=A, b_ub=b, 
bounds=(0, None)) 
print('Optimal value:', res.fun, '\nX:', res.x) 

這給輸出:

Optimal value: -18400.0 
X: [ 0. 660. 340.] 

我希望它是:

Optimal value: -15100.0 
X: [ 660. 0. 340.] 

我似乎無法找到與此功能一致但也許這是我使用它的方式。

回答

2

您已將輸入設置爲稍有錯誤;見the manual。具體來說,你有一些符號錯誤。

  1. 你的載體c有錯誤的符號; linprog減少c x所以c應該僅僅是係數w = c x
  2. 您的載體b和矩陣A有錯誤的標誌。他們的標誌應該被反轉,從您的約束f(x) >= const的形式切換到所需的形式爲linprog方法,這是一個低於或相等,即-f(x) <= - const

  3. 你缺少最後兩個約束。

  4. 你提出的最小值爲0 <,這顯然是不可能的,因爲 w = 10*x1 + 15*x2 + 25*x3總是正與約束x1,x2,x3>=0

正確的代碼如下:

import numpy as np 
from scipy.optimize import linprog 

A = np.array([[-1, -1, -1], [-1,2, 0], [0, 0, -1], [-1, 0, 0], [0, -1, 0]]) 
b = np.array([-1000, 0, -340, 0, 0]) 
c = np.array([10,15,25]) 

res = linprog(c, A_ub=A, b_ub=b,bounds=(0, None)) 

print('Optimal value:', res.fun, '\nX:', res.x) 
# ('Optimal value:', 15100.0, '\nX:', array([ 660., 0., 340.])) 
+0

這是一個很好的解釋 - 謝謝!我希望這些文檔有更多的例子,並且這樣解釋得更好一些。我本來有向量c的正確標誌,但切換它們,因爲我沒有得到任何輸出。就向量b和矩陣A而言,我應該知道反轉符號 - 更重要的是,我應該已經意識到所有示例都顯示小於或等於,並且我需要進行切換。我完全錯過了最後兩個限制。 –