#ifdef MPI // \****************************************************** // Datei SA_EasyScheduler.h // Autor: Peter Unruh, basierend auf der PG-Version // \****************************************************** #ifndef SA_EasyScheduler_H #define SA_EasyScheduler_H // moegliche Zustaende der Vriablen SubChainReduct #define LINEAR 1 #define SQUAREROOT 2 #define NONE 3 //#include "iostream.h" #include "iostream" #include "constants.h" #include "SA_ClusteringScheduler.h" // \****************************************************** // Klasse SA_EasyScheduler : // cooling schedule, Statistiken // \****************************************************** class SA_EasyScheduler : public SA_ClusteringScheduler { private: SA_Output saeasyoutput; char SubChainReductStr[9]; protected: float CoolingRatio, // T(n+1) = T(0)*exp(CoolingRatio,n) MinAccRatio, // if >=0 frozen_count will be incremented bei AcceptRatio < MinAccRatio subchainfactor; // the multiplier for the subchainlength int SubChainReduct; // should the length of subchain be shortened strictly (/ncluster) // or not (/sqr(ncluster) ). unsigned long MaxChainLength, // Maximale laenge der Teilkette MaxChainLength0,// - // - bei Anzahl der Cluster == 1 frozen_count, frozen_limit; float * LastSolutions, // Ein Puffer fuer Frozen-Bestimmung FrozenSum, // Summe der letzten Loesungen Mean; // Mittelwert der letzten Loesungen int pos; // erste freie Position im Puffer int full; // TRUE <=> Puffer voll void Enqueue(); // public: SA_EasyScheduler(); ~SA_EasyScheduler(); SA_Output *GetSchedulerOutput(); int ReadConfig(std::istream &); virtual int Equilibrium(); virtual void UpdateTemperature(); virtual int Frozen(); void SetCoolingRatio(float a) {CoolingRatio = a;} void SetFrozenLimit(unsigned long lim); virtual void ShowConfig(std::ostream & ); // Statistiken des Durchlaufs hinschreiben (OHNE endl davor oder danach !!) virtual void CreateLog(std::ostream &, MPI_Comm comm = MPI_COMM_SELF); // Hier :: falls nicht in .cfg-Datei gesetzt, subchainlengt und initialtemperature ermitteln virtual void WarmingUp(SA_Problem & P, SA_Solution &s, SA_Solution &b, MPI_Comm comm ); // die Anzahl der Cluster dem Scheduler mitteilen ( Kettenlaenge verkuerzen) virtual void SetClusterNumber(unsigned long n_clu, unsigned long clu_size); }; #endif #endif // MPI