Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # include "stdafx.h"
- # include <iostream>
- # include <algorithm>
- # include <cstring>
- # include <vector>
- # include <cmath>
- # include <ctime>
- # include <iomanip>
- # include <fstream>
- # define dim 100
- # define PI 3.14159265359
- using namespace std;
- ///////////30////15
- bool rast[100][100];// discretizare de 3 zecimale( interval -5.120, 5.120 )
- bool rast_urm[100][100];
- int lg_rast = 14, deviatie_rast = 5120;
- int interval_rast = 10240;
- ///////////17/////30
- bool gri[100][100]; // discretizare de 2 zecimale( interval -600.00, 600.00 )
- bool gri_urm[100][100];
- int lg_gri = 17, deviatie_gri = 60000;
- int interval_gri = 120000;
- /////////17//////30
- bool ros[100][100]; // discretizare de 3 zecimale ( interval -2.048, 2.048 )
- bool ros_urm[100][100];
- int lg_ros = 13, deviatie_ros = 2048;
- int interval_ros = 5096;
- //////////13/////30
- bool six[100][100]; /// discretizare de 4 zecimale ( interval (0.0898,-0.7126)
- bool six_urm[100][100];
- int lg_six = 13, deviatie_six = 4910;
- int interval_six = 8024;
- float fit[100];
- float fit2[100];
- int nr_fit2;
- int rulari, tip;
- int t;
- int n;
- float NR, FIT;
- float max_NR, max_FIT;
- int transforma(bool a[100][100], int lin, int lg);
- void copie(){
- int i, j;
- if (tip == 1) {
- for (i = 0; i < 30; i++){
- for (j = 0; j < lg_rast; j++)
- rast[i][j] = rast_urm[i][j];
- fit[i] = fit2[i];
- }
- }
- else
- if (tip == 2){
- for (i = 0; i < 30; i++){
- for (j = 0; j < lg_gri; j++)
- gri[i][j] = gri_urm[i][j];
- fit[i] = fit2[i];
- }
- }
- else
- if (tip == 3){
- for (i = 0; i < 30; i++){
- for (j = 0; j < lg_ros; j++)
- ros[i][j] = ros_urm[i][j];
- fit[i] = fit2[i];
- }
- }
- else
- if (tip == 3){
- for (i = 0; i < 30; i++)
- {
- for (j = 0; j < lg_six; j++)
- six[i][j] = six_urm[i][j];
- fit[i] = fit2[i];
- }
- }
- }
- void genereaza(int lg, bool a[100][100]){
- int nr = 0, i, j, k;
- int DIM = 30;
- srand(time(NULL));
- for (i = 0; i < DIM; i++){
- nr = 0;
- for (j = 0; j < lg; j++)
- a[i][j] = rand() % 2;
- //for ( k = 0 ; k < lg ; k++ )
- // cout << a[ i ][ k ];
- //cout << "\n";
- }
- }
- float RASTR(float rezultat){
- int sol = 0;
- sol += (rezultat * rezultat) - 10 * cos(float(2 * PI * rezultat) * PI / 180.0);
- sol = sol + 10 * 1;
- return sol;
- }
- float GRIEW(float rezultat){
- int nr = 0, i, j, k;
- float rez_maxim = 0;
- float sol = 0;
- float produs = 1;
- float cosinus = 0;
- rezultat = rezultat / 100;
- //printf( "%.3f", rezultat );
- //cout << "\n";
- produs = produs * cos(cosinus * PI / 180);
- cosinus = rezultat / sqrt(float(1));
- sol += (rezultat * rezultat) / 4000;
- return sol;
- }
- float ROS(int rezultat){
- int nr = 0, nr_urm = 0, i, j, k;
- float rezultat_urm = 0;
- float rez_maxim = 0;
- float sol = 0;
- //rezultat_urm = nr - deviatie_ros;
- //rezultat_urm = rezultat_urm / 1000;
- //printf( "%.3f ", rezultat );
- //printf( "%.3f", rezultat_urm );
- //cout << "\n";
- sol += 100 * (rezultat - rezultat * rezultat) * (rezultat - rezultat * rezultat) + (1 - rezultat) * (1 - rezultat);
- //printf( "%.3f", sol );
- //cout << "\n";
- //sol = sol + 10 * dim;
- return sol;
- }
- float SIX(int rezultat){
- int nr = 0, nr2 = 0, i, j, k;
- int pivot, pivot2;
- float rezultat2 = 0;
- float rez_maxim = 0;
- float sol = 0;
- {
- srand(time(NULL));
- pivot = rand() % 30;
- srand(time(NULL));
- pivot2 = rand() % 30;
- //nr = transforma( six, pivot, lg_six );
- //if ( nr > interval_six )
- //nr = interval_six - ( nr - interval_six );
- nr2 = transforma(six, pivot2, lg_six);
- if (nr2 > interval_six)
- nr2 = interval_six - (nr2 - interval_six);
- //cout << nr << "\n";
- // rezultat = nr - deviatie_six;
- //rezultat = rezultat / 10000;
- rezultat2 = nr2 - deviatie_six;
- rezultat2 = rezultat2 / 10000;
- //printf( "%.3f", rezultat );
- //cout << "\n";
- sol = (4 - 2.1 * rezultat * rezultat + pow(rezultat, float(4 / 3)) * rezultat * rezultat + rezultat * rezultat2 + (-4 + 4 * rezultat2 * rezultat2) * rezultat2 * rezultat2);
- }
- return sol;
- }
- int transforma(bool a[100][100], int lin, int lg){
- int i, nr = 0;
- float putere = 0;
- for (i = lg - 1; i >= 0; i--)
- if (a[lin][i]){
- putere = pow(float(2), float(lg - 1 - i));
- nr = nr + putere;
- }
- return nr;
- //cout << nr << "\n";
- }
- void evalueaza(){
- int i;
- int nr = 0;
- float rezultat = 0;
- for (i = 0; i < 30; i++){
- if (tip == 1){
- nr = transforma(rast, i, lg_rast);
- if (nr > interval_rast)
- nr = interval_rast - (nr - interval_rast);
- //cout << nr << "\n";
- rezultat = nr - deviatie_rast;
- rezultat = rezultat / 1000;
- fit[i] = RASTR(rezultat);
- //cout << fit[ i ] << " " << rezultat << "\n";
- }
- else
- if (tip == 2){
- nr = transforma(gri, i, lg_gri);
- //cout << nr << "\n";
- if (nr > interval_gri)
- nr = interval_gri - (nr - interval_gri);
- //cout << nr << "\n";
- rezultat = nr - deviatie_gri;
- rezultat = rezultat / 100;
- fit[i] = GRIEW(rezultat);
- }
- else
- if (tip == 3){
- nr = transforma(ros, i, lg_ros);
- if (nr > interval_ros)
- nr = interval_ros - (nr - interval_ros);
- //cout << nr << "\n";
- rezultat = nr - deviatie_ros;
- rezultat = rezultat / 1000;
- fit[i] = ROS(rezultat);
- }
- else
- if (tip == 4){
- nr = transforma(six, i, lg_six);
- if (nr > interval_six)
- nr = interval_six - (nr - interval_six);
- //cout << nr << "\n";
- rezultat = nr - deviatie_six;
- rezultat = rezultat / 10000;
- //printf( "%.3f", rezultat );
- //cout << "\n";
- fit[i] = SIX(rezultat);
- }
- if (FIT < fit[i]);
- FIT = fit[i], NR = rezultat;
- cout << NR << " " << FIT << "\n";
- max_NR = max(max_NR, NR);
- }
- //cout << NR << " " << FIT << "\n";
- }
- void selecteaza(){
- int i, j;
- int nr1 = 0, nr2 = 0, nr_max = 0;
- nr_fit2 = 0;
- for (i = 0; i < 30; i = i + 2){
- if (tip == 1){
- srand(time(NULL) + i);
- nr1 = rand() % 30;
- srand(time(NULL) - i + 1);
- nr2 = rand() % 30;
- //cout << nr1 << " " << nr2 << "\n";
- nr_max = max(nr1, nr2);
- for (j = 0; j < lg_rast; j++)
- rast_urm[nr_fit2][j] = rast[nr_max][j];
- fit2[nr_max] = fit[nr_max];
- nr_fit2++;
- }
- else
- if (tip == 2){
- srand(time(NULL) + i);
- nr1 = rand() % 30;
- srand(time(NULL) - i + 1);
- nr2 = rand() % 30;
- //cout << nr1 << " " << nr2 << "\n";
- nr_max = max(nr1, nr2);
- for (j = 0; j < lg_gri; j++)
- gri_urm[nr_fit2][j] = gri[nr_max][j];
- fit2[nr_max] = fit[nr_max];
- nr_fit2++;
- }
- else
- if (tip == 3){
- srand(time(NULL) + i);
- nr1 = rand() % 30;
- srand(time(NULL) - i + 1);
- nr2 = rand() % 30;
- //cout << nr1 << " " << nr2 << "\n";
- nr_max = max(nr1, nr2);
- for (j = 0; j < lg_ros; j++)
- gri_urm[nr_fit2][j] = gri[nr_max][j];
- fit2[nr_max] = fit[nr_max];
- nr_fit2++;
- }
- else
- if (tip == 4){
- srand(time(NULL) + i);
- nr1 = rand() % 30;
- srand(time(NULL) - i + 1);
- nr2 = rand() % 30;
- //cout << nr1 << " " << nr2 << "\n";
- nr_max = max(nr1, nr2);
- for (j = 0; j < lg_six; j++)
- six_urm[nr_fit2][j] = six[nr_max][j];
- fit2[nr_max] = fit[nr_max];
- nr_fit2++;
- }
- }
- }
- void afisare(){
- int i, j;
- for (i = 0; i < 30; i++){
- for (j = 0; j < lg_rast; j++)
- cout << rast[i][j] << "";
- cout << "\n";
- }
- cout << "\n";
- }
- void recombina(){
- int i, j, nr1, nr2;
- for (i = 15; i < 30; i++){
- if (tip == 1){
- srand(time(NULL) + i);
- nr1 = rand() % 15;
- srand(time(NULL) - i + 1);
- nr2 = rand() % 15;
- for (j = 0; j < lg_rast / 2; j++)
- rast[i][j] = rast[nr1][j];
- for (j = lg_rast / 2; j < lg_rast; j++)
- rast[i][j] = rast[nr2][j];
- }
- else
- if (tip == 2){
- srand(time(NULL) + i);
- nr1 = rand() % 15;
- srand(time(NULL) - i + 1);
- nr2 = rand() % 15;
- for (j = 0; j < lg_gri / 2; j++)
- gri[i][j] = gri[nr1][j];
- for (j = lg_gri / 2; j < lg_gri; j++)
- gri[i][j] = gri[nr2][j];
- }
- else
- if (tip == 3){
- srand(time(NULL) + i);
- nr1 = rand() % 15;
- srand(time(NULL) - i + 1);
- nr2 = rand() % 15;
- for (j = 0; j < lg_ros / 2; j++)
- ros[i][j] = ros[nr1][j];
- for (j = lg_ros / 2; j < lg_ros; j++)
- ros[i][j] = ros[nr2][j];
- }
- else
- if (tip == 4){
- srand(time(NULL) + i);
- nr1 = rand() % 15;
- srand(time(NULL) - i + 1);
- nr2 = rand() % 15;
- for (j = 0; j < lg_six / 2; j++)
- six[i][j] = six[nr1][j];
- for (j = lg_six / 2; j < lg_six; j++)
- six[i][j] = six[nr2][j];
- }
- }
- }
- void mutatie(){
- int mut = 0, i;
- if (tip == 1){
- for (i = 0; i < 30; i++){
- srand(time(NULL) + i);
- mut = rand() % lg_rast;
- if (rast[i][mut] == 0)
- rast[i][mut] = 1;
- else
- rast[i][mut] = 0;
- }
- }
- else
- if (tip == 2){
- for (i = 0; i < 30; i++){
- srand(time(NULL) + i);
- mut = rand() % lg_gri;
- if (gri[i][mut] == 0)
- gri[i][mut] = 1;
- else
- gri[i][mut] = 0;
- }
- }
- else
- if (tip == 3){
- for (i = 0; i < 30; i++){
- srand(time(NULL) + i);
- mut = rand() % lg_ros;
- if (ros[i][mut] == 0)
- ros[i][mut] = 1;
- else
- ros[i][mut] = 0;
- }
- }
- else
- if (tip == 4){
- for (i = 0; i < 30; i++){
- srand(time(NULL) + i);
- mut = rand() % lg_six;
- if (six[i][mut] == 0)
- six[i][mut] = 1;
- else
- six[i][mut] = 0;
- }
- }
- }
- int main(){
- cout << "Introduceti numarul generatiei pana la cat va rula algoritmul genetic:";
- cin >> n;
- cout << "Pentru care tip de functie doriti sa aplicati algoritmul?" << "\n";
- cout << "1. Rastrigin's function." << "\n";
- cout << "2. Griewangk's function." << "\n";
- cout << "3. Rosenbrock's valley" << "\n";
- cout << "4. Six-hump camel back" << "\n";
- cout << "Alegeti:";
- cin >> tip;
- t = 0;
- if (tip == 1)
- genereaza(lg_rast, rast);
- if (tip == 2)
- genereaza(lg_gri, gri);
- if (tip == 3)
- genereaza(lg_ros, ros);
- if (tip == 4)
- genereaza(lg_six, six);
- evalueaza();
- while (t < n){
- t++;
- selecteaza();
- copie();
- recombina();
- //afisare();
- mutatie();
- evalueaza();
- //afisare();
- }
- cout << max_NR;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement