2017-12-09 14 views
1

私は次のコードを実行すると:パルプパイソンLP - 間違ったソリューション

from pulp import * 

x = pulp.LpVariable("x", 0, None , LpContinuous) 
y = pulp.LpVariable("y", 0, None , LpContinuous) 
problem = pulp.LpProblem("A simple max problem", pulp.LpMinimize) 
problem += x + y, "The objective function" 
problem += x + 2*y == 2, "1st constraint" 
problem += 2*x + 3*y == 2, "2nd constraint" 
problem += x >= 0, "3rd constraint" 
problem += y >= 0, "4th constraint" 
problem += x + y == 1, "5th constraint" 

problem.writeLP("WhiskasModel.lp") 
problem.solve() 

for variable in problem.variables(): 
    print variable.name, "=", variable.varValue 

print value(problem.objective) 

を私は出力として得る:

x = 0.0 
y = 1.0 
1.0 

第二の制約が満たされていないことから、明らかに間違っています。 状況は上記の問題には解決策がないことです。だから私はパルプから、私に関連するもの(「実行不可能な問題」)かそのようなものを通知することを期待しています。代わりに、私はそれが任意に制約のいくつかを落とし、それらの残りの部分で動作すると思う。同様に、次の場合:

x = pulp.LpVariable("x", 0, None , LpContinuous) 
y = pulp.LpVariable("y", 0, None , LpContinuous) 
problem = pulp.LpProblem("A simple max problem", pulp.LpMinimize) 
problem += x + y, "The objective function" 
problem += x + 2*y == 2, "1st constraint" 
problem += 2*x + 3*y == 20, "2nd constraint" 
problem += x >= 0, "3rd constraint" 
problem += y >= 0, "4th constraint" 
problem += x + y == 1, "5th constraint" 

problem.writeLP("WhiskasModel.lp") 
problem.solve() 

for variable in problem.variables(): 
    print variable.name, "=", variable.varValue 

print value(problem.objective) 

ouputを、すなわち4制約が今や "ドロップ" さ

x = 34.0 
y = -16.0 
18.0 

あります。

これを解決する方法はありますか?

答えて

0

あなたのプログラムは、最初の制約から始めて、自分自身を解こうとします。線形代数の観点から、それの

思う、拡大行列は、次のとおり、両方の変数が> = 0でなければならない更なる制約を有する

[ 1 2 | 2 
    2 3 | 20 
    1 1 | 1 ] 

。 が直接あなたがで終わるだろう秒から2回、最初の行を引い:

[ 1 2 | 2 
    0 -1 | 16 
    .........] 

を言い換えれば、あなたの最初の制約を満たすために、あなたは-16、唯一の可能な解決策になるためにあなたのy変数を強制します。 x変数は、結果として最初の行を解くために34になります。すべてのさらなる制約と目的関数はそれ以上重要ではありません。これが唯一可能な解決策でした。

問題がすべての制約を満たす解決策を持っていない場合、システムは警告を出します。現在、これはパッケージに実装されておらず、Gitを見ているので、この動作を変更する予定はないので、実行不可能な問題について警告を受けたい場合は、パッケージを変更してください。

あなたがパッケージを変更しない場合、あなたはあなたの問題はあなたの制約に違反した溶液から実現不可能だった見ることができます。あなた自身で警告/例外をスローするコードブロックを書くことができます。

関連する問題