00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef TORC_PLACER_PLACER_HPP
00020 #define TORC_PLACER_PLACER_HPP
00021
00022 #include "torc/architecture/DDB.hpp"
00023 #include "torc/placer/Placement.hpp"
00024 #include "torc/placer/PlacerHeuristicBase.hpp"
00025 #include <boost/timer.hpp>
00026
00027 namespace torc {
00028 namespace placer {
00029
00030
00031 class Placer {
00032 protected:
00033
00034 typedef architecture::DDB DDB;
00035 typedef boost::uint32_t uint32;
00036
00037 DDB& mDB;
00038 PlacerHeuristicBase& mHeuristic;
00039 uint32 mMovesPerTemperature;
00040
00041 public:
00042
00043
00044
00045
00046 Placer(DDB& inDB, PlacerHeuristicBase& inHeuristic) : mDB(inDB), mHeuristic(inHeuristic) {}
00047
00048 ~Placer() {}
00049
00050 void generatePlacement(Placement& placement) {
00051
00052 placement.updateCostFull(false);
00053 int currentCost = placement.getCost();
00054 int newCost = 9999999;
00055 int goodMoves = 0;
00056 int movesUndone = 0;
00057 int acceptedBad = 0;
00058 int zeroCostMoves = 0;
00059 int illegalMoves = 0;
00060 int bestCost = 999999;
00061 bool done = false;
00062 double temperature = mHeuristic.getInitialTemperature();
00063 double acceptrate = 0;
00064 int doneCount = 0;
00065
00066 boost::timer epochTimer;
00067 boost::timer totalTimer;
00068
00069 mMovesPerTemperature = mHeuristic.getMovesPerTemperature();
00070
00071
00072 std::cout << "Moves per temperature: " << mMovesPerTemperature << std::endl;
00073
00074 while (!done) {
00075 epochTimer.restart();
00076
00077 goodMoves = 0;
00078 movesUndone = 0;
00079 acceptedBad = 0;
00080 zeroCostMoves = 0;
00081 illegalMoves = 0;
00082 std::cout << "currentCost for epoch: " << currentCost;
00083
00084 for (uint32 movei = 0; movei < mMovesPerTemperature; movei++) {
00085 if (!placement.randomMove(false)) {
00086
00087 illegalMoves++;
00088 continue;
00089 }
00090 newCost = placement.getCost();
00091 if (newCost < bestCost) {
00092 bestCost = newCost;
00093
00094 }
00095 if (currentCost < newCost) {
00096
00097
00098 double irand = (double)rand() / (double)(std::numeric_limits<int>::max());
00099 if (irand >= exp(((double)currentCost - (double)newCost) / temperature)) {
00100 movesUndone++;
00101 placement.undoMove(false);
00102
00103 } else {
00104 acceptedBad++;
00105 currentCost = newCost;
00106
00107 }
00108 } else if (currentCost == newCost) {
00109 zeroCostMoves++;
00110 } else {
00111 goodMoves++;
00112 currentCost = newCost;
00113 }
00114 }
00115
00116 double epochTime = epochTimer.elapsed();
00117
00118 acceptrate = (double)acceptedBad / ((double)acceptedBad + (double)movesUndone);
00119
00120
00121 double tempadjust = 0;
00122 if (acceptrate > 0.96) {
00123 temperature = 0.5 * temperature;
00124 tempadjust = (double)0.5;
00125 } else if (acceptrate <= 0.96 && acceptrate > 0.8) {
00126 temperature = 0.9 * temperature;
00127 tempadjust = (double)0.9;
00128 } else if (acceptrate <= 0.8 && acceptrate > 0.15) {
00129 temperature = 0.95 * temperature;
00130 tempadjust = (double)0.95;
00131 } else {
00132 temperature = 0.8 * temperature;
00133 tempadjust = (double)0.8;
00134 }
00135
00136
00137
00138 if (goodMoves == 0) {
00139 doneCount++;
00140 } else {
00141 doneCount = 0;
00142 }
00143 if (doneCount == 10) {
00144 done = true;
00145 }
00146
00147
00148 std::cout << " Good moves: " << goodMoves;
00149 std::cout << " Accepted bad: " << acceptedBad;
00150 std::cout << " Undone: " << movesUndone;
00151 std::cout << " ZeroCostMoves: " << zeroCostMoves;
00152 std::cout << " Best Cost: " << bestCost;
00153 std::cout << " Attemped Illegal Moves: " << illegalMoves;
00154 std::cout << " Acceptance rate: " << acceptrate;
00155 std::cout << " new temp: " << temperature;
00156 std::cout << " tempadjust: " << tempadjust;
00157
00158 std::cout << " time: " << epochTime;
00159
00160 std::cout << std::endl;
00161
00162 }
00163 std::cout << "Total time: " << totalTimer.elapsed();
00164 std::cout << std::endl;
00165
00166
00167
00168
00169
00170
00171
00172 placement.updateCostFull(false);
00173 std::cout << "Actual end cost: " << placement.getCost() << std::endl;
00174 }
00175
00176 };
00177 }
00178 }
00179
00180 #endif // TORC_PLACER_PLACER_HPP