Advertisement
Guest User

Untitled

a guest
Dec 18th, 2014
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.86 KB | None | 0 0
  1. # include "stdafx.h"
  2. # include <iostream>
  3. # include <algorithm>
  4. # include <cstring>
  5. # include <vector>
  6. # include <cmath>
  7. # include <ctime>
  8. # include <iomanip>
  9. # include <fstream>
  10.  
  11. # define dim 100
  12. # define PI 3.14159265359
  13.  
  14. using namespace std;
  15.  
  16. ///////////30////15
  17. bool rast[100][100];// discretizare de 3 zecimale( interval -5.120, 5.120 )
  18. bool rast_urm[100][100];
  19. int lg_rast = 14, deviatie_rast = 5120;
  20. int interval_rast = 10240;
  21. ///////////17/////30
  22. bool gri[100][100]; // discretizare de 2 zecimale( interval -600.00, 600.00 )
  23. bool gri_urm[100][100];
  24. int lg_gri = 17, deviatie_gri = 60000;
  25. int interval_gri = 120000;
  26. /////////17//////30
  27. bool ros[100][100]; // discretizare de 3 zecimale ( interval -2.048, 2.048 )
  28. bool ros_urm[100][100];
  29. int lg_ros = 13, deviatie_ros = 2048;
  30. int interval_ros = 5096;
  31. //////////13/////30
  32. bool six[100][100]; /// discretizare de 4 zecimale ( interval (0.0898,-0.7126)
  33. bool six_urm[100][100];
  34. int lg_six = 13, deviatie_six = 4910;
  35. int interval_six = 8024;
  36.  
  37. float fit[100];
  38. float fit2[100];
  39. int nr_fit2;
  40.  
  41. int rulari, tip;
  42. int t;
  43. int n;
  44.  
  45. float NR, FIT;
  46. float max_NR, max_FIT;
  47.  
  48. int transforma(bool a[100][100], int lin, int lg);
  49. void copie(){
  50.     int i, j;
  51.     if (tip == 1)   {
  52.         for (i = 0; i < 30; i++){
  53.             for (j = 0; j < lg_rast; j++)
  54.                 rast[i][j] = rast_urm[i][j];
  55.             fit[i] = fit2[i];
  56.         }
  57.     }
  58.     else
  59.     if (tip == 2){
  60.         for (i = 0; i < 30; i++){
  61.             for (j = 0; j < lg_gri; j++)
  62.                 gri[i][j] = gri_urm[i][j];
  63.             fit[i] = fit2[i];
  64.         }
  65.     }
  66.     else
  67.     if (tip == 3){
  68.         for (i = 0; i < 30; i++){
  69.             for (j = 0; j < lg_ros; j++)
  70.                 ros[i][j] = ros_urm[i][j];
  71.             fit[i] = fit2[i];
  72.         }
  73.     }
  74.     else
  75.     if (tip == 3){
  76.         for (i = 0; i < 30; i++)
  77.         {
  78.             for (j = 0; j < lg_six; j++)
  79.                 six[i][j] = six_urm[i][j];
  80.             fit[i] = fit2[i];
  81.         }
  82.     }
  83. }
  84. void genereaza(int lg, bool a[100][100]){
  85.     int nr = 0, i, j, k;
  86.     int DIM = 30;
  87.     srand(time(NULL));
  88.     for (i = 0; i < DIM; i++){
  89.         nr = 0;
  90.         for (j = 0; j < lg; j++)
  91.             a[i][j] = rand() % 2;
  92.         //for ( k = 0 ; k < lg ; k++ )
  93.         // cout << a[ i ][ k ];
  94.         //cout << "\n";
  95.     }
  96. }
  97.  
  98. float RASTR(float rezultat){
  99.     int sol = 0;
  100.  
  101.     sol += (rezultat * rezultat) - 10 * cos(float(2 * PI * rezultat) * PI / 180.0);
  102.  
  103.     sol = sol + 10 * 1;
  104.     return sol;
  105. }
  106.  
  107. float GRIEW(float rezultat){
  108.     int nr = 0, i, j, k;
  109.     float rez_maxim = 0;
  110.     float sol = 0;
  111.     float produs = 1;
  112.     float cosinus = 0;
  113.     rezultat = rezultat / 100;
  114.     //printf( "%.3f", rezultat );
  115.     //cout << "\n";
  116.     produs = produs * cos(cosinus * PI / 180);
  117.     cosinus = rezultat / sqrt(float(1));
  118.     sol += (rezultat * rezultat) / 4000;
  119.  
  120.     return sol;
  121. }
  122. float ROS(int rezultat){
  123.     int nr = 0, nr_urm = 0, i, j, k;
  124.     float rezultat_urm = 0;
  125.     float rez_maxim = 0;
  126.     float sol = 0;
  127.  
  128.  
  129.     //rezultat_urm = nr - deviatie_ros;
  130.     //rezultat_urm = rezultat_urm / 1000;
  131.  
  132.     //printf( "%.3f ", rezultat );
  133.     //printf( "%.3f", rezultat_urm );
  134.     //cout << "\n";
  135.     sol += 100 * (rezultat - rezultat * rezultat) * (rezultat - rezultat * rezultat) + (1 - rezultat) * (1 - rezultat);
  136.  
  137.     //printf( "%.3f", sol );
  138.     //cout << "\n";
  139.     //sol = sol + 10 * dim;
  140.     return sol;
  141. }
  142. float SIX(int rezultat){
  143.     int nr = 0, nr2 = 0, i, j, k;
  144.     int pivot, pivot2;
  145.     float rezultat2 = 0;
  146.     float rez_maxim = 0;
  147.     float sol = 0;
  148.  
  149.     {
  150.         srand(time(NULL));
  151.         pivot = rand() % 30;
  152.         srand(time(NULL));
  153.         pivot2 = rand() % 30;
  154.  
  155.         //nr = transforma( six, pivot, lg_six );
  156.         //if ( nr > interval_six )
  157.         //nr = interval_six - ( nr - interval_six );
  158.  
  159.         nr2 = transforma(six, pivot2, lg_six);
  160.         if (nr2 > interval_six)
  161.             nr2 = interval_six - (nr2 - interval_six);
  162.         //cout << nr << "\n";
  163.         //  rezultat =  nr - deviatie_six;
  164.         //rezultat = rezultat / 10000;
  165.  
  166.         rezultat2 = nr2 - deviatie_six;
  167.         rezultat2 = rezultat2 / 10000;
  168.         //printf( "%.3f", rezultat );
  169.         //cout << "\n";
  170.         sol = (4 - 2.1 * rezultat * rezultat + pow(rezultat, float(4 / 3)) * rezultat * rezultat + rezultat * rezultat2 + (-4 + 4 * rezultat2 * rezultat2) * rezultat2 * rezultat2);
  171.     }
  172.     return sol;
  173. }
  174.  
  175. int transforma(bool a[100][100], int lin, int lg){
  176.     int i, nr = 0;
  177.     float putere = 0;
  178.  
  179.     for (i = lg - 1; i >= 0; i--)
  180.     if (a[lin][i]){
  181.         putere = pow(float(2), float(lg - 1 - i));
  182.         nr = nr + putere;
  183.     }
  184.     return nr;
  185.     //cout << nr << "\n";
  186. }
  187.  
  188. void evalueaza(){
  189.     int i;
  190.     int nr = 0;
  191.     float rezultat = 0;
  192.  
  193.     for (i = 0; i < 30; i++){
  194.         if (tip == 1){
  195.             nr = transforma(rast, i, lg_rast);
  196.             if (nr > interval_rast)
  197.                 nr = interval_rast - (nr - interval_rast);
  198.             //cout << nr << "\n";
  199.             rezultat = nr - deviatie_rast;
  200.             rezultat = rezultat / 1000;
  201.             fit[i] = RASTR(rezultat);
  202.             //cout << fit[ i ] << " " << rezultat << "\n";
  203.         }
  204.         else
  205.         if (tip == 2){
  206.             nr = transforma(gri, i, lg_gri);
  207.             //cout << nr << "\n";
  208.             if (nr > interval_gri)
  209.                 nr = interval_gri - (nr - interval_gri);
  210.             //cout << nr << "\n";
  211.             rezultat = nr - deviatie_gri;
  212.             rezultat = rezultat / 100;
  213.             fit[i] = GRIEW(rezultat);
  214.         }
  215.         else
  216.         if (tip == 3){
  217.             nr = transforma(ros, i, lg_ros);
  218.             if (nr > interval_ros)
  219.                 nr = interval_ros - (nr - interval_ros);
  220.             //cout << nr << "\n";
  221.             rezultat = nr - deviatie_ros;
  222.             rezultat = rezultat / 1000;
  223.             fit[i] = ROS(rezultat);
  224.         }
  225.         else
  226.         if (tip == 4){
  227.             nr = transforma(six, i, lg_six);
  228.             if (nr > interval_six)
  229.                 nr = interval_six - (nr - interval_six);
  230.             //cout << nr << "\n";
  231.             rezultat = nr - deviatie_six;
  232.             rezultat = rezultat / 10000;
  233.             //printf( "%.3f", rezultat );
  234.             //cout << "\n";
  235.             fit[i] = SIX(rezultat);
  236.         }
  237.         if (FIT < fit[i]);
  238.         FIT = fit[i], NR = rezultat;
  239.         cout << NR << " " << FIT << "\n";
  240.         max_NR = max(max_NR, NR);
  241.     }
  242.     //cout << NR << " " << FIT << "\n";
  243. }
  244.  
  245. void selecteaza(){
  246.     int i, j;
  247.     int nr1 = 0, nr2 = 0, nr_max = 0;
  248.     nr_fit2 = 0;
  249.     for (i = 0; i < 30; i = i + 2){
  250.         if (tip == 1){
  251.             srand(time(NULL) + i);
  252.             nr1 = rand() % 30;
  253.             srand(time(NULL) - i + 1);
  254.             nr2 = rand() % 30;
  255.             //cout << nr1 << " " << nr2 << "\n";
  256.             nr_max = max(nr1, nr2);
  257.             for (j = 0; j < lg_rast; j++)
  258.                 rast_urm[nr_fit2][j] = rast[nr_max][j];
  259.             fit2[nr_max] = fit[nr_max];
  260.             nr_fit2++;
  261.         }
  262.         else
  263.         if (tip == 2){
  264.             srand(time(NULL) + i);
  265.             nr1 = rand() % 30;
  266.             srand(time(NULL) - i + 1);
  267.             nr2 = rand() % 30;
  268.             //cout << nr1 << " " << nr2 << "\n";
  269.             nr_max = max(nr1, nr2);
  270.             for (j = 0; j < lg_gri; j++)
  271.                 gri_urm[nr_fit2][j] = gri[nr_max][j];
  272.             fit2[nr_max] = fit[nr_max];
  273.             nr_fit2++;
  274.         }
  275.         else
  276.         if (tip == 3){
  277.             srand(time(NULL) + i);
  278.             nr1 = rand() % 30;
  279.             srand(time(NULL) - i + 1);
  280.             nr2 = rand() % 30;
  281.             //cout << nr1 << " " << nr2 << "\n";
  282.             nr_max = max(nr1, nr2);
  283.             for (j = 0; j < lg_ros; j++)
  284.                 gri_urm[nr_fit2][j] = gri[nr_max][j];
  285.             fit2[nr_max] = fit[nr_max];
  286.             nr_fit2++;
  287.         }
  288.         else
  289.         if (tip == 4){
  290.             srand(time(NULL) + i);
  291.             nr1 = rand() % 30;
  292.             srand(time(NULL) - i + 1);
  293.             nr2 = rand() % 30;
  294.             //cout << nr1 << " " << nr2 << "\n";
  295.             nr_max = max(nr1, nr2);
  296.             for (j = 0; j < lg_six; j++)
  297.                 six_urm[nr_fit2][j] = six[nr_max][j];
  298.             fit2[nr_max] = fit[nr_max];
  299.             nr_fit2++;
  300.         }
  301.  
  302.     }
  303. }
  304. void afisare(){
  305.     int i, j;
  306.     for (i = 0; i < 30; i++){
  307.         for (j = 0; j < lg_rast; j++)
  308.             cout << rast[i][j] << "";
  309.         cout << "\n";
  310.     }
  311.     cout << "\n";
  312. }
  313. void recombina(){
  314.     int i, j, nr1, nr2;
  315.     for (i = 15; i < 30; i++){
  316.         if (tip == 1){
  317.             srand(time(NULL) + i);
  318.             nr1 = rand() % 15;
  319.             srand(time(NULL) - i + 1);
  320.             nr2 = rand() % 15;
  321.             for (j = 0; j < lg_rast / 2; j++)
  322.                 rast[i][j] = rast[nr1][j];
  323.             for (j = lg_rast / 2; j < lg_rast; j++)
  324.                 rast[i][j] = rast[nr2][j];
  325.         }
  326.         else
  327.         if (tip == 2){
  328.             srand(time(NULL) + i);
  329.             nr1 = rand() % 15;
  330.             srand(time(NULL) - i + 1);
  331.             nr2 = rand() % 15;
  332.             for (j = 0; j < lg_gri / 2; j++)
  333.                 gri[i][j] = gri[nr1][j];
  334.             for (j = lg_gri / 2; j < lg_gri; j++)
  335.                 gri[i][j] = gri[nr2][j];
  336.         }
  337.         else
  338.         if (tip == 3){
  339.             srand(time(NULL) + i);
  340.             nr1 = rand() % 15;
  341.             srand(time(NULL) - i + 1);
  342.             nr2 = rand() % 15;
  343.             for (j = 0; j < lg_ros / 2; j++)
  344.                 ros[i][j] = ros[nr1][j];
  345.             for (j = lg_ros / 2; j < lg_ros; j++)
  346.                 ros[i][j] = ros[nr2][j];
  347.         }
  348.         else
  349.         if (tip == 4){
  350.             srand(time(NULL) + i);
  351.             nr1 = rand() % 15;
  352.             srand(time(NULL) - i + 1);
  353.             nr2 = rand() % 15;
  354.             for (j = 0; j < lg_six / 2; j++)
  355.                 six[i][j] = six[nr1][j];
  356.             for (j = lg_six / 2; j < lg_six; j++)
  357.                 six[i][j] = six[nr2][j];
  358.         }
  359.     }
  360. }
  361. void mutatie(){
  362.     int mut = 0, i;
  363.     if (tip == 1){
  364.         for (i = 0; i < 30; i++){
  365.             srand(time(NULL) + i);
  366.             mut = rand() % lg_rast;
  367.             if (rast[i][mut] == 0)
  368.                 rast[i][mut] = 1;
  369.             else
  370.                 rast[i][mut] = 0;
  371.         }
  372.     }
  373.     else
  374.     if (tip == 2){
  375.         for (i = 0; i < 30; i++){
  376.             srand(time(NULL) + i);
  377.             mut = rand() % lg_gri;
  378.             if (gri[i][mut] == 0)
  379.                 gri[i][mut] = 1;
  380.             else
  381.                 gri[i][mut] = 0;
  382.         }
  383.     }
  384.     else
  385.     if (tip == 3){
  386.         for (i = 0; i < 30; i++){
  387.             srand(time(NULL) + i);
  388.             mut = rand() % lg_ros;
  389.             if (ros[i][mut] == 0)
  390.                 ros[i][mut] = 1;
  391.             else
  392.                 ros[i][mut] = 0;
  393.         }
  394.     }
  395.     else
  396.     if (tip == 4){
  397.         for (i = 0; i < 30; i++){
  398.             srand(time(NULL) + i);
  399.             mut = rand() % lg_six;
  400.             if (six[i][mut] == 0)
  401.                 six[i][mut] = 1;
  402.             else
  403.                 six[i][mut] = 0;
  404.         }
  405.     }
  406. }
  407. int main(){
  408.     cout << "Introduceti numarul generatiei pana la cat va rula algoritmul genetic:";
  409.     cin >> n;
  410.     cout << "Pentru care tip de functie doriti sa aplicati algoritmul?" << "\n";
  411.     cout << "1. Rastrigin's function." << "\n";
  412.     cout << "2. Griewangk's function." << "\n";
  413.     cout << "3. Rosenbrock's valley" << "\n";
  414.     cout << "4. Six-hump camel back" << "\n";
  415.     cout << "Alegeti:";
  416.     cin >> tip;
  417.     t = 0;
  418.     if (tip == 1)
  419.         genereaza(lg_rast, rast);
  420.     if (tip == 2)
  421.         genereaza(lg_gri, gri);
  422.     if (tip == 3)
  423.         genereaza(lg_ros, ros);
  424.     if (tip == 4)
  425.         genereaza(lg_six, six);
  426.     evalueaza();
  427.     while (t < n){
  428.         t++;
  429.         selecteaza();
  430.         copie();
  431.         recombina();
  432.         //afisare();
  433.         mutatie();
  434.         evalueaza();
  435.         //afisare();
  436.     }
  437.     cout << max_NR;
  438.     return 0;
  439. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement