C++ und Cplex



  • Hey!

    Zuerst einmal: Keine Ahnung, ob das hier das richtige Unterforum ist. Wusste nicht, wo es am besten reinpasst. Im Zweifel bitte verschieben.

    Also: Ich beschöftige mich mit Optimierungsproblemen, bei denen Matrizen für die Nebenbedingungen entstehen können, die viele Hundertausend Zeilen und Spalten haben. Dabei sind viele der Einträge = 0. Da ich bisher mit MATLAB arbeite, benutze ich dort das Format "sparse". In MATLAB werden allerdings Einträge, die nicht 0 sind, als Double abgelegt und somit kann es trotz sparse zu Arbeitsspeicherproblemen kommen.

    Meine Frage ist im Prinzip:
    Kann ich das in C++ besser hinkriegen?

    Im einzelnen möchte ich ein Optimierungsproblem beschreiben (also eine sparse-Matrix ablegen), diese dem Solver CPLEX von IBM übergeben und das Ergebnis zurück erhalten.

    Meine bisherigen Recherchen:
    - http://math.nist.gov/sparselib++/sparselib-userguide.pdf für das Ablegen der Daten. Ist das empfehlenswert? Gibt es da Erfahrungen zum Vergleich mit sparse in MATLAB?
    - CPLEX scheint folgende Formate zu unterstützen: BAS, CLP, CSV, DPE, DUA, EMB, FLT, LP, MIN, MPS, MST, NET, ORD, PPE, PRE, PRM, REW, RLP, SAV, SOL, XML;
    Ne Idee, wie ich eventuell so das Problem aus C++ am besten an CPLEX übergeben kann?

    Vielen Dank für eure Hilfe!
    Tom



  • Du kannst nicht einfach irgendeine sparse-Matrix-Implementierung nehmen und glauben, dass du damit eine c-Bibliothek (cplex) füttern kannst. Guck erstmal nach, wie die cplex-Schnittstelle aussieht, also, in welcher Form Du da die Daten vorgeben kannst. Mit dieser Formatliste kann ich absolut nichts anfangen. Eventuell kann cplex (ich kenne cplex jetzt nicht) über "Callbacks" Teile der Matrix anfragen, die Du dann on-the-fly neuberechnen könntest. Ab einer gewissen Problemgröße kann man diese Matrizen einfach nicht mehr speichern und muss immer den Teil, den man gerade braucht, neu berechhen.

    ...oder ist cplex gar keine Programmbibliothek? Vielleicht ein Kommandozeilentool? Ich kenn das Ding nur vom Hörensagen.


  • Mod

    Nein, das geht nicht viel besser, egal in welcher Sprache, irgendwo müssen die Daten die nicht 0 sind ja bleiben. Wenn dir float statt double reicht, dann kannst du noch was rausholen. Matlab kann das soweit ich weiß nicht, aber es wird bestimmt C(++) Bibliotheken geben die das können. Das bringt dir aber auch nur Faktor 2.



  • Hallo ihr Beiden!

    Cplex scheint beides zu sein: Ein ausführbares Kommandozeilenprogramm, aber auch eine Menge von Libaries die eine API bereitstellen um mit CPLEX Solvern zu reden.

    Diese beiden Dokumente habe ich gefunden:
    http://class.ece.iastate.edu/ee458/CplexBeginUsersManual.pdf

    http://eaton.math.rpi.edu/cplex90html/pdf/usrcplex.pdf

    Faktor 2 wäre ja schon mal was. Ich denke das ist immer noch besser als nichts. Und float müsste eigentlich reichen. Wobei auf Seite 197/198 vom zweiten Dokument erwähnt wird, dass man sehr vorsichtig mit float sein soll, da CPLEX mit double rechnet und es so zu Ungenauigkeiten kommen kann..

    Als input Formate scheinen LP, MPS und SAV zu funktionieren.

    Ich verstehe aber nicht so recht, wie ich jetzt wirklich große Matrizen darin verwalte. Soll ich wirklich alles so einzeln eingeben wie auf Seite 43ff beschrieben?? Diese Manuals finde ich leider nicht so besonders verständlich, da lobe ich mir doch die von Mathworks...

    Tom



  • Guck doch mal, ob's sowas wie eine Mailingliste für CPLEX gibt. Da wärst Du wahrscheinlich besser aufgehoben als hier. Alternativ probierst Du es mal bei stackoverflow. Hier geht's eigentlich nur um die C++ Programmiersprache. Deine Frage dreht sich eher um die CPLEX Schnittstelle. Du kannst nicht erwarten, dass sich hier jemand für Dich die CPLEX-Dokumentation anschaut.


Log in to reply