Was sind Callbacks?
Definiert Rückrufe.
Traditionelle Callbacks ermöglichen es Ihnen, das Verhalten von CPLEX Optimizern genau zu überwachen und zu steuern. Insbesondere erlauben traditionelle Callbacks, dass der Benutzercode während einer Optimierung oder während einer Optimierungssitzung regelmäßig ausgeführt werden kann. Um traditionelle Callbacks (entweder Optimierungs-oder Optimierungscallbacks) mit CPLEX zu verwenden, müssen Sie zunächst die Callback-Funktion schreiben und sie dann an CPLEX übergeben. Das Thema Rückrufe für die Abstimmung bietet Informationen über Rückrufe speziell für eine Abstimmsitzung.
Dieser Teil des Handbuchs konzentriert sich auf Legacy-Optimierungsrückrufe, und das Thema Erweiterte MIP-Kontrollschnittstelle (Legacy) bietet über diese Einführung in Optimierungsrückrufe hinaus weitere Informationen. Es gibt drei Typen von Callbacks zu traditionellen Optimierungszwecken: Informationscallbacks, Abfragecallbacks und Steuercallbacks.
Eine Einführung in generische Rückrufe finden Sie im Thema Generische Rückrufe. Einen Unterschied zwischen Legacy- und generischen Rückrufen finden Sie unter Was ist ein generischer Rückruf?
Verwenden Sie nicht generische und traditionelle Callbacks in Ihrer Anwendung. Wenn Sie traditionelle Callbacks mit generischen Callbacks mischen, löst CPLEX bei dem ersten Aufruf der Optimierung einen Fehler aus (z. B. einen Aufruf von CPXXmipopt).
Traditionelle Callbacks in der Klassenhierarchie der APIs
Jede der Anwendungsprogrammierschnittstellen (APIs) von CPLEX unterstützt Callbacks. Das heißt, Sie können Callbacks schreiben, um mit CPLEX in Ihrer bevorzugten Programmiersprache zu verwenden, ob es sich um C, C + +, Java, C#.NET oder Python handelt.
Die Callback-Klassen-Hierarchie für Java und .NET ist exakt mit der Hierarchie für C + + identisch, aber die Klassennamen unterscheiden sich, da am Ende kein I vorhanden ist. Beispiel: Die Java-Implementierungsklasse, die der C + + -Klasse IloCplex::OptimizationCallbackI entspricht, ist IloCplex.OptimizationCallback.
Die Namen von Callback-Klassen in .NET entsprechen sehr genau denen in den C + +-und Java-APIs. Der Name einer .NET-Klasse beginnt jedoch nicht mit Ilo. Darüber hinaus werden die Namen von .NET-Methoden aktiviert (d. h. sie beginnen mit einem Großbuchstaben) entsprechend den .NET-Konventionen. Die entsprechende Callback-Klasse in .NET ist beispielsweise Cplex.OptimizationCallback.
In ähnlicher Weise folgen Callbacks in Python den üblichen Python-Namenskonventionen für Klassen, Module und Pakete. Daher ist der Python -Name der Callback-Klasse, die der C + + -Klasse IloCplex::MIPInfoCallback entspricht, callbacks.MIPInfoCallback.
Callbacks und die CPLEX-Umgebung
Abhängig von der von Ihnen ausgewählten Programmiersprache müssen Sie möglicherweise mehr oder weniger auf die CPLEX-Umgebung achten, wenn Sie Callbacks in Ihrer Anwendung schreiben und verwenden.
In Java-, .NET-und Python -Anwendungen ist die CPLEX-Umgebung nicht Ihrer Anwendung ausgesetzt, sodass Sie sich keine Sorgen um die Verwendung der richtigen Umgebung machen müssen. Daher ist Ihre einzige Sorge in Bezug auf die CPLEX-Umgebung, dass Ihr Rückruf das Modell, das derzeit optimiert wird, nicht ändern darf.
Im Gegensatz dazu hängt in einer C + + -Anwendung die zu verwendende Umgebung von Ihrem Zweck ab.
In den meisten Fällen verwenden Sie die von der Memberfunktion
getEnvzurückgegebene Umgebung der Callback-Klasse. Die vongetEnvder Callback-Klasse in einigen Fällen zurückgegebene Umgebung kann die gleiche Umgebung sein, die in der aktuellen Optimierung verwendet wird. In solchen Fällen ist es gültig, diese Umgebung an diesen bestimmten Orten zu verwenden.Wenn Sie ein neues Problem in einem Callback erstellen und dieses Objekt nach der Optimierung aushalten sollen, sollten Sie eine neue Umgebung verwenden, die derzeit nicht von der Optimierung verwendet wird.
In einer Anwendung der Callable Library (C API) gibt eines der an Ihren Callback übergebenen Argumente eine Umgebung an. Problemobjekte, die Sie in einer Umgebung erstellen, werden gelöscht, sobald diese Umgebung zerstört wird. Entsprechend dem, was CPLEX nach der Optimierung ausführen soll, kann diese Umgebung die Umgebung sein, die Sie in Ihrem Rückruf verwenden sollten.
In den meisten Fällen, wenn überhaupt möglich, verwenden Sie dieselbe Umgebung, die an den Callback übergeben wurde, und keine andere Umgebung.
Wenn Sie ein Problemobjekt in Ihrem Rückruf erstellen und dieses Problemobjekt nach der Optimierungsroutine (z. B.
CPXlpopt,CPXmipopt,CPXbaroptoder einem anderen Objekt) beenden möchten, dann verwenden Sie nicht die an die Callback-Funktion übergebene Umgebung. Erstellen Sie stattdessen eine neue Umgebung, die nicht in einer Optimierungsfunktion verwendet wird, und verwenden Sie diese neue Umgebung, um das enwährend-Problem-Objekt Ihres Rückrufs zu erstellen.
Anzeige der aktuellen traditionellen Callback-Konfiguration vor der Lösung
CPLEX ermöglicht die Anzeige der aktuellen Callback-Konfiguration vor der Lösung. Bei traditionellen Callbacks wird eine Kombination von Zeichen angezeigt, wobei jedes Zeichen einen anderen Rückruf darstellt, der festgelegt wurde. Der Ausgang wird durch den geänderten Parameter Display-Schalter' CPXPARAM_ParamDisplay gesteuert, und das Display kann mit diesem Parameter ein- und ausgeschaltet werden.
Hier ist ein Beispiel für die Ausgabe für einen traditionellen Callback, wobei die Zeichenliste verwendet wird:
Legacy callback ctXBLUHSN
Die Zuordnung von Zeichen für die traditionelle Callback-Anzeige lautet wie folgt:
c: LP-Callbackp: Callback für Profilingt: Rückruf optimiereni: Rückruf von MIP-InformationenX: MIP-CallbackB: Zweig-CallbackL: Rückruf mit fauler IntegritätsbedingungU: Callback für BenutzerschnittenH: heuristischer CallbackI: AmtsinhaberrückrufS: Callback lösenD: Knoten-Callback löschenN: Knoten-Callback