// \****************************************************** // Datei SA_Solver.h // Autor: Peter Unruh, basierend auf der PG-Version // \****************************************************** #ifndef SA_Solver_H #define SA_Solver_H //#include #include #include #include "constants.h" #include "SA_Scheduler.h" #include "parrandom.h" // Zufallszahlen #include "SA_Problem.h" #include "SA_Output.h" // \****************************************************** // Klasse SA_Solver : // Koordination von dem gesamten SA-Prozess // \****************************************************** class SA_Solver { protected: SA_Output sasolvoutput; char InitialSolutionStr[8]; char* ConfigFileName; char* DataFileName; char* OutputFileName; char* SolutionFileName; char* SolutionCostFileName; enum WriteFctT {STREAM,PATH}; // ob stream- oder pfad-Basierte Funktionen fuer das Schreiben der Best // Loesung genommen werden WriteFctT WriteFct; enum OvwrtMode {NEVER,BETTER,ALWAYS}; // Wann soll bestehende Loesungsdatei ueberschrieben werden OvwrtMode OverwriteSolution; int VerboseMode; // 0 - only very basic information // // 3 - some more info, for example subchain data // 4 - even more info, time_t FileReadTime, // Zeit fuer Einlesen der Problemdaten InitialSolutionTime, // fuer das Finden der Initialloesung SATime, // fuer das Annealing-Prozess PostprocTime; // for the Postprocessing SA_Scheduler * Cooler; // Der verwendete Scheduler SA_Problem * P; // Das zu loesendes Problem SA_Solution * State, // Zustand der Algorithmus * BestSolution; // Beste bis jetzt gefundene Loesung void (SA_Problem::*GetInitialSolution_fp)(SA_Solution &); // Welche Methode fuer die bestimmung der Startloesung genommen wird char * Algorithm; // der verwendete SA-Algorithm public: SA_Solver(SA_Problem&); virtual ~SA_Solver(); virtual SA_Output *GetSolverOutput(); SA_Solution *GetCurrentSolution(); SA_Solution *GetBestSolution(); virtual int ReadConfig(std::istream &); // // void InitStates(); // Startloesungen erzeugen und ggf. ausgeben virtual void ShowConfig(); // Testausgabe der Konfiguration virtual void OutputStatistics(std::ostream &); // Statistiken des Laufs in ein stream schreiben (Mit ENDL!) virtual void WriteLog(bool write); virtual void CreateLog(std::ostream &); // Statistik(en) der Laeufe nacheinander in die Logdatei schreiben virtual void WriteSolution(); // Die bester aller Loesungen hinschreiben; // in comm stehen alle Knoten, die jeweils verschiedene BestSolution haben koennen. // float SeqSimAnn(); // int TestProblemImplementation(); // tries to improve the best solution found by a simple Hill Climber. void HillClimber(); virtual float RunAnnealing() = 0; // den gewaehlten SA-Algo ausfuehren // float SeqSimAnn(); // Der sequenielle Annealing-Algorithm //virtual int TestProblemImplementation(); // provisorisch void SetDataFileName(char* name) { DataFileName = new char[strlen(name)+1]; strcpy(DataFileName,name); } void SetSolutionFileName(char* name) { SolutionFileName = new char[strlen(name)+1]; strcpy(SolutionFileName,name); } char* GetDataFileName() { return DataFileName; } }; #endif