2016-11-29 9 views
1

現在、この問題を解決しようとしています。私はこの会社の利益を最大限にする必要があります。Pyomo:if文の制約

from pyomo.environ import * 
from pyomo.opt import * 
opt = solvers.SolverFactory("ipopt") 
model = ConcreteModel() 

model.x1 = Var(within=NonNegativeIntegers) 
model.x2 = Var(within=NonNegativeIntegers) 
model.y1 = Var(within=NonNegativeIntegers) 
model.y2 = Var(within=NonNegativeIntegers) 
model.b1 = Var(within=Boolean) 
model.b2 = Var(within=Boolean) 

model.c1 = Constraint(expr = model.x1 + model.x2 + model.y1 + model.y2 <= 7000) 
model.c2 = Constraint(expr = 2*model.x1 + 2*model.x2 + model.y1 + model.y2 <= 10000) 
model.c3 = Constraint(expr = model.x1 <= 2000) 
model.c4 = Constraint(expr = model.x2 <= 1000) 
model.c5 = Constraint(expr = model.y1 <= 2000) 
model.c6 = Constraint(expr = model.y2 <= 3000) 


model.z = Objective(expr= (150*model.x1 + 180*model.x2*model.b1 + 100*model.y1 + 110*model.y2*model.b2), sense=maximize) 
results = opt.solve(model) 

これは私がだけであれば2000個の製品を超えないように第1の斜面を利用している私の制約のために書くことを試みたコードです:私は現在持っているコードをよ

def ObjRule(model): 
if model.x1 >= 2000: 
    return model.b1==1 
if model.x2 >= 2000: 
    return model.b2 == 1` 

誰かがヒントを持っている場合、どのように進めることができるかは偉大なことです。

はPyomoでは、事前に パトリック

答えて

2

をありがとう、ルールはソルバに送られたコールバックではありません。静的な式セットを取得するために、各インデックスに対して1回呼び出されます。この一連の式がソルバに送信されます。ルールの内部で使用するif-logicは、変数の初期値に基づいていない限り、変数の値を含むべきではありません。返されます)。

区分的関数をモデル化したい場合は、それを行うために何らかの種類のモデリングトリックを適用する必要があります。場合によっては、離散変数(Piecewiseコンポーネントの場合はexamplesを参照)を導入する場合もあります(たとえば、有限数のアフィン関数の最小値として表現できる区分関数を最大化する場合など)。

+0

ありがとうございます。 – pat96