Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.34 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <ctime>
  4. #include <cstdlib>
  5. #include <search.h>
  6. #include <windows.h>
  7. #include <algorithm>
  8.  
  9. using namespace std;
  10.  
  11. const int n = 500;
  12.  
  13. class zadanie{
  14.  
  15. public:
  16.     double nczas, liniowy, prog, d;
  17.  
  18.     void wylosuj(int n)                             //losowanie wartosci dla zadania z przedzialow
  19.     {
  20.         nczas = ((11.0)*(double)rand()/RAND_MAX) + 10;
  21.         liniowy = ((10.0)*(double)rand()/RAND_MAX) + 1;
  22.         prog = (((5.0)*(double)rand()/RAND_MAX) + 1) * 0.1 *n;
  23.         d = (((nczas + liniowy*n)*(double)rand()/RAND_MAX) + nczas/n) * 0.25;
  24.     }
  25. };
  26.  
  27. int compare(const void *arg1, const void *arg2)     //funkcja porownujaca do qsorta
  28. {
  29.     zadanie *z1 = (zadanie*) arg1;
  30.     zadanie *z2 = (zadanie*) arg2;
  31.     return (int)(z1->d - z2->d);
  32. }
  33.  
  34. double GetTime()                                    //funkcja mierzaca czas
  35. {
  36.   long long f,t;
  37.   QueryPerformanceFrequency((PLARGE_INTEGER)&f);
  38.   QueryPerformanceCounter((PLARGE_INTEGER)&t);
  39.   return (double)t/(double)f;
  40. }
  41.  
  42. void main()
  43. {
  44.     int instancje=50;
  45.     double czas=0;
  46.     double srednia=0;
  47.  
  48.     srand(time(0));                             //aby losowane liczby losowane byly rozne przy
  49.     zadanie x[n];                               //kazdym dzialaniu programu
  50.     for(int i=0; i<n; i++)
  51.     {
  52.         x[i].wylosuj(n);                        //wypelnianie tabeli klasy zadanie
  53.     }
  54.  
  55.     for(int i=0; i<instancje; i++)              //mierzenie czasu dla liczby instancji
  56.     {
  57.         double t1=GetTime();
  58.         qsort(x, n, sizeof(zadanie), compare);  //sortowanie po niemalejacym elemencie d
  59.         double t2=GetTime();
  60.         czas=t2-t1;
  61.         srednia=srednia+czas;
  62.     }
  63.     cout<<"Sredni czas EDD: "<<srednia/instancje<<"s"<<endl;
  64.  
  65.     double p[n];
  66.     double c[n];
  67.  
  68.     //Algorytm Moore'a
  69.     double temp=0;
  70.     double czasmax=0;
  71.     int i_opoznione=0;
  72.     double ostatni=-1;
  73.     zadanie opoznione;
  74.  
  75.     czas=0;
  76.     srednia=0;
  77.     /*
  78.     for(int i=0; i<instancje; i++)
  79.     {
  80.         double t3=GetTime();
  81.        
  82.         //w petli for dodatkowy warunek, aby po dojsciu do wczesniej przeniesionego zadania
  83.         //zakonczyc prace algorytmu
  84.         for(int i=0; i<n && x[i].nczas!=ostatni; i++)
  85.         {
  86.             if(i-x[i].prog>0) p[i]=x[i].nczas + (x[i].liniowy*(i-x[i].prog));
  87.             else p[i]=x[i].nczas;                   //czas wykonania kolejnego zadania
  88.             c[i] = p[i] + temp;                    
  89.             temp = c[i];
  90.             //tablica c zawiera kolejne czasy kolejno zakonczonych zadan
  91.  
  92.             if(c[i]>x[i].d)                         //gdy C>d wez zadanie
  93.             {
  94.                 for(int j=0; j<i; j++)
  95.                 {
  96.                     if(x[j].nczas>czasmax)
  97.                     {
  98.                         czasmax=x[j].nczas; //...znajdz najwieksze a z przedzialu [1,zadanie]  
  99.                         i_opoznione=j;
  100.                     }
  101.                 }
  102.                 opoznione=x[i_opoznione];
  103.                 for(int j=i_opoznione; j<n-1; j++)  //przenies je na koniec
  104.                 {
  105.                     x[j]=x[j+1];            //reszte przenies
  106.                 }
  107.                 x[n-1]=opoznione;
  108.  
  109.                 if(ostatni==-1)             //warunek, ktory pomoze zakonczyc algorytm
  110.                 {
  111.                     ostatni=x[n-1].nczas;
  112.                 }
  113.             }
  114.         }
  115.         double t4=GetTime();
  116.         czas=t4-t3;                         //sredni czas dla odpowiedniej liczby instancji
  117.         srednia=srednia+czas;
  118.     }
  119.     cout << "Sredni czas  MA: " << srednia/instancje <<"s"<<endl;
  120.     */
  121.    
  122.     //NEH
  123.     int il_opoz=0;
  124.     int naj_opoz=0;
  125.     zadanie y[n];
  126.     zadanie pom[n];
  127.     zadanie last;
  128.     y[0]=x[0];
  129.     for(int i=0; i<instancje; i++)          //petla wykonujaca ilosc instancji
  130.     {
  131.         double t3=GetTime();
  132.    
  133.         for(int j=1; j<n; j++)          //dodawanie kolejnego zadania
  134.         {
  135.             y[j]=x[j];
  136.             for(int k=j; k>0; k--)      //przesuwanie ostatniego elementu w lewa strone o jeden element
  137.             {
  138.                 for(int i=0; i<n; i++)  //liczenie opoznien
  139.                 {
  140.                     if(i-y[i].prog>0) p[i]=y[i].nczas + (y[i].liniowy*(i-y[i].prog));
  141.                     else p[i]=y[i].nczas;                   //czas wykonania kolejnego zadania
  142.                     c[i] = p[i] + temp;                    
  143.                     temp = c[i];
  144.                     //tablica c zawiera kolejne czasy kolejno zakonczonych zadan
  145.  
  146.                     if(c[i]>y[i].d) il_opoz++;
  147.                 }
  148.                 if(il_opoz<naj_opoz)    //jezeli nowe szeregowanie ma mniej opoznien przepisz je do tablicy pomocniczej
  149.                 {
  150.                     naj_opoz=il_opoz;
  151.                     for(int m=0; m<j; m++)
  152.                     {
  153.                         pom[m]=y[m];
  154.                     }
  155.                 }
  156.                 last=y[k];      //przesuniecie elementu o jedna pozycje w lewo
  157.                 y[k]=y[k-1];
  158.                 y[k-1]=last;
  159.             }
  160.             naj_opoz=j;         //ustawienie maksymalnej liczby opoznien dla przebiegu po zwiekszeniu liczby elementow
  161.             il_opoz=0;
  162.         }
  163.         for(int i=0; i<n; i++) x[i]=pom[i]; //przepisanie najlepszego szeregowania do tablicy pierwotnej
  164.         double t4=GetTime();
  165.         czas=t4-t3;                         //sredni czas dla odpowiedniej liczby instancji
  166.         srednia=srednia+czas;
  167.     }
  168.     cout << "Sredni czas  NEH: " << srednia/instancje <<"s"<<endl;
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement