Abweichungen vom binären 0-1-Wert. CPLEX. C++. Visual Studio 2010.



  • Hey Leute,

    habe da ein kleines Problem mit x. Sobald ich mir x ε {0,1} ausgeben lasse, bekomme ich teils für x ganz kleine Werte heraus, die nährungsweise Null sind, aber nicht exakt. Daher möchte ich festlegen, dass sobald der Wert zwischen -0,2 und 0,2 liegt, x auf Null gesetzt werden soll.

    Fehler (-0.2 ist markiert): Der Ausdruck muss einen booleschen Wert aufweisen.
    Verstehe nicht ganz, was das Problem ist.

    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);
    		}
    	}
    
    for (int i=0; i<n; i++) {
    
    		for (int j=0; j<n; j++) {
    
    			for (int k=0; k<m; k++) {
    
    				if (-0.2 <= x[i][j][k]) {
    
                            if (x[i][j][k] <= 0.2) {
    
    					       x[i][j][k] == 0;
                                            }
    				}
    			}
    		}
    	}
    


  • Kann man x mit einem double vergleichen?
    Ist das der Originalcode?
    Wie lautet die vollständige Originalmeldung?

    == in Zeile 11 meinst du sicher auch nicht.



  • manni66 schrieb:

    Kann man x mit einem double vergleichen?
    Ist das der Originalcode?
    Wie lautet die vollständige Originalmeldung?

    == in Zeile 11 meinst du sicher auch nicht.

    Ja, das ist ein Ausschnitt aus dem Originalcode.

    Die vollständige Fehlermeldung für Zeile 7 lautet:

    error C2451: Bedingter Ausdruck des Typs 'IloRangeBase' nicht zulässig.

    Die vollständige Fehlermeldung für Zeile 9 lautet:

    error C2451: Bedingter Ausdruck des Typs 'IloRange' nicht zulässig.



  • Wenn ich auf die Schnelle die richtige Doku gefunden habe, war da wohl einer ganz schlau. Möglicherweise funktioniert:

    if (-0.2 <= x[i][j][k]) <= 0.2 )
    

    Jedenfalls geben die Operatoren <= keinen bool zurück.



  • manni66 schrieb:

    Wenn ich auf die Schnelle die richtige Doku gefunden habe, war da wohl einer ganz schlau. Möglicherweise funktioniert:

    if (-0.2 <= x[i][j][k]) <= 0.2 )
    

    Jedenfalls geben die Operatoren <= keinen bool zurück.

    Das habe ich auch schon probiert. Der Fehler bleibt leider bestehen.



  • Dann geht sicher die getValue Funktion, die du schon zur Ausgabe benutzt hast.



  • manni66 schrieb:

    Dann geht sicher die getValue Funktion, die du schon zur Ausgabe benutzt hast.

    Wie meinen? Dass ich bei cplex.getValue () festlegen soll, dass der Wert zwischen -0.2 und 0.2 auf 0 gesetzt werden soll? Da müsste ich doch dann aber auch mit der if-Schleife arbeiten.



  • JodokusQuak schrieb:

    if-Schleife arbeiten.

    Wer if-Schleife sagt muss seinen Mund mit Seife ausspülen 😉

    if( -2.0 <= x[i][j][k].getObjValue() && x[i][j][k].getObjValue() <= 0.2 )
    

    oder so ähnlich.



  • 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++) { 
    
    					if (-0.2 <= cplex.getValue(x[i][j][k]) <= 0.2) {
    
    						x[i][j][k] = 0;
    					}
    
    					f1 << setw(4) << cplex.getValue( x[i][j][k]) << " ";
    				}
    			}
    		} 
    
    		f1.close();
    

    Habe es nun so probiert. Es tritt zwar kein Fehler auf, aber der gewünschte Effekt, dass x auf Null gesetzt wird, kommt nicht zustande.



  • Ich habe nicht gestottert. Der Vergleich in C++ muss schon so "kompliziert" geschrieben werden. Dein Compiler sollte dir auch eine Warnung ausspucken.



  • manni66 schrieb:

    Ich habe nicht gestottert. Der Vergleich in C++ muss schon so "kompliziert" geschrieben werden. Dein Compiler sollte dir auch eine Warnung ausspucken.

    Auch wenn ich

    if( -0.2 <= cplex.getValue(x[i][j][k]) && cplex.getValue(x[i][j][k]) <= 0.2 )
    

    schreibe, funktioniert es nicht.



  • Wird denn die Zuweisung ausgeführt?
    Muss man vielleicht setValue benutzen?



  • manni66 schrieb:

    Wird denn die Zuweisung ausgeführt?
    Muss man vielleicht setValue benutzen?

    Nein, es tritt dann wieder ein Fehler auf. Entweder habe ich den Befehl auch falsch positioniert (dort wo ich die Dateiausgabe erstelle) oder es funktioniert nicht so nicht.


Anmelden zum Antworten