2016-03-20 17 views
0

Dies ist das Ergebnis der Umsetzung meines allerersten Modells in CPLEX C++ und ich bin sehr überrascht, wie langsam und schlecht die Qualität ist. Ich glaube, dass vieles davon durch eine bessere Formulierung vermieden werden kann. Kann mir bitte jemand helfen, den Code zu verbessern? Hinweise, Ideen, Gedanken ... alles wird geschätzt!Beschleunigung CPLEX C++ Code

Es geht um die Planung von Prüfungen innerhalb von 5 Tagen mit jeweils 2 verfügbaren Zeitfenstern. Meine Eingabe ist die Anzahl der Prüfungen (erste Reihe erste Nummer) und widersprüchliche Prüfung Paare (erste Reihe zweite Nummer), wo ich auch die Anzahl der Schüler kennen beide Prüfungen (in den folgenden Reihen -> Prüfung1 Prüfung2 #Studenten, die beide Prüfungen). Der Code finden Sie here und die Instanz here.

Die Einschränkungen Ich bin auch sind:

  1. jeweils Prüfungen genau einmal geplant ist
  2. widersprüchliche Prüfungen können nicht an der gleichen Periode
  3. bestrafen, wenn widersprüchliche Prüfungen am selben Tag geplant sind geplant werden
  4. bestrafen, wenn widersprüchliche Prüfungen an aufeinanderfolgenden Tagen geplant sind
  5. bestrafen, wenn widersprüchliche Prüfungen in benachbarten Perioden über Nacht geplant sind

Ich habe das Gefühl, dass etwas in der Formulierung auch falsch ist, weil ich mich nicht vorstellen kann, dass der Wert des objektiven Wertes, hoch ist. Sieht jemand den Fehler? Ich stecke fest.

Das Problem könnte in der Schleife sein, wo ich versuche herauszufinden, ob eine weiche Einschränkung verletzt ist oder nicht. Dort schleife ich über Tage, aber wahrscheinlich überschreibe ich versehentlich meine Variablen die ganze Zeit. Hat jemand eine Idee, wie man die binäre Variable bestimmt, die anzeigt, ob die weiche Einschränkung an irgendeinem Tag verletzt wird (und natürlich kann sie nur einmal vorkommen, aber höchstwahrscheinlich ist sie nicht am Ende).

+0

Wenn Sie sagen, das Modell ist langsam, ich denke, du meinst die Lösung Leistung? Das klingt nach einem kleinen Problem. Wie langsam war das Modell zu bauen und zu lösen? Wenn Sie schlechte Qualität sagen, beziehen Sie sich auf die generierte Lösung? Inwiefern ist die Qualität schlecht? Wie groß ist Ihr objektiver Wert? – TimChippingtonDerrick

+0

Das Protokoll liest "Root Relaxation Lösung Zeit = 0,05 Sek. (38,16 Ticks)", ich denke, das ist die Zeit, die benötigt wird, um die erste mögliche Lösung zu finden.Ihr Zielwert ist 28722 (in der Spalte Best Integer) und es wird nicht niedriger als 28608 und es sollte mehr wie 700 etwas sein – steph

+0

Nein. Die Wurzel Relaxationszeit ist, wie lange es dauerte, das entspannte Problem zu lösen (Ignorieren Integralität) bei der Wurzelknoten. Das wäre normalerweise keine ganzzahlige machbare Lösung. Können Sie manuell eine Lösung zum Vergleich erstellen? – TimChippingtonDerrick

Antwort

2

Anstatt C++ - Code zu debuggen, habe ich das Modell nur mit einer Modellierungssprache neu implementiert (ich glaube, das ist schneller und eine angenehmere Art, einen Sonntagabend zu verbringen).

(Hinweis: nach dem Beheben des Fehlers aktualisiert). Hier ist meine Lösung mit einer Gesamtstrafe von 751:

enter image description here

Sie sollten in der Lage sein, dies in Ihren Code zu stopfen und die Ergebnisse zu überprüfen.

Hinweis: Es dauerte ungefähr 900 Sekunden auf einem alten Laptop, um mit Cplex Optimalität zu beweisen. Wenn Sie nur eine gute Lösung wollen, können Sie ein wenig früher stoppen:

enter image description here

(blaue Linie ist das Ziel und die rote Linie ist die beste gebunden). Um eine gute Leistung zu erzielen, half ich Cplex ein wenig bei der Festlegung von Verzweigungsprioritäten und der Verwendung einiger Optionen, die von einem Optimierungslauf vorgeschlagen wurden.

+0

das ist beeindruckend, aber ich verstehe immer noch nicht, wo ich etwas vergessen oder es zu kompliziert gemacht habe – steph

+0

Eine bekannte optimale Lösung sollte es ein Kinderspiel machen, Ihren Code zu debuggen. Einfach die Lösung einbinden (Variablen fixieren) und die Anzahl der Konflikte prüfen. –

+0

ok, die Variablen zu fixieren gibt mir diesen großen objektiven Wert ... so gibt es definitiv einen Fehler in meinem Code – steph