Advertisement
Guest User

Untitled

a guest
May 27th, 2015
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <algorithm>
  4. #include <queue>
  5. #include <climits>
  6. #include<stdlib.h>
  7. #include<time.h>
  8.  
  9.  
  10.  
  11. using namespace std;
  12.  
  13. struct problem_INSA
  14. {
  15. int maszyna;
  16. int proces;
  17. int poprzednik_technologiczny;
  18. int nastepnik_technologiczny;
  19. int poprzednik_maszynowy;
  20. int nastepnik_maszynowy;
  21. int R;
  22. int Q;
  23. bool flaga_check;
  24.  
  25. problem_INSA () : maszyna(), proces(), poprzednik_technologiczny(), nastepnik_technologiczny(), poprzednik_maszynowy(), nastepnik_maszynowy(), R(), Q(), flaga_check(false) {};
  26. };
  27.  
  28. problem_INSA* problem;
  29.  
  30. queue<int> kolejka;
  31.  
  32. bool max_z_procesow(int a, int b) {
  33. return (problem[a].proces > problem[b].proces);
  34. }
  35.  
  36. int main()
  37. {
  38. ifstream wejscie;
  39. ofstream wyjscie1, wyjscie2;
  40.  
  41. wejscie.open("bench_js.txt");
  42. wyjscie1.open("wyjscie1.txt");
  43. wyjscie2.open("wyjscie2.txt");
  44.  
  45. unsigned int ile;
  46. wejscie >> ile;
  47.  
  48. for (int hh = 1; hh <= ile; hh++)
  49. {
  50. string nazwa;
  51.  
  52. int zadan, maszyn, wymiar_danych, maszyn_kopia, T = 0;
  53.  
  54. wejscie >> nazwa >> zadan >> maszyn;
  55.  
  56. wymiar_danych = zadan * maszyn;
  57. maszyn_kopia = maszyn;
  58.  
  59. zadan++;
  60. maszyn++;
  61. wymiar_danych++;
  62.  
  63. problem = new problem_INSA[wymiar_danych];
  64. int* pomoc = new int[wymiar_danych];
  65. int* maszynaproces = new int[maszyn];
  66.  
  67. for (int i = 0; i < maszyn; i++)
  68. {
  69. maszynaproces[i] = 0;
  70. }
  71.  
  72. pomoc[0] = 0;
  73.  
  74. int k = 1;
  75.  
  76. for (int i = 1; i < zadan; i++)
  77. {
  78.  
  79. for (int j = 1; j < maszyn_kopia; j++)
  80. {
  81. wejscie >> problem[k].maszyna;
  82. wejscie >> problem[k].proces;
  83.  
  84. problem[k].nastepnik_technologiczny = k + 1;
  85.  
  86. if (j != 1)
  87. {
  88. problem[k].poprzednik_technologiczny = k - 1;
  89. }
  90.  
  91. pomoc[k] = k;
  92. k++;
  93. }
  94.  
  95. wejscie >> problem[k].maszyna;
  96. wejscie >> problem[k].proces;
  97.  
  98. problem[k].poprzednik_technologiczny = k - 1;
  99. pomoc[k] = k;
  100. k++;
  101.  
  102. for (int j = 0; j <maszyn_kopia; j++)
  103. {
  104. problem[(i - 1) * maszyn_kopia + j + 1].R = problem[problem[(i - 1) * maszyn_kopia + j + 1].poprzednik_technologiczny].R + problem[(i - 1) * maszyn_kopia + j + 1].proces;
  105. problem[i * maszyn_kopia - j].Q = problem[problem[i * maszyn_kopia - j].nastepnik_technologiczny].Q + problem[i * maszyn_kopia - j].proces;
  106. }
  107. }
  108.  
  109. int pozycja;
  110. int punkt_docelowy_optymalny = INT_MAX;
  111. int punkt_docelowy;
  112. int wskazana_pozycja;
  113.  
  114. stable_sort(pomoc, pomoc+wymiar_danych, max_z_procesow);
  115.  
  116. for (int i = 0; i < wymiar_danych; i++)
  117. {
  118. punkt_docelowy_optymalny = INT_MAX;
  119. wskazana_pozycja = maszynaproces[problem[pomoc[i]].maszyna];
  120.  
  121. if (wskazana_pozycja == 0)
  122. {
  123. maszynaproces[problem[pomoc[i]].maszyna] = pomoc[i];
  124. problem[pomoc[i]].flaga_check = true;
  125. }
  126. else
  127. {
  128. punkt_docelowy_optymalny = problem[problem[pomoc[i]].poprzednik_technologiczny].R + max(problem[problem[pomoc[i]].nastepnik_technologiczny].Q, problem[wskazana_pozycja].Q);
  129. pozycja = 0;
  130. }
  131.  
  132. while (wskazana_pozycja != 0)
  133. {
  134. punkt_docelowy = max(problem[problem[pomoc[i]].poprzednik_technologiczny].R, problem[wskazana_pozycja].R) + max(problem[problem[pomoc[i]].nastepnik_technologiczny].Q, problem[problem[wskazana_pozycja].nastepnik_maszynowy].Q);
  135.  
  136. if (punkt_docelowy < punkt_docelowy_optymalny)
  137. {
  138. punkt_docelowy_optymalny = punkt_docelowy;
  139. pozycja = wskazana_pozycja;
  140. }
  141.  
  142. wskazana_pozycja = problem[wskazana_pozycja].nastepnik_maszynowy;
  143. }
  144.  
  145. if (!problem[pomoc[i]].flaga_check)
  146. {
  147. if (pozycja == 0)
  148. {
  149. problem[maszynaproces[problem[pomoc[i]].maszyna]].poprzednik_maszynowy = pomoc[i];
  150. problem[pomoc[i]].nastepnik_maszynowy = maszynaproces[problem[pomoc[i]].maszyna];
  151. maszynaproces[problem[pomoc[i]].maszyna] = pomoc[i];
  152. problem[pomoc[i]].flaga_check = true;
  153. }
  154. else
  155. {
  156. problem[pomoc[i]].nastepnik_maszynowy = problem[pozycja].nastepnik_maszynowy;
  157. problem[pomoc[i]].poprzednik_maszynowy = pozycja;
  158. problem[problem[pozycja].nastepnik_maszynowy].poprzednik_maszynowy = pomoc[i];
  159. problem[pozycja].nastepnik_maszynowy = pomoc[i];
  160. problem[pomoc[i]].flaga_check = true;
  161. }
  162. }
  163.  
  164. problem[0].nastepnik_maszynowy = 0;
  165. problem[0].poprzednik_maszynowy = 0;
  166.  
  167. int Gtmp, popt;
  168. bool first = true;
  169.  
  170. kolejka.push(pomoc[i]);
  171.  
  172. while(!kolejka.empty())
  173. {
  174. Gtmp = kolejka.front();
  175. kolejka.pop();
  176. popt = problem[Gtmp].R;
  177. problem[Gtmp].R = max(problem[problem[Gtmp].poprzednik_technologiczny].R, problem[problem[Gtmp].poprzednik_maszynowy].R) + problem[Gtmp].proces;
  178.  
  179. if (first || popt != problem[Gtmp].R)
  180. {
  181. if (problem[Gtmp].nastepnik_maszynowy != 0)
  182. {
  183. kolejka.push(problem[Gtmp].nastepnik_maszynowy);
  184. }
  185.  
  186. if (problem[Gtmp].nastepnik_technologiczny != 0)
  187. {
  188. kolejka.push(problem[Gtmp].nastepnik_technologiczny);
  189. }
  190. }
  191.  
  192. first = false;
  193. }
  194.  
  195.  
  196. kolejka.push(pomoc[i]);
  197. first = true;
  198.  
  199. while(!kolejka.empty())
  200. {
  201. Gtmp = kolejka.front();
  202. kolejka.pop();
  203. popt = problem[Gtmp].Q;
  204. problem[Gtmp].Q = max(problem[problem[Gtmp].nastepnik_technologiczny].Q, problem[problem[Gtmp].nastepnik_maszynowy].Q) + problem[Gtmp].proces;
  205.  
  206. if (first || popt != problem[Gtmp].Q)
  207. {
  208. if (problem[Gtmp].poprzednik_maszynowy != 0)
  209. {
  210. kolejka.push(problem[Gtmp].poprzednik_maszynowy);
  211. }
  212.  
  213. if (problem[Gtmp].poprzednik_technologiczny != 0)
  214. {
  215. kolejka.push(problem[Gtmp].poprzednik_technologiczny);
  216. }
  217. }
  218.  
  219. first = false;
  220. }
  221. }
  222.  
  223. int tmp;
  224.  
  225. for (int i = 1; i < maszyn;i++)
  226. {
  227. int jj = maszynaproces[i];
  228.  
  229. while (jj != 0)
  230. {
  231. tmp = problem[jj].R+problem[jj].Q - problem[jj].proces;
  232.  
  233. wyjscie1 << jj << " ";
  234.  
  235. if (T < tmp)
  236. {
  237. T = tmp;
  238. }
  239.  
  240. jj = problem[jj].nastepnik_maszynowy;
  241. }
  242.  
  243. wyjscie1 << endl;
  244. }
  245.  
  246. wyjscie2 << nazwa << " " << T << endl;
  247. }
  248.  
  249.  
  250. wejscie.close();
  251. wyjscie1.close();
  252. wyjscie2.close();
  253. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement