2016-11-16 63 views
0

我正在線性化我在紙漿中的乘法約束。約束條件下的乘法 - 求解紙漿(python)

它看起來是這樣的:

prob += (1 - Y) * (3 - X) 

等於:

prob += 3 - 3*Y - X + X*Y 

其中Y是一個二元變量,在公式一切除了以下部分線性:Y*X。我試圖用我的另一個問題發現公式來解決這個問題:

Link to the picture

Link to the question

所以我試着用X1*X2 = Y,使用我的代碼,這給X*Y = A。我使用日誌替換方法。這給了我下面的代碼:

prob += math.log(float(A)) = math.log(float(X)) + math.log(float(y)) 

和其他約束:

prob += 3 - 3*Y - X + A 

只有這似乎並沒有工作,因爲一個浮動只能是一個字符串或數字,而不是LpVariable。有沒有辦法使用公式圖像中給出的第一種取代方法來解決這個問題?

回答

0

根據他們的PyPi頁面上的文檔,它看起來像你可能需要的只是調用你的LpVariable的值。這會給你的數值,然後可以在使用你的計算

https://pypi.python.org/pypi/PuLP

可以使用值獲取變量的值()。例如:

值(X): 2.0

所以你的功能可能能夠被重新寫爲

prob += math.log(float(value(A))) = math.log(float(value(X))) + math.log(float(value(y))) 

浮子()的聲明也可能是不必要的,以及因爲它看起來像LpVariables通常將其內部數字存儲爲浮點數

+0

謝謝,但是當我這樣做時,它說:'float()參數必須是字符串或數字,而不是'NoneType',如果我刪除了float '需要浮動'。我不認爲記錄LpVariable是可能的。 – WhatTheShrimp

+0

挖掘到模塊的源代碼,獲取值是一個不同的呼叫抱歉。從他們的代碼在這裏 - https://github.com/coin-or/pulp/blob/master/src/pulp/pulp.py - 在LpVariable類中: def value(self): return self.varValue 所以得到一個變量的值是x.value()而不是值(x),它應該給你你的值,假設該變量有一個賦值給它的值。您將需要保留float()部分,但內部沒有將值分配給LpVariable類中的浮點類型。 – huma474