Variablen als Datei ausgeben. CPLEX. C++. Visual Studio 2010.



  • Hey Leute,

    ich habe folgendes Problem. Ich möchte mir meine Entscheidungsvariable x[i][j][k] ausgeben lassen als txt.Datei. Dazu würde ich gerne mit fstream arbeiten. Sobald das Programm gelöst wurde, habe ich bisher folgende Ausgabe erstellt:

    /* Loesen */
    
    IloCplex cplex(env);
    cplex.extract(model);
    bool solved = cplex.solve();
    
    if (solved) {
    
    	cout << "Zielfunktionswert: " << cplex.getObjValue() << endl;
    
    	/* Ausgabe als Datei */
    
    	fstream f1("test.txt", ios::out);
    
    	f1 << "Ausgabe x[i][j][k]" << endl;
    
    	       for (int i=0; i<n; i++) {
    
    			for (int j=0; j<n; j++) {
    
    				for (int k=0; k<n; k++) { 
    
    					f1 << x[i][j][k] << " " << endl;
    				}
    			}
    		} 
    
    	f1.close();
    } 
    
    else {
    
           cout << "Es hat nicht geklappt!" << endl;
    }
    

    Meine Ausgabe in der test.txt Datei gibt mir aber keine Werte für x aus, sondern die folgende Form:

    Ausgabe x[i][j][k]
    IloIntVar(677)[0..1] IloIntVar(678)[0..1] IloIntVar(679)[0..1] IloIntVar(680)[0..1] IloIntVar(681)[0..1] IloIntVar(682)[0..1] IloIntVar(683)[0..1] IloIntVar(684)[0..1] IloIntVar(685)[0..1] IloIntVar(686)[0..1] IloIntVar(687)[0..1] (...)

    Für x werden aber definitiv Werte berechnet. Sobald ich mit cplex.getValue () arbeite, bekomme ich auch die richtigen Werte.

    Weiß jemand woran das Problem liegt?

    Grüße,

    Jodokus



  • Schuldigt, hier nochmal die richtige Formatierung zu dem Problem.

    /* Loesen */ 
    
    IloCplex cplex(env); 
    cplex.extract(model); 
    bool solved = cplex.solve(); 
    
    if (solved) { 
    
    cout << "Zielfunktionswert: " << cplex.getObjValue() << endl; 
    
    /* Ausgabe als Datei */ 
    
    fstream f1("test.txt", ios::out); 
    
    f1 << "Ausgabe x[i][j][k]" << endl; 
    
    for (int i=0; i<n; i++) { 
    
    for (int j=0; j<n; j++) { 
    
    for (int k=0; k<m; k++) { 
    
    f1 << x[i][j][k] << " " << endl; 
    } 
    } 
    } 
    
    f1.close(); 
    } 
    
    else { 
    
    cout << "Es hat nicht geklappt!" << endl; 
    }
    


  • Wie sieht denn die Definition von x aus, d.h. welchen Typ hat es?

    Geraten: Mußt du evtl.

    x[i][j][k].getObjValue()
    

    ausgeben?



  • JodokusQuak schrieb:

    Ich möchte mir meine Entscheidungsvariable x[i][j][k] ausgeben lassen ...

    Für x werden aber definitiv Werte berechnet. Sobald ich mit cplex.getValue () arbeite, bekomme ich auch die richtigen Werte.

    Was da genau passiert und wie die Entscheidungsvariable x aussieht erschliesst sich mir nicht, da hier der entsprechende Teil fehlt.

    Google sagt dazu:

    http://www-eio.upc.edu/lceio/manuals/cplex75/doc/srcgenman/html/ilog/cplex/IloCplex.html

    The most important solution information computed by IloCplex is the solution vector and the objective function.
    This information can be queried with methods getValue() and getObjValue(),

    Vielleicht passt das Beispiel:

    http://www.or.deis.unibo.it/algottm/files/bp_by_rows.cpp

    IloEnv env;
    IloModel model(env);
    
    // Variables (columns)
    IloNumVarArray x(env);
    IloNumVarArray y(env);
    
    ...    
    
    IloCplex cplex(model);
    
    // Let's solve it!
    if(cplex.solve()) {
        std::cout << "CPLEX model solved! (Status: " << cplex.getStatus() << ")" << std::endl;
        std::cout << "The objective value is: " << cplex.getObjValue() << std::endl;
        print_solution(model, cplex, x, y, n);
    
    }
    


  • x sieht folgendermaßen aus:

    /* 2. Entscheidungsvariable xijk (dreidimensional) */
    
    	IloArray<IloArray<IloNumVarArray> > x (env, n);
    	for (int i=0; i<n; i++) {
    
    		x[i] = IloArray<IloNumVarArray> (env, n);
    
    		for (int j=0; j<n; j++) {
    
    			x[i][j] = IloNumVarArray (env, m, 0, 1, ILOBOOL);
    		}
    	}
    


  • Th69 schrieb:

    Wie sieht denn die Definition von x aus, d.h. welchen Typ hat es?

    Geraten: Mußt du evtl.

    x[i][j][k].getObjValue()
    

    ausgeben?

    cplex.getObjectValue () würde ich ja benutzen, wenn ich mir die Werte für x in der Konsole ausgeben würde. Aber ich will die Werte ja in einer Text-Datei ausgegeben haben. Habe es jetzt mit mehreren Infos aus dem Internet probiert und die machen es eigentlich alle so, wie ich es gemacht habe. Irgendwas scheine ich aber dennoch falsch zu machen.



  • Hast du Dir print_solution() mal angesehen ?



  • Ich schaue es mir mal eben an.



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Bekomme ich noch weniger hin. Gestellt ist auch, dass wir es mit "fstream" machen sollen.



  • JodokusQuak schrieb:

    cplex.getObjectValue () würde ich ja benutzen, wenn ich mir die Werte für x in der Konsole ausgeben würde. Aber ich will die Werte ja in einer Text-Datei ausgegeben haben.

    Und warum sollte es da anders sein?



  • Ich sollte einen Vorschlag beim nächsten Mal richtig ausprobieren.

    Es klappt mit cplex.getValue()!

    Danke euch!


Anmelden zum Antworten