2016-05-06 5 views
1

Ich bin ein Anfänger in CPLEX und C++ Programmierung, und ich versuche, ein mittelgroßes MIP Problem zu lösen.CPLEX Zeit bis zur ersten durchführbaren Lösung

Mein Problem ist, dass ich wissen muss, wie viel Zeit CPLEX gebraucht hat, um die erste machbare Lösung zu bekommen und die bestmögliche Lösung zu finden (nicht notwendig die globalen Optima).

Ich weiß bereits, wie man ein Zeitlimit konfiguriert und ich habe den Lösungspool von CPLEX benutzt, um alle möglichen Lösungen zu bekommen, aber nicht seine Zeiten.

Gibt es einen direkten Code in CPLEX, um die Zeitwerte für jede mögliche Lösung zu erhalten?

Dank

EDIT1: der Code für das Problem folgend wäre:

IloEnv env; 
IloModel model(env); 
IloCplex cplex(model); 
IloCplex::Param::TimeLimit; 

IloExpr term2(env); 
IloExpr term3(env); 
IloExpr objetivo(env); 

IloInt i,j; 
double CP; 

IloNumVarArray z(env, columnas-1, 0, INFTY,ILOBOOL); 
IloNumVarArray a(env, columnas, -1*INFTY, INFTY, ILOFLOAT); 

for (i = 0; i < filas; i++){ 
    IloExpr term1(env); 
    for(j = 0; j < columnas-1; j++){ 

     term1 += a[j]*(A[i+1][j+2]); 
    } 
    term2 += ((b[i+1])-(term1+a[columnas-1]))*((b[i+1])-(term1+a[columnas-1])); 
    term1.end(); 
} 

for(j = 0; j < columnas-1; j++){ 
     term3 += z[j]; 
    } 
objetivo=term2/(sigmasq)+2*(term3+1)-(filas); 

model.add(IloMinimize(env, objetivo)); 


for (j = 0; j < columnas-1; j++) { 
    IloExpr restr(env); 
    restr = a[j] + (bigM)*z[j]; 
    model.add(0 <= restr <= IloInfinity); 
    restr.end(); 
} 
for (j = 0; j < columnas-1; j++) { 
    IloExpr restr(env); 
    restr = (bigM)*z[j] - a[j]; 
    model.add(0 <= restr <= IloInfinity); 
    restr.end(); 
} 

cplex.setParam(IloCplex::Param::ClockType, 2); 
cplex.setParam(IloCplex::Param::TimeLimit, 3600); 

cplex.solve(); 

PD: Sorry, dass einige Parameter in Spanischen sind, aber das ist meine Muttersprache.

+0

Können Sie Code für das, was Sie ausprobiert haben und wo Sie gerade aufhängen? – DVK

+0

Sicher, es ist bearbeitet! – Javier

+0

Ich bin eigentlich nicht irgendwo in den Code, ich weiß nicht, was ich tun kann, um diese Zeitwerte zu erhalten ... – Javier

Antwort

0

Sie können die incumbent callback verwenden, um die Zeit (siehe getCplexTime-Funktion) für jede ganzzahlige machbare Lösung zu erhalten, die auf dem Weg gefunden wurde (und die endgültige Lösung eingeschlossen). Um zu beginnen, sehen Sie sich das Beispiel ilomipex4.cpp an, das mit CPLEX ausgeliefert wird. Hier finden Sie ein Beispiel für die allgemeine Verwendung von Rückrufen. Siehe auch documentation zum Implementieren von Rückrufen mit Concert.

+0

Vielen Dank! das löst mein Problem perfekt! – Javier