In der Tat, ich versuche, die sehr einfache Modellformulierung zu implementieren:Set up-Modell in CPLEX Python-API
min sum_i(y_i*f_i) + sum_i(sum_j(x_ij*c_ij))
s.t. sum_i(x_ij) = 1 for all j
x_ij <= y_i for all i,j
x_ij, y_i are binary
Aber ich kann einfach nicht herausfinden, wie der Python API funktioniert. Sie schlagen vor, die Schaffung Variablen wie folgt aus:
model.variables.add(obj = fixedcost,
lb = [0] * num_facilities,
ub = [1] * num_facilities,
types = ["B"] * num_facilities)
# Create one binary variable for each facility/client pair. The variables
# model whether a client is served by a facility.
for c in range(num_clients):
model.variables.add(obj = cost[c],
lb = [0] * num_facilities,
ub = [1] * num_facilities,
types = ["B"] * num_facilities)
# Create corresponding indices for later use
supply = []
for c in range(num_clients):
supply.append([])
for f in range(num_facilities):
supply[c].append((c+1)*(num_facilities)+f)
# Constraint no. 1:
for c in range(num_clients):
assignment_constraint = cplex.SparsePair(ind = [supply[c][f] for f in \
range(num_facilities)],
val = [1] * num_facilities)
model.linear_constraints.add(lin_expr = [assignment_constraint],
senses = ["L"],
rhs = [1])
Für diese Einschränkungen Ich habe keine Ahnung, wie die Variablen von oben verwiesen werden, da sie nur erwähnt eine Hilfs Liste von Listen. Kann mir jemand erklären, wie das funktionieren soll? Das Problem ist einfach, ich weiß auch, wie man es in C++ macht, aber die Python-API ist für mich ein geschlossenes Buch.
Das Problem ist die unkapazitierten Facility Location und ich möchte die Beispieldatei facility.py
EDIT anzupassen: Eine Idee für Constraint No.2 ist eindimensional Vektoren zu erstellen und Vektoraddition verwenden die erstellen letzte Einschränkung. Aber das sagt mir, dass dies ein nicht unterstützter Operand für SparsePairs
for f in range(num_facilities):
index = [f]
value = [-1.0]
for c in range(num_clients):
open_constraint = cplex.SparsePair(ind = index, val = value) + cplex.SparsePair(ind = [supply[c][f]], val = [1.0])
model.linear_constraints.add(lin_expr=[open_constraint],
senses = ["L"],
rhs = [0])
Ich habe eine Einschränkung aus der Datei hinzugefügt. Können Sie mir sagen, wie die Variablen dort enthalten sind? Die Dokumentation sagt mir nur wenig darüber – steph
In der for-Schleife mit dem Kommentar "Constraint no. 1" sollten Sie versuchen, eine print-Anweisung hinzuzufügen, die "assignment_constraint" ausgibt. Wenn Sie dies tun, sollten Sie mehrere Ausgabezeilen sehen: 'SparsePair (ind = [5, 6, 7, 8, 9], val = [1.0, 1.0, 1.0, 1.0, 1.0])'. Dies entspricht einer linearen Abhängigkeit, bei der Variablen mit den Indizes 5, 6, 7, 8, 9 Koeffizienten von 1,0 haben. Wenn die Beschränkung erzeugt wird, ist der Sinn der Beschränkung "L" (d. H. <=), Und die rechte Seite ist 1,0. Sie würden mit einer Einschränkung enden, wie zum Beispiel: "x5 + x6 + x7 + x8 + x9 <= 1.0". – rkersh
Oh, interessante Art zu denken. Ich verstehe das jetzt. Wo ich noch struggeling bin, wie setze ich die Indizes von zwei verschiedenen variablen Mengen in eine Beschränkung? Siehe Update – steph