Funktionen!



  • Hallo,

    ich habe kurz ein Problem mit Funktionen.
    Ich brauche in einer Funktion den berechneten Wert aus der anderen Funktion.
    Wie kann ich das realisieren?

    Also so sieht zB. ein Codeabschnitt aus:

    SCIP_RETCODE ShuntingPricer::scip_redcost(
             SCIP*                 scip,
             SCIP_PRICER* pricer,
             SCIP_Real*         lowerbound,
             SCIP_RESULT* result )
    {
    #if ( SCIP_DEBUG >= 2 )
       cerr << "CALL scip_redcost... ";
    #endif
    
    if(gap < 0.05)     //gap und LB kommen erst in der Funktion findAndAddAssignment
    {*result=SCIP_DIDNOTRUN;
     *lowerbound=LB;
    
    return SCIP_OKAY;
    }
    // set result pointer
    *result = SCIP_SUCCESS;
    return findAndAddAssignment( scip, dualVariables, false );
    }
    
    SCIP_RETCODE ShuntingPricer::findAndAddAssignment( SCIP* scip, const Instance::DualVariables& dualVariables, bool farkas)  const
    {
    
    double sum = 0.0;
    int nNeg=0;
    vector<int > negIndex;
    
    double red_cost = dualVariables.beta[i];
    
                if ( SCIPisNegative( scip,  red_cost ) ) {         
                            sum += red_cost;
                            negIndex.push_back( i );
                            ++nNeg;
    
             }
    
    double UB = SCIPgetLPObjval(scip);
    double LB = UB + sum;     //ich brauche LB und gap, kann diese aber nur  hier       
                                berechnen
    double gap= (UB-LB)/UB;
    return SCIP_OKAY;
    }
    

    Ich hoffe ihr könnt mir helfen.
    Danke!

    Viele Grüße
    Tugba



  • Du willst also wissen, wie du mehrere Werte aus einer Funktion zurückgeben kannst. Entweder du übergibst einen Pointer oder eine Referenz auf Variablen, in die die Werte hineingespeichert werden sollen oder du erstellst eine Klasse, in der alle Variablen enthalten sind. So könnteste du alle Variablen zusammen zurückgeben.



  • wxSkip schrieb:

    oder du erstellst eine Klasse, in der alle Variablen enthalten sind.

    Dazu gibt es aus der Standardbibliothek:



  • Hallo,

    danke für Eure Tipps. Ich habe den Code jetzt so erweitert:

    struct SCIP_PricerData
    {
    SCIP*  scip;  
    double gap;
    double LB;
    };
    
    SCIP_RETCODE ShuntingPricer::scip_redcost( 
             SCIP*                 scip, 
             SCIP_PRICER* pricer, 
             SCIP_Real*         lowerbound, 
             SCIP_RESULT* result ) 
    { 
    #if ( SCIP_DEBUG >= 2 ) 
       cerr << "CALL scip_redcost... "; 
    #endif 
    
    SCIP_PRICERDATA* pricerdata;
    pricerdata = SCIPpricerGetData(pricer);
    assert(pricerdata != NULL);
    
    if(pricer->gap < 0.05)
    {*result=SCIP_DIDNOTRUN;
     *lowerbound=pricer->LB;
    
    return SCIP_OKAY;
    }
    
    // set result pointer
    *result = SCIP_SUCCESS; 
    return findAndAddAssignment( scip, dualVariables, false ); 
    } 
    
    SCIP_RETCODE ShuntingPricer::findAndAddAssignment( SCIP* scip, const Instance::DualVariables& dualVariables, bool farkas)  const 
    { 
    
    double sum = 0.0; 
    int nNeg=0; 
    vector<int > negIndex; 
    double red_cost = dualVariables.beta[i]; 
    
                if ( SCIPisNegative( scip,  red_cost ) ) {         
                            sum += red_cost; 
                            negIndex.push_back( i ); 
                            ++nNeg; 
    
             } 
    
    double UB = SCIPgetLPObjval(scip);
    pricer->LB = UB + sum;
    pricer->gap= (UB-LB)/UB; 
    
    return SCIP_OKAY; 
    }
    

    So müsste es doch eigentlich klappen,oder??



  • Formatiere bitte deinen Code

    struct SCIP_PricerData
    {
        SCIP*  scip;
        double gap;
        double LB;
    };
    
    SCIP_RETCODE ShuntingPricer::scip_redcost(
        SCIP*                 scip,
        SCIP_PRICER* pricer,
        SCIP_Real*         lowerbound,
        SCIP_RESULT* result )
    {
    #if ( SCIP_DEBUG >= 2 )
        cerr << "CALL scip_redcost... ";
    #endif
    
        SCIP_PRICERDATA* pricerdata;
        pricerdata = SCIPpricerGetData(pricer);
        assert(pricerdata != NULL);
    
        if(pricer->gap < 0.05)
        {
            *result=SCIP_DIDNOTRUN;
            *lowerbound=pricer->LB;
    
            return SCIP_OKAY;
        }
    
        // set result pointer
        *result = SCIP_SUCCESS;
        return findAndAddAssignment( scip, dualVariables, false );
    }
    
    SCIP_RETCODE ShuntingPricer::findAndAddAssignment( SCIP* scip, const Instance::DualVariables& dualVariables, bool farkas)  const
    {
    
        double sum = 0.0;
        int nNeg=0;
        vector<int > negIndex;
        double red_cost = dualVariables.beta[i];
    
        if ( SCIPisNegative( scip,  red_cost ) )
        {
            sum += red_cost;
            negIndex.push_back( i );
            ++nNeg;
        }
    
        double UB = SCIPgetLPObjval(scip);
        pricer->LB = UB + sum;
        pricer->gap= (UB-LB)/UB;
    
        return SCIP_OKAY;
    }
    


  • Kompiliert es denn überhaupt?



  • wxSkip schrieb:

    Kompiliert es denn überhaupt?

    Ich bin zu faul den Code durchzulesen, wo meinst du denn hakt es?



  • Sone schrieb:

    wxSkip schrieb:

    Kompiliert es denn überhaupt?

    Ich bin zu faul den Code durchzulesen, wo meinst du denn hakt es?

    Wo ist denn pricer definiert? Soweit ich gesehen habe nur in einer anderen Funktion...



  • wxSkip schrieb:

    Sone schrieb:

    wxSkip schrieb:

    Kompiliert es denn überhaupt?

    Ich bin zu faul den Code durchzulesen, wo meinst du denn hakt es?

    Wo ist denn pricer definiert? Soweit ich gesehen habe nur in einer anderen Funktion...

    Ach, global deklarierte Variablen wahrscheinlich - ob das sinnvoll ist mal außenvor.


Anmelden zum Antworten