2016-10-05 44 views
3

我上的編程工作(使用Python)的問題,我必須解決以下類型的線性方程的3個變量的總和:最小化3個變量受到平等和整數約束

X,Y,Z都是整數。

公式例如:2x + 5y + 8z = 14

條件:Minimize x + y + z

我一直在試圖尋找一種算法尋找解決這一點,以最佳的方式。如果有人有任何想法,請指導我通過算法或代碼來源。

我只是好奇,如果這個問題外推到n個變量可以做些什麼?

我不想使用命中&試用循環來檢查值。此外,可能有一個方程式沒有解決方案。

UPDATE

添加下界條件:

x, y, z >= 0 
x, y, z are natural 
+6

正如在下面的答案中指出的那樣,除非你對變量'x,y,z'有限制,否則問題是無界的。在一些問題中,所有變量都有一個下限爲零的情況很常見,但是您沒有指定這個。一般來說,對於Python中的線性編程問題,我會推薦[PuLP](https://pypi.python.org/pypi/PuLP)。 – kabdulla

+0

也許這聽起來沒有意義,是否(x,y,z)需要是整數解決方案? – shole

+0

是的,只尋找整體解決方案。 –

回答

3

不限三重(X,Y,Z),與Z =(14 - 2倍 - 5Y)/ 8,滿足你的約束。

請注意,x + y +(14 - 2x - 5y)/ 8從下面是無界的。當每個xy減少時,該函數減少,沒有有限的最小值。

+0

謝謝,它看起來像最好的數學解決方案。但是,我實際上正在尋找以編程方式解決這個問題。我發現'硬幣改變算法',我可以使用這種類型的問題,我猜。 –

0

從你的第一個方程式:

X =(14 - 5Y - 8X)/ 2

所以,你現在只需要最小化

(14 - 5Y - 8Z)/ 2 + Y + Z

(14 - 3Y - 6Z)/ 2

但是我們可以ignor e用於最小化目的的'/ 2'部分。

據推測,你的問題必須有其他約束,因爲如上所述,解決方案是y和z都可能無限制地增長。

0

我不知道任何通用快速解決方案的n個變量,或不使用命中&跟蹤循環。但對於給定的具體方程2x + 5y + 8z = 14,可能有一些基於觀察的捷徑。

注意,範圍爲任何可能的解決方案非常小:

0<=x<=70<=y<=20<=z<=1

此外大於x = 7以外,則必須至少使用2個變量。 (X + Y +這種情況下z = 7)


讓我們看看我們得到了什麼,如果只使用2個變量:

如果您選擇使用(X,Z)或(Y ,z),因爲z只能是1,xy是微不足道的。

(X + Y + Z = 4爲(X,Z)中,(Y,Z)無解)

如果選擇使用(X,Y),如圖x的係數甚至和y的係數很奇怪,你必須選擇偶數的y才能達到偶數的RHS (14)。這意味着y必須是2,x然後是微不足道的。

(X + Y + Z = 4的這種情況下)


讓我們看看我們得到了什麼,如果使用所有3個變量:

同樣,z必須是1,所以基本上它的使用2個變量(x,y)來實現14-8 = 6,這是偶數。

我們再一次使用類似的參數,因此我們必須選擇偶數的y其爲2,然而在這一點上2Y + 1Z> 14已經,這意味着有使用所有3個變量無解。


因此簡單地通過邏輯,通過使用1個或2個變量減少該等式中,我們可以發現,最小x + y + z爲4達到14 (X = 3,Y = 0,Z = 1或x = 2,Y = 2,Z = 0)

1

你在僅有3尺寸相等約束整數程序(IP)。等式約束2 x + 5 y + 8 z = 14在三維空間中定義了一個平面。參數化它,

x = 7 - 2.5 u - 4 v 
y = u 
z = v 

我們在2個維度獲得不受約束 IP。鑑於完整性約束,我們有u <- {0,2}v <- {0,1}。枚舉所有雙,我們得出結論,最小值爲4並且它達到在(u,v) = (2,0)(u,v) = (0,1),其對應於分別(x,y,z) = (2,2,0)(x,y,z) = (3,0,1)

使用PuLP解決整數程序:

from pulp import * 

# decision variables 
x = LpVariable("x", 0, None, LpInteger) 
y = LpVariable("y", 0, None, LpInteger) 
z = LpVariable("z", 0, None, LpInteger) 

# define integer program (IP) 
prob = LpProblem("problem", LpMinimize) 
prob += x+y+z     # objective function 
prob += 2*x + 5*y + 8*z == 14 # equality constraint 

# solve IP 
prob.solve() 

# print results 
print LpStatus[prob.status] 
print value(x) 
print value(y) 
print value(z) 

產生x = 3y = 0z = 1

1

解決這類問題的另一種工具是SCIP。在GitHub上還有一個易於使用的Python界面:PySCIPOpt

一般而言(混合)整數規劃問題很難解決(NP複雜度),並且即使只有幾個變量和約束的簡單外觀實例也可能需要數小時才能證明最優解。