Untitled


SUBMITTED BY: Guest

DATE: Nov. 22, 2014, 12:30 p.m.

FORMAT: Text only

SIZE: 6.2 kB

HITS: 18799

  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <string>
  4. #include <fstream>
  5. #include <math.h>
  6. using namespace std;
  7. class sa_tsp{
  8. public:
  9. void init(int);
  10. void wczytaj(string);
  11. int symulacja();
  12. int* copy(int*);
  13. bool accept(int , int, double);
  14. void run(string, int);
  15. void piszTrase(int*);
  16. int n; //liczba miast
  17. int** koord; //wspolrzedne miast
  18. int** odl; // odleglosci miedzy miastami
  19. int* trasa; //aktualna trasa
  20. int* sasiad; // trasa zmutowana(sąsiad)
  21. int* trasaBest;// najlepsza trasa
  22. int dlg; // dlugosc aktualnej trasy
  23. int dlgBest; //dlugosc najlepszej trasy
  24. static const int maxRows = 5000;
  25. double** stat;
  26. };
  27. void sa_tsp::init(int n){
  28. odl = new int*[n];
  29. koord = new int*[n];
  30. trasa = new int[n];
  31. sasiad = new int[n];
  32. trasaBest = new int[n];
  33. for (int i = 0; i < n; i++){
  34. odl[i] = new int[n];
  35. koord[i] = new int[2];
  36. }
  37. }
  38. // funkcja wczytujaca wspolrzedne z pliku. Nazwa pliku przekazywana jest
  39. // jako parametr wejściowy
  40. void sa_tsp::wczytaj(string plik){
  41. ifstream ifs;
  42. string tekst;
  43. ifs.open(plik);
  44. if (ifs.good()){
  45. while (tekst.find("DIMENSION:") == string::npos){
  46. getline(ifs, tekst);
  47. }
  48. }
  49. else
  50. cout << "Nie udalo sie otworzyc pliku." << endl;
  51. }
  52. int sa_tsp::symulacja()
  53. {
  54. int i, j;
  55. int jj = 0;
  56. // Liczba tras do wyznaczenia temperatury
  57. int ile = 10;
  58. // Długość mutanta
  59. int dlgTemp;
  60. double T = 0;
  61. double Tlen = 0;
  62. double alpha = 0.95;
  63. dlgBest = pow(2,31-1);
  64. // Wyznaczanie startowej trasy
  65. for(i=0; i<ile; i++)
  66. {
  67. makeTour();
  68. Tlen += dlg;
  69. if(dlg<dlgBest)
  70. {
  71. trasaBest = copy(trasa);
  72. dlgBest = dlg;
  73. }
  74. }
  75. T = 600;
  76. cout << "T: " << T << " " << dlgBest << " " << Tlen;
  77. // Początkowa trasa
  78. trasa = copy(trasaBest);
  79. // Długość początkowej trasy
  80. dlg = dlgBest;
  81. bool success = false;
  82. bool found = false;
  83. bool done = false;
  84. // Liczy iteracje
  85. int iter = 0;
  86. // Liczy porażki
  87. int fail = 0;
  88. //Liczy sukcesy
  89. int succ;
  90. while(!done)
  91. {
  92. i = 0;
  93. succ = 0;
  94. success = false;
  95. while(!success)
  96. {
  97. dlgTemp = mutacja1(dlg);
  98. if(accept(dlgTemp, dlg, T))
  99. {
  100. trasa = copy(sasiad);
  101. dlg = dlgTemp;
  102. if(dlgTemp < dlgBest)
  103. {
  104. trasaBest = copy(sasiad);
  105. dlgBest = dlgTemp;
  106. found = true;
  107. succ++;
  108. }
  109. }
  110. i++;
  111. iter++;
  112. if(iter%100 == 0)
  113. {
  114. if(jj < maxRows)
  115. {
  116. stat[jj][0]++;
  117. stat[jj][1] += dlgBest;
  118. jj++;
  119. }
  120. }
  121. success = (i>100*n || succ>10*n);
  122. }
  123. T = T*alpha;
  124. if(found)
  125. {
  126. fail = 0;
  127. }
  128. else
  129. fail++;
  130. done = (fail == 5);
  131. }
  132. cout << "Tend: " << T;
  133. return dlgBest;
  134. }
  135. int* sa_tsp::copy(int* tour)
  136. {
  137. int* tmp = new int[n];
  138. for(int i=0; i<n; i++)
  139. tmp[i] = tour[i];
  140. return tmp;
  141. }
  142. bool sa_tsp::accept(int dlgTemp, int dlg, double T)
  143. {
  144. double yes = false;
  145. float r = 1.0;
  146. do
  147. {
  148. r = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
  149. }
  150. while(r<0.0 || r>=1.0);
  151. if(dlgTemp<dlg)
  152. {
  153. yes = true;
  154. }
  155. else
  156. {
  157. yes = (r<exp(-(dlgTemp-dlg)/T));
  158. }
  159. return yes;
  160. }
  161. void sa_tsp::run(string fname, int maxEpoch)
  162. {
  163. readData(fname);
  164. computeDist();
  165. //maxEpoch = 1;
  166. for(int epoch = 0; epoch<maxEpoch; epoch++)
  167. {
  168. symulacja();
  169. }
  170. for(int i=0; i<maxRows; i++)
  171. {
  172. if(stat[i][0]>0)
  173. {
  174. stat[i][1] /= stat[i][0];
  175. cout << (100*i) << " " << stat[i][1];
  176. }
  177. }
  178. }
  179. void sa_tsp::piszTrase(int* trasa)
  180. {
  181. for(int i=0; i<n; i++)
  182. cout << trasa[i] << " ";
  183. }
  184. int _tmain(int argc, _TCHAR* argv[])
  185. {
  186. sa_tsp problem = sa_tsp();
  187. problem.wczytaj("kroA100.tsp");
  188. cin.clear();
  189. cin.sync();
  190. cin.get();
  191. return 0;
  192. }

comments powered by Disqus