2016-04-15 10 views
0

Ich habe eine Datei quadratic_obj.lp mit folgendem Inhalt:Wie exportiert man die cplex-Lösung?

Minimize 
obj: a + b + [ a^2 + 4 a * b + 7 b^2 ]/2 
Subject To 
c1: a + b >= 10 
End 

In einer interaktiven Sitzung cplex, las ich in der Datei read verwenden, ich optimize optimieren verwenden. Dann kann ich die Lösung angezeigt

display solution variables - 

verwendet, die mir diese Ausgabe

Variable Name   Solution Value 
a       10.000000 
b        0.000000 

Gibt es eine Möglichkeit zur Pipeline gibt? So in einer idealen Welt gäbe es so etwas wie:

display solution variables - -> myoutput.csv 

I verwendet write aber die Art Optionsdatei gibt es nicht, was ich suche. Z.B. sol wird als xml zurückgegeben, die ich erneut analysieren müsste.

Gibt es eine Möglichkeit, die Variablen und ihre Werte nur in z. eine tab- oder kommagetrennte Datei?

Antwort

4

Es gibt keine automatische Art und Weise schaffen diese von der interaktiven zu tun. Wenn Sie so etwas wie die folgenden zu tun, es wird Sie in der Nähe:

./cplex -c "read quadratic_obj.lp" "opt" "set logfile tmp.log" "display solution variables -" "quit" 

Das wird die Ausgabe in eine Datei mit dem Namen tmp.log setzen, aber es gibt noch einige zusätzliche Sachen drin, dass Sie zu post bräuchten Prozess mit einem Skript (oder so ähnlich). Weitere Informationen zu dieser Technik finden Sie unter this Link (für Version 12.6.3).

Eine andere Alternative wäre die Verwendung der API's. Dann haben Sie die vollständige Kontrolle über die Ausgabe. Mit der Python-API könnten Sie beispielsweise Folgendes tun:

import cplex 

cpx = cplex.Cplex() 
cpx.read('quadratic_obj.lp') 
cpx.solve() 
# Check solution status here via cpx.solution.get_status() 
for name, value in zip(cpx.variables.get_names(), 
         cpx.solution.get_values()): 
    print name, value 
+1

Das funktioniert gut (die Python-API-Version; habe die andere nicht versucht) - danke! Ich habe es vorläufig aufgewertet und könnte es später akzeptieren, abhängig von der Qualität anderer Antworten. – Cleb

1

können Sie das tun in CPLEX mit OPL:

dvar float+ a; 
dvar float+ b; 

minimize a + b + (a*a + 4 *a * b + 7 *b*b)/2; 
subject to 
{ 
c1: a + b >= 10; 
} 

execute 
{ 
var f=new IloOplOutputFile("res.csv"); 
f.writeln(a); 
f.writeln(b); 
f.close(); 
} 

und dies wird eine CSV-Datei res.csv Grüße

+0

Funktioniert bei mir leider nicht. Es beschwert sich entweder über die Multiplikation ('CPLEX Error 1607: Zeile 4: Erwartet '+' oder '-', gefunden '*'.'), Wenn ich zu meiner ursprünglichen Definition zurückkehre, klagt es über die geschweiften Klammern ('CPLEX Error 1608: Zeile 10: Erwartetes '+', '-' oder Sinn, gefunden '{' .') und ohne sie bekomme ich 'CPLEX Error 1608: Zeile 10: Erwartet '+', '-' oder Sinn, gefunden 'v '.' Irgendwelche Ideen? – Cleb

+0

Sie sollten verwenden, was ich in einer Datei model.mod schrieb und dann in der Befehlszeile oplrun model.mod –

+0

Dann bekomme ich: 'Befehl 'oplrun' existiert nicht. Geben Sie 'help' für eine Liste von Befehlen ein. – Cleb