5

私は現在、この問題を解決しようとしています。私はこの会社の利益を最大化する必要があります。

それは私が現在持っているコードです:

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 個の製品を超えない限り、最初の勾配のみを使用する制約のために記述しようとしたコードです。

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

誰かがヒントを持っていれば、それをどのように進めることができるかは素晴らしいことです.

前もってありがとう、パトリック

4

1 に答える 1

7

Pyomo では、ルールはソルバーに送信されるコールバックではありません。これらは、静的な式のセットを取得するために、インデックスごとに 1 回呼び出されます。この一連の式がソルバーに送信されます。ルール内で使用する if-logic は、変数の値を含むべきではありません (変数の初期値に基づいている場合を除きます。その場合、変数を主な式の外で使用する場合は常に value() でラップします)。つまり返されます)。

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

于 2016-11-29T19:00:19.663 に答える