1

まず、線形計画法パッケージ PuLP を使用しています。

わかりましたので、シェルを使用してユーザー入力を収集しています

x = raw_input('-->')

ここで、ユーザーが入力する情報は線形不等式です (例: 2*a + 3*b <= 4)。ユーザー定義変数 a と b を LP に格納するメソッドを既に作成しました。

入力を取得してLPに制約として保存するのに問題があります:

prob += x 

Python ファイルからの情報をハードコーディングしている場合は、次のように追加します。

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

この例では

私が得るエラーメッセージは次のとおりです。

TypeError: += のサポートされていないオペランド型: 'int' および 'str'

何か案は?

4

2 に答える 2

2

やってみてください:

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

probは整数であると仮定しています。raw_input変数を文字列として返すため、整数/浮動小数点数に変換する必要があります。文字列と整数を「追加」しようとしているため、エラーが発生します。2 つの整数を追加するか、2 つの文字列を連結しますが、互いに結合することはできません。したがって、x は整数 (または浮動小数点数) でなければならないので、 float(obj)orを使用します --- が浮動小数点数になるか整数になるint(obj)かはわかりません。xfloat

与えられた不等式を解析するには、次のようにします。

#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'、および 'sign' の各値をユーザーに入力させるだけで、より簡単で迅速な方法になります。

于 2012-12-07T00:06:14.887 に答える
2

したがって、ユーザー入力とコード内の python の例には根本的な違いがあります。

この例では、ユーザー入力は文字列リテラルになり"2*a + 3*b <=4" ます。文字列リテラルを に追加することはできません。probこれは、制約または同様のオブジェクトが必要であるためです。これがエラーの原因です。

prob += x 

Python で同じ式を評価すると、引用符が欠けていることに気付くでしょう。
これは文字列リテラルではなく、python 式です。パルプの一部はこれを制約オブジェクトに評価し、その制約を問題に追加します。

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



ここで、任意のコードが実行される可能性を完全に無視して、問題を解決する最も簡単な方法は、ユーザー入力を Python コードとして評価し、残りは言語に任せることです。

exec("prob +="+x);

このスクリプトが完全に個人的な使用を目的としない限り、これはひどい考えであることに注意してください。



一般的なプログラミングの観点からの正しい解決策は、文字列から LPConstraint オブジェクトを作成し、新しく作成したオブジェクトを prob に追加することです。

理想的な世界では、文字列を受け取る LPConstraint のコンストラクター、またはこれを行うライブラリのどこかにヘルパー メソッドが必要です。

私は(確かに5分間すべて...)ドキュメントを読みましたが、そのような方法は見つかりませんでした。誰も幸運を見つけられないと仮定すると、文字列を自分で解析し (およびそれに伴うすべての手間がかかります)、結果から制約オブジェクトを作成する必要があります。



このような問題では、質問は実際にはスコープの 1 つです。

  • このスクリプトをどこにインストールしますか?
  • 誰がそれを使用する予定ですか?
  • 彼らはどのような潜在的な損害を与えることができますか?

高校や大学のコンピュータ ラボで実行する Python スクリプトを作成している場合は、念のため、exec を使用しないでください。

自分のマシン (およびおそらく友人のマシン) で実行する Python スクリプトを自分の目的で作成している場合、パーサーを作成することは時間と労力の無駄です。あなただけの箱。

于 2012-12-07T00:24:31.913 に答える