Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.73 KB | None | 0 0
  1. // cw4_EULER2.cpp : Defines the entry point for the console application.
  2. #include "stdafx.h"
  3. #include <iostream>
  4. #include <cstdlib>
  5. #include <fstream>
  6. #include <sstream>
  7. #include <string>
  8. #include <chrono>
  9. #include <conio.h>
  10. #include <algorithm>
  11. #include <stdlib.h>
  12. #include<stdio.h>
  13. using namespace std;
  14.  
  15. //--------------------------------------------------------------------ZAPIS DO PLIKU--------------------------------------------------------------------
  16. int saveArrayWyniki(double *wyniki[], int start, int krok, int liczbaPomiarow)
  17. {
  18. fstream plik("plik-wyniki.txt", ios::out);
  19. if (plik.good())
  20. {
  21. plik << "wierzcholki \tDYNAMICZNE \tDOKLADNE \tZACHLANNE" << endl;
  22. for (int i = 0; i < liczbaPomiarow; i++)
  23. {
  24. plik << start << "\t";
  25. for (int j = 0; j < 3; j++)
  26. {
  27. plik << wyniki[j][i] << "\t";
  28. plik.flush();
  29. }
  30. start += krok;
  31. plik << endl;
  32. }
  33. plik.close();
  34. }
  35. return(0);
  36. }
  37. //--------------------------------------------------------------------DYNAMICZNE--------------------------------------------------------------------
  38.  
  39. int max(int a, int b) { return (a > b) ? a : b; }
  40.  
  41. // Returns the maximum value that can be put in a dynamic of capacity W
  42. int dynamic(int W, int wt[], int val[], int n)
  43. {
  44. int i, w;
  45. int **K = new int*[n + 1];
  46. for (int m = 0; m < n + 1; m++) {
  47. K[m] = new int[W + 1];
  48. }
  49.  
  50. // Build table K[][] in bottom up manner
  51. for (i = 0; i <= n; i++)
  52. {
  53. for (w = 0; w <= W; w++)
  54. {
  55. if (i == 0 || w == 0)
  56. K[i][w] = 0;
  57. else if (wt[i - 1] <= w)
  58. K[i][w] = max(val[i - 1] + K[i - 1][w - wt[i - 1]], K[i - 1][w]);
  59. else
  60. K[i][w] = K[i - 1][w];
  61. }
  62. }
  63.  
  64. return K[n][W];
  65. }
  66.  
  67. //--------------------------------------------------------------------DOKLADNE--------------------------------------------------------------------
  68.  
  69. // Returns the maximum value that can be put in a brutforce of capacity W
  70. int brutforce(int W, int wt[], int val[], int n)
  71. {
  72. // Base Case
  73. if (n == 0 || W == 0)
  74. return 0;
  75.  
  76. // If weight of the nth item is more than brutforce capacity W, then
  77. // this item cannot be included in the optimal solution
  78. if (wt[n - 1] > W)
  79. return brutforce(W, wt, val, n - 1);
  80.  
  81. // Return the maximum of two cases:
  82. // (1) nth item included
  83. // (2) not included
  84. else return max(val[n - 1] + brutforce(W - wt[n - 1], wt, val, n - 1),
  85. brutforce(W, wt, val, n - 1)
  86. );
  87. }
  88.  
  89. //--------------------------------------------------------------------ZACHLANNE--------------------------------------------------------------------
  90. struct przedmiot
  91. {
  92. int waga;
  93. int wartosc;
  94. double stosunek;
  95. };
  96.  
  97. int compare2(const void * a, const void * b)
  98. {
  99.  
  100. przedmiot *orderA = (przedmiot *)a;
  101. przedmiot *orderB = (przedmiot *)b;
  102.  
  103. if (orderB->stosunek > orderA->stosunek)
  104. {
  105. return 1;
  106. }
  107. else if (orderB->stosunek < orderA->stosunek)
  108. {
  109. return -1;
  110. }
  111. else
  112. {
  113. return 0;
  114. }
  115. }
  116.  
  117. int zachlanny(int W, int w[], int p[], int n, int sum = 0, int waga = 0)
  118. {
  119. int i;
  120. przedmiot *przedmioty = nullptr;
  121. przedmioty = new przedmiot[n];
  122. for (i = 0; i < n; i++)
  123. {
  124. //cout << p[i] << " " << w[i] << endl;
  125. przedmioty[i].stosunek = (double)p[i] / w[i];
  126. //cout << "przedmioty[i].stosunek to: " << przedmioty[i].stosunek << endl;
  127. przedmioty[i].waga = w[i];
  128. przedmioty[i].wartosc = p[i];
  129. }
  130.  
  131. qsort(przedmioty, n, sizeof(przedmiot), compare2);
  132. int a = 0;
  133. while (waga <= W && a < n)
  134. {
  135. if (waga + przedmioty[a].waga <= W)
  136. {
  137. waga += przedmioty[a].waga;
  138. sum += przedmioty[a].wartosc;
  139. }
  140. a++;
  141. }
  142. delete[] przedmioty;
  143. //cout << "Zachlanny: " << sum << endl; //usuniete za ostatnim razem
  144. return 0;
  145. }
  146.  
  147.  
  148. //--------------------------------------------------------------------MAIN FUNCTION--------------------------------------------------------------------
  149.  
  150. int compare(const void * a, const void * b)
  151. {
  152. return (*(int*)a - *(int*)b);
  153. }
  154.  
  155. int main()
  156. {
  157. //printf_s("%lf",nasycenie[1]);
  158. int liczbaPomiarow = 10;
  159. int liczbaPowtorzen = 1;
  160. int startNode = 50;
  161. int krok = 50;
  162.  
  163.  
  164. double **wyniki = new double*[3];
  165. for (int i = 0; i < 3; i++)
  166. wyniki[i] = new double[liczbaPomiarow];
  167.  
  168. int pojemnosc = startNode;
  169.  
  170. for (int petlaPomiaru = 0; petlaPomiaru < liczbaPomiarow; petlaPomiaru++)
  171. {
  172. int liczbaWyrazow = pojemnosc / 2 + 1;
  173. int maxWaga = pojemnosc / 2 + 1;
  174. int maxWartosc = pojemnosc / 2 + 1;
  175.  
  176.  
  177. int *weight = new int[liczbaWyrazow];
  178. int *volume = new int[liczbaWyrazow];
  179. srand(time(0));
  180. double sumaPom[3] = { 0 };
  181. for (int petlaPowtorzen = 0; petlaPowtorzen < liczbaPowtorzen; petlaPowtorzen++)
  182. {
  183. for (int i = 0; i < liczbaWyrazow; i++)
  184. {
  185. weight[i] = rand() % maxWaga + 1;
  186. volume[i] = rand() % maxWartosc + 1;
  187. }
  188. qsort(weight, liczbaWyrazow, sizeof(int), compare);
  189.  
  190. auto startTime = std::chrono::high_resolution_clock::now();
  191. dynamic(pojemnosc, weight, volume, liczbaWyrazow);
  192. auto finish = std::chrono::high_resolution_clock::now();
  193. sumaPom[0] = ((finish - startTime).count());
  194.  
  195. startTime = std::chrono::high_resolution_clock::now();
  196. brutforce(pojemnosc, weight, volume, liczbaWyrazow);
  197. finish = std::chrono::high_resolution_clock::now();
  198. sumaPom[1] = ((finish - startTime).count());
  199.  
  200. startTime = std::chrono::high_resolution_clock::now();
  201. zachlanny(pojemnosc, weight, volume, liczbaWyrazow);
  202. finish = std::chrono::high_resolution_clock::now();
  203. sumaPom[2] = ((finish - startTime).count());
  204.  
  205. delete[] weight;
  206. delete[] volume;
  207. }
  208.  
  209. for (int k = 0; k < 3; k++)
  210. {
  211. wyniki[k][petlaPomiaru] = sumaPom[k] / liczbaPowtorzen;
  212. cout << wyniki[k][petlaPomiaru] << "\t";
  213.  
  214. }
  215. cout << endl;
  216. pojemnosc += krok;
  217.  
  218. }
  219.  
  220. saveArrayWyniki(wyniki, startNode, krok, liczbaPomiarow);
  221. return 0;
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement