1

with を使用PuLPして、Python で LP モデルを操作していCBCます。モデルには多くの制約があり、もちろんそれらの多くは冗長です。その例を示します。

#import libraries
from pulp import LpVariable, LpProblem, LpMaximize, lpSum, LpConstraint, LpStatus, value

prob = LpProblem("test_model", LpMaximize)
set_pt=[i for i in range(100)] #set of var
var = LpVariable.dicts("var",set_pt,lowBound=0,cat='Continuous')

# The objective function is added to 'prob' first
prob += lpSum([var[i] for i in set_pt]), "f(v)"

#constraits
for i in set_pt:
     prob += LpConstraint(var[i] <= 300000), "max margin "+str(i) 
     prob += LpConstraint(var[i] <= 30000000000), "ma2 margin "+str(i) 

#solve
prob.writeLP("price_mod2.lp")
print 'solver begin'
prob.solve()

# The status of the solution is printed to the screen
print "Status:", LpStatus[prob.status]

この結果は次のとおりです。

solver begin
Status: Infeasible

もちろん、この例では両方の制約が明らかに冗長であり、私が解決する問題では、制約の魔女が冗長であることを確認するのが少し難しくなります。

問題がソルバー ( CBC) にあるのかどうかわからないので、代わりに多分を使用CPLEXして冗長な制約の問題を解決するか、問題がPuLPあり、別のライブラリを使用する必要があります。または、問題をモデル化して冗長性を証明する必要があるかもしれません。

ガイダンスはありますか?ありがとう!

編集:私はオープンソルバー(Excelで)を使用して試してみましたCBCが、PuLPうまくいきました。PuLP

4

1 に答える 1

2

私はパルプをあまり使用しなかったので、ここで内部構造を説明することはできません (これによりケースが失敗します)。しかし、パルプの制約メカニズムを間違った方法で使用しています

あなたのアプローチ(失敗):

for i in set_pt:
    prob += LpConstraint(var[i] <= 300000), "max margin "+str(i) 
    prob += LpConstraint(var[i] <= 30000000000), "ma2 margin "+str(i) 

代替案 A (オーバーロードされた演算子を使用)

for i in set_pt:
    prob += var[i] <= 300000, "max margin "+str(i)
    prob += var[i] <= 30000000000, "ma2 margin "+str(i)

作業中の代替 B (の明示的な使用LpConstraint; インポートが必要)

for i in set_pt:
    prob += LpConstraint(var[i], LpConstraintLE, 300000), "max margin "+str(i)
    prob += LpConstraint(var[i], LpConstraintLE, 30000000000), "ma2 margin "+str(i)

後者は、最初のアプローチに似ています。しかし、あなたの使用法は関数が期待するもののようには見えません( docsを参照)

于 2016-08-12T18:19:45.680 に答える