//#include //#include //#include //#include #include #include #include //#include #include #include "SA_SeqAartsScheduler.h" //#define debug(r,m) std::cout << " +++ " << #r << " +++" << std::endl; SA_SeqAartsScheduler::SA_SeqAartsScheduler() : GlobalBestE(INFINITY), subchainfactor(1), delta(0.1), epsilon(0.0001), omega(0.8), L(100), L0(100), n_smooth(10), SmoothedMean(0), saaartsoutput("SA_SeqAartsScheduler","SA_Output.rsc") {//debug(SA_SeqAartsScheduler::Konstruktor ,myrank); // Connecting instances to SA_Output object saaartsoutput.EnableLevelNumbers(false); saaartsoutput.EnableIdentifier(true); saaartsoutput.SetOutputLevel(10); saaartsoutput.AddVariable(1, SA_FLOAT, &subchainfactor); saaartsoutput.AddVariable(2, SA_FLOAT, &delta); saaartsoutput.AddVariable(3, SA_FLOAT, &epsilon); saaartsoutput.AddVariable(4, SA_FLOAT, &omega); saaartsoutput.AddVariable(5, SA_LONG, &L); saaartsoutput.AddVariable(6, SA_LONG, &L0); saaartsoutput.AddVariable(7, SA_LONG, &n_smooth); saaartsoutput.AddVariable(8, SA_FLOAT, &SmoothedMean); saaartsoutput.AddVariable(9, SA_FLOAT, &LastSmoothedMean); saaartsoutput.AddVariable(10, SA_FLOAT, &LastT); saaartsoutput.AddVariable(11, SA_FLOAT, &MeanbyT0); saaartsoutput.AddVariable(12, SA_FLOAT, &GlobalBestE); saaartsoutput.SetPreviousOutput(SA_Scheduler::GetSchedulerOutput()); // AverageCost = new float[n_smooth]; // SmoothingFactor = new float[n_smooth]; // for (int i=0; i < n_smooth; i++) // { // AverageCost[i] = 0; // SmoothingFactor[i] = 1; // } } // \****************************************************** // Destruktor // \****************************************************** SA_SeqAartsScheduler::~SA_SeqAartsScheduler() {//debug(SA_SeqAartsScheduler::Destruktor , myrank); // delete [] AverageCost; } SA_Output * SA_SeqAartsScheduler::GetSchedulerOutput() { return(&saaartsoutput); } // \****************************************************** // Methode ReadConfig - Liest die Konfigurations- // daten ( geklammert mit '{' '}' ) aus dem istream // \****************************************************** int SA_SeqAartsScheduler::ReadConfig(std::istream & config) {//debug(SA_SeqAartsScheduler::ReadConfig , myrank); char text[BUFLEN]; config >> text; if ( strcmp(text,"{") != 0) { std::cout << "In SA_SeqAartsScheduler::ReadConfig: config file section does not begin with {!\n"; return FALSE; } while (config >> text && ( strcmp(text,"}") != 0 )) { if (strcmp(text, "SA_Scheduler") == 0) { if ( ! SA_Scheduler::ReadConfig(config) ) { std::cout <<"ReadConfing for Scheduler failed!\n"; return 0; } } else if (strcmp(text, "delta") == 0) { config >> text; delta = atof(text); } else if (strcmp(text, "subchainfactor") == 0) { config >> text; subchainfactor = atof(text); } else if (strcmp(text, "epsilon") == 0) { config >> text; epsilon = atof(text); } else if (strcmp(text, "omega") == 0) { config >> text; omega = atof(text); } // else if (strcmp(text, "initialtemperature") == 0) // { // config >> text; // SetStartT( atof(text) ); // } else { std::cout <<"In SA_SeqAartsScheduler::ReadConfig: unrecognized keyword \""< 0) && (delta != -1) ) { newT = T / ( 1 + (log(1+delta)*T)/(3*GetSigma()) ); } LastSmoothedMean = SmoothedMean; SmoothedMean = (1-omega)*GetMean() + omega*SmoothedMean; //if (me == 0) //{ // std::cout<<"Wartezeiten: "<<1.0/mean_update_ratio<<" "<<1.0/(1-pow(1-mean_accept_ratio,nproc))<<" "<<1.0/mean_accept_ratio< L); } // \****************************************************** // Methode Frozen - Entscheidet, ob der Algorithmus // zum Stillstand gekommen ist. // \****************************************************** int SA_SeqAartsScheduler::Frozen() {//debug(SA_SeqAartsScheduler::Frozen , myrank); if (TimeExceeded()) { return 1; } else { float Ableitung = 0, Z; // siehe Formel bei Aarts if ( LastT != T ) { Ableitung = ( SmoothedMean - LastSmoothedMean ) / ( T - LastT ); Z = FABS( Ableitung * T / MeanbyT0 ); } else { Z = 0; } return ( Z <= epsilon )? 1 : 0; } }