2016-05-22 9 views
0

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]) 

Antwort

1

Die Python-API ist näher an die C-Callable-Bibliothek in der Natur als der C++/Konzert-API. Variablen werden von 0 bis model.variables.get_num() - 1 indiziert und können z. B. beim Erstellen von Constraints per Index angegeben werden. Sie können auch mit Namen bezeichnet werden (die add Methode hat ein optionales names Argument). Siehe die Dokumentation für das VariablenInterface here (dies ist für Version 12.5.1, die ich glaube, dass Sie in Ihrem vorherigen Post verwendet haben).

Es kann helfen, die einfachsten Beispiele wie lpex1.py zu betrachten (und die Kommentare lesen). Schließlich empfehle ich dringend, mit der Python-API von der interaktiven Python-Eingabeaufforderung (auch als REPL bezeichnet) zu spielen. Sie können die Hilfe dort lesen und Dinge eingeben, um zu sehen, was sie tun.

Sie können auch einen Blick auf das docplex Paket werfen. Dies ist eine Modellierungsschicht, die auf der CPLEX Python-API aufbaut (oder die in der Cloud gelöst werden kann, wenn keine lokale Installation von CPLEX installiert ist).

+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

+0

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

+0

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