2016-11-29 2 views
1

Ich versuche derzeit, dieses Problem zu lösen. Ich muss den Gewinn dieses Unternehmens maximieren. Pyomo: Einschränkung mit if-Anweisungen

Das ist, der Code, den ich derzeit habe:

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) 

Dies ist der Code, den ich versuchte, meinen Zwang zu schreiben, die dann nur so lange die erste Steigung mit, da es nicht überschreitet 2000-Produkte:

Wenn jemand einen Hinweis hätte, wie ich fortfahren könnte, wäre das großartig.

danken Ihnen im Voraus, Patrick

Antwort

2

In Pyomo, Regeln zu einem Löser gesendet nicht Rückrufe sind. Sie werden einmal für jeden Index aufgerufen, um eine statische Menge von Ausdrücken zu erhalten. Diese Menge von Ausdrücken wird an einen Solver gesendet. Jede if-Logik, die Sie innerhalb von Regeln verwenden, sollte nicht die Werte von Variablen enthalten (es sei denn, sie basiert auf dem Anfangswert einer Variablen. In diesem Fall würden Sie die Variable in value() umbrechen, wenn Sie sie außerhalb des Hauptausdrucks verwenden das ist zurückgegeben).

Wenn Sie eine stückweise Funktion modellieren möchten, müssen Sie dazu einen Modellierungstrick anwenden. In einigen Fällen beinhaltet dies die Einführung von diskreten Variablen (siehe examples für die Komponente Piecewise), in anderen Fällen nicht (zum Beispiel, wenn eine stückweise Funktion maximiert wird, die als Min einer endlichen Anzahl von affinen Funktionen ausgedrückt werden kann).

+0

Vielen Dank für Ihre Antwort. – pat96