2012-12-07 30 views
1

首先我正在與線性規劃包漿工作車削的raw_input成蟒表達

確定,所以我使用的

x = raw_input('-->') 

現在用戶將被輸入是所述信息收集用戶輸入通過殼的線性不等式形式(例如2 * a + 3 * b < = 4)。我已經編寫了一個方法將用戶定義的變量a和b存儲到LP中。

我現在有麻煩取輸入,並通過把它作爲一個約束的LP:

prob += x 

如果你硬編碼在Python文件,你想補充的信息:

prob += 2*a +3*b <= 4 

這個例子

該錯誤消息我得到的是:

TypeError: unsupported operand type(s) for +=: 'int' and 'str'

有什麼想法?

+0

看看這個[回覆](http://stackoverflow.com/a/13751697/355230)有點類似的問題 - 在那裏使用的技術可以適用於你的問題。 – martineau

+0

我解決此得到的方法是: 'J = 「一」 對於i在約束: I = I + 「\」 「+ J + 」\「」 打印我 K = EVAL(ⅰ) prob + = k j + =「a」 ' prob獲取python表達式和唯一字符串的元組。 「 – user1883573

回答

2

嘗試做:

x = float(raw_input('-->')) 

我假設prob是一個整數。 raw_input將該變量作爲字符串返回,因此您希望將其轉換爲整數/浮點數。你得到的錯誤是因爲你試圖「添加」一個字符串和一個整數;要麼添加兩個整數,要麼連接兩個字符串,但不能彼此完成。因此,由於x必須是整數(或浮點數),因此請使用float(obj)int(obj) ---您不知道x是否爲浮點數或整數,因此只需使用float即可。

要通過給定的不等式解析,這樣做:

#assuming no spaces in the inequality are included; if the input isn't in the correct form, the program will NOT work correctly 
ineq = input("What is the inequality? Input in the form: ax+by<=c: ") 
a, b, c, sign, index = 0, 0, 0, '', 0 #multiple assignment 
while ineq[index] != 'x': #until it reaches x, it will keep going 
    a += int(ineq[index]) 
    if ineq[index] == 'x': 
     break 
    index += 1 # index = index + 1 

index += 2 #to go through the 'x' and '+' 

while ineq[index] != 'y': 
    b += int(ineq[index]) 
    if ineq[index] == 'y': 
     break 
    index += 1 

index += 1 #to go through the 'y' 

if ineq[index] == '<' and ineq[index + 1] == '=': 
    sign = '<=' 
elif ineq[index] == '>' and ineq[iddex + 1] == '=': 
    sign = '>=' 
elif ineq[index] == '>': 
    sign = '>' 
else: 
    sign = '<' 

if sign == '<=' or sign == '>=': 
    index += 2 #to go through the '>' or '<' and the '=' 
else: 
    index += 1 #to go through the '>' or '<' 

c = int(ineq[index:]) 
#code to solve the inequality 

一種更容易和更快的方法是隻提示用戶「A」,「B」,「C」的每一個值,並且'標誌'。

+0

」現在用戶輸入的信息是一個線性不等式形式...「 – Ryan

+1

我得到ValueError:int()與基數10的無效文字:'3 * a + 2 * b <= 4' – user1883573

+0

@minitech 「我已經編寫了一個方法,將用戶定義的變量a和b存儲到LP中。」你是否試圖解析(根據用戶輸入找出a和b的值)不等式? –

2

因此,有你的用戶輸入,和你的代碼的Python的例子之間的根本區別:

用戶輸入,在這個例子中,將是一個字符串字面"2*a + 3*b <=4" 你無法追加字符串文字到prob,因爲它期望約束或類似的對象 - 這是你的錯誤來自何處。

prob += x 

當你在python中使用相同的表達式時,你會注意到它缺少我在這個語句上有用的引號。
這不是一個字符串文字,它是一個python表達式。紙漿的某些部分將其評估爲約束對象,然後將該約束添加到該問題中。

prob += 2*a +3*b <= 4 



現在,完全忽視了執行任意代碼,爲您解決問題最簡單的方法的潛力是評估用戶輸入Python代碼,讓語言做休息:

exec("prob +="+x); 

應該注意的是,除非這個腳本完全是供你個人使用的,否則這是一個可怕的想法



從一個普通編程的角度來看,正確的解決方案是建立從字符串的LPConstraint對象,然後添加你的新構造的對象概率。

在一個理想的世界中,您將擁有一個LPConstraint的構造函數,該函數需要一個字符串或一個輔助方法在庫中的某個位置爲您執行此操作。

我已經完成了(當然,所有的5分鐘...)一些閱讀文檔,並找不到任何這樣的方法。假設沒有其他人發現任何運氣,你只需自己解析字符串(以及所有的麻煩)並從結果中構建一個約束對象。



通過這樣的問題,一個問題是真正的範圍之一:

  • 你在哪裏安裝這個腳本?
  • 誰將會使用它?
  • 他們可能會造成什麼樣的危害?

如果你正在創建python腳本在高中或大學的計算機實驗室中運行,對於上帝之愛不要使用exec。

如果你正在創建python腳本以便在你的(也可能是朋友的)機器上運行,爲了你自己的目的,那麼編寫一個解析器就是公然浪費你的時間和精力 - 你不會去在您自己的盒子上執行惡意代碼。

+0

這基本上是從來沒有你想要做的... –

+1

哦,這是一個可怕的想法.. ..哪個工作。 – Kiirani

+0

好的,我添加了關於exec正在壞的評論以及正確的解決方案的外觀。我認爲手動解析字符串超出了這個問題的範圍,我似乎無法找到任何庫函數來將字符串解析爲LPConstraint。感謝您的反饋。 – Kiirani