Генетический алгоритм C ++

размещено в: Uncategorized | 0
#include <iostream>
#include <bits/stdc++.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cstdlib>
#include <ctime>
#include <math.h>
#include<algorithm>
#include<vector>
#include<conio.h>
#define pi 3.14159265
 
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
 
 
// Function to reverse a string
void reverseStr(string&amp; str)
{
    int n = str.length();
   
    // Swap character starting from two
    // corners
    for (int i = 0; i < n / 2; i++)
        swap(str[i], str[n - i - 1]);
}
void Rewersja(int n) {
     
     int reverse=0, rem;   
            
  while(n!=0)
    {   
     rem=n%10;     
     reverse=reverse*10+rem;   
     n/=10;   
    }   
 //cout<<"Rewersowany wierz: "<<reverse<<endl;    
     
     
}
 
 
void generuj_tablice(int rowCount,int colCount) {
     
    int** a = new int*[rowCount];
for(int i = 0; i < rowCount; ++i)
    a[i] = new int[colCount];
        
  
     
     
}
 
 
 
int main(int argc, char** argv) {
 
    int il,ilkomb;
    int n;
    double x;
    double pipi;
    double sumpipi=0;
    float pm=0.95;
    int c;
    srand (static_cast <unsigned> (time(0)));
    float r;
 
 
//cout<<"podaj ilosc lancuchow binarnych(il) \n";
    //cin>>il;
    il=10;
 
    n=1;
    int a=-1,b=1,d=6;
 
 
    float ra[il];
    int ilkombis;
 
    double fx;
    double sum_fx=0;
    
     
     
    
    double x_tab[il];
    double fx_tab[il];
    double dystrybuanto=0;
    double dystrybuant[il];
    double sumpipi_tab[il];
 
 
 
 
 
 
 
 
 
 
 
 
 
     
    int h=0;
     
    int sum=0;
     
    int count=0;
     
    int liczbalosowa;
    int dziest=0;
    int dzies[il];
 
    ilkomb=(b-a)*pow(10,d);
 
     
     
    int m=0;
 
     
while(m!=-1)    {
             
    if (pow(2,m-1)<ilkomb &amp;&amp; ilkomb<=pow(2,m)){
     
            //cout<<"m wynosi: "<<m<<"\n";
                break;
            }
            else
            {
            m++;
            ////cout<<"i ty: "<<i<<"\n";
           }
            
            
            
    }
 
     
    int tab[il][m];
    int sizeil= sizeof(tab)/sizeof(tab[0]);//ilosc wierszy
    int sizem= sizeof(tab[0])/sizeof(tab[0][0]);//ilosc kolumn
    int tab_mutant[il][m];
    float rando[m];
        //dla krzyzowania
        int tab_krzyzyk[il][m];
    float pk=0.5;
    int tab_kx1[il][m];
    int tab_kx2[il][m];
    int tab_ky1[il][m];
    int tab_ky2[il][m];
    //dwupunktowe
    int tab_kz1[il][m];
    int tab_kz2[il][m];
    //rownomierne
    int tab_w[il][m];
    int tab_r1[il][m];
    int tab_r2[il][m];
    int tab_p1[il][m];
    int tab_p2[il][m];
    //dodatkowa tablica
    int tab_krzyz[il][m];
    int tab_krzyz_p1[il][m];
    int tab_krzyz_p2[il][m];
    int tab_krzyz_p3[il][m];
    int tab_krzyz_p4[il][m];
        //Epoki
    int tab_pocz[il][m];
    //Kopie M I K
    int tab_k_m[il][m];
    int tab_k_i[il][m];
    int tab_k_k[il][m];
    int tab_poczadd[il][m];
     
int decimalNumber = 0, i = 0, remainder;
    //dziesietnie
    for(int i=sizeil-1;i>=0;i--){
    //cout<<"\n";
    count++;
 
     
     
     
    for(int j=sizem-1;j>=0;j--){
    tab[i][j]=rand()%2;
    tab_mutant[i][j]=tab[i][j];
    cout<<(tab[i][j]);
     
    while (tab[i][j]!=0)
    {
    remainder = tab[i][j]%10;
        tab[i][j] /= 10;
    sum+=remainder*pow(2,j);
    dziest+=remainder*pow(2,j);
    dzies[i]=dziest;
    }
     
}
     
     
     
        cout<<" dziesietnie: "<<dzies[i]<<"\n";
         
        x=a+(b-a)*dzies[i]/(pow(2,m)-1);
        //cout<<" x : "<<x<<"\n";
        fx=10*n+pow(x,2)-10*cos(20*pi*x);
        cout<<" fx : "<<fx<<"\n";
         
         
        if(x>=0){
        //cout<<" x jest dotatnim: "<<x<<"\n";
        x_tab[i]=x;
        }
        if(fx>=0){
        //cout<<" fx jest dotatnim: "<<fx<<"\n";
        fx_tab[i]=fx;
        sum_fx+=fx;
        }
         
     
        //cout<<" sum : "<<sum<<"\n";
         
    dziest=0;
    x=0;
    }
 
         
 
     
//cout<<"\n Suma wszystkich x wynosi: "<<sum<<"\n";
//cout<<"\n Suma wszystkich fx wynosi: "<<sum_fx<<"\n";
 
     
    for(int t=0;t<il;t++){
    //cout<<"\n --------------------------- \n";
    
    //cout<<"\n fx["<<t<<"]wynosi: "<<fx_tab[t]<<"\n";
    pipi=fx_tab[t]/sum_fx;
    //cout<<"\n prawdopodobienstwo["<<t<<"]wynosi: "<<pipi<<"\n";
    sumpipi+=pipi;
    //cout<<"\n suma prawdopodobienstw["<<t<<"]wynosi: "<<sumpipi<<"\n";
    dystrybuanto+=pipi;
    dystrybuant[t]=dystrybuanto;
    //cout<<"\n dystrybuant pod num["<<t<<"]wynosi: "<<dystrybuant[t]<<"\n";
     
    //cout<<"\n wartosc dziesetna num["<<t<<"]wynosi: "<<dzies[t]<<"\n";
     
     
  }
     
 
     
    int ti;
    for(ti=il-1;ti>=0;ti--){
     
   
    r = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
    ra[ti]=r;
    //cout<<"\n liczba los wynosi: "<<ra[ti]<<"\n";
     
    if(dystrybuant[ti]>ra[ti]){
    //cout<<"\n Blok 1 \n";
    //cout<<"\n1 Wartosc dystrybuanta["<<ti<<"]wynosi: "<<dystrybuant[ti]<<" oraz jest ona > r="<<ra[ti]<<"\n";
    //cout<<"\n1 Wartosc wiersza["<<ti<<"]wynosi: "<<dzies[ti]<<"\n";
 
    }
    if (dystrybuant[ti-1]<ra[ti] &amp;&amp; ra[ti]<=dystrybuant[ti]){
            //cout<<"\n Blok 2 \n";
            //cout<<"\n Wartosc dystrybuanta["<<ti-1<<"]wynosi: "<<dystrybuant[ti-1]<<" oraz jest ona < r="<<ra[ti]<<"\n";
            //cout<<"\n Wartosc dystrybuanta["<<ti<<"]wynosi: "<<dystrybuant[ti]<<"oraz jest ona >= r="<<ra[ti]<<"\n";
            //cout<<"\n Wartosc wiersza["<<ti<<"]wynosi: "<<dzies[ti]<<"\n";
                 
            }
            else
            {
             
            //cout<<"\n Wartosc dystrybuanta["<<ti<<"]wynosi: "<<dystrybuant[ti];
            //cout<<"\n i ty: ["<<ti<<"]\n";
           }
            
    }
     
     
    cout<<"\n Mutanty: \n";
        for(int mi=sizeil-1;mi>=0;mi--){
        cout<<"\n";
     
     
     
            for(int mj=sizem-1;mj>=0;mj--){
                 
                r = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
                rando[mi]=r;
                //cout<<" liczba r wynosi: "<<rando[mi]<<"\n";
             
                 
                if(rando[mi]<pm){
                    if(tab_mutant[mi][mj]==1){
                     
                    tab_mutant[mi][mj]=0;
                     
                    cout<<tab_mutant[mi][mj];
                }
                else {
                    tab_mutant[mi][mj]=1;
                     
                    cout<<tab_mutant[mi][mj];
                }
                }
                else cout<<tab_mutant[mi][mj];
         
}
     
}
     
     
            //cout<<"\n Inversion: \n";
        float pipka=0.2;
        int mm;
        mm=m-1;
        //m=m-1;
        int punkt=0;
        int ra_invtab[2];
        while(punkt<2){
        ra_invtab[punkt] = rand()% mm+0;
        //cout<<ra_invtab[punkt]<<"\n";
        punkt++;
        }
                //cout<<"Sprawdzamy czy pierwsza wylosowana liczba nie jest wieksza od drugiej!"<<"\n";
        //cout<<"Jezeli tak, to zmieniamy miejscami"<<"\n";
        punkt=0;
         
         
         
        bool bo=false;
                int va;    
            for( va=0;va<2;va++){
                for(int vk = va; vk < 2; vk++) {
                if(va!=vk){
                     if(ra_invtab[va] >= ra_invtab[vk]) {
                    bo = true;
                }
                }
                if(bo==true)
                {int max,min;
                    min=ra_invtab[vk];
                    max=ra_invtab[va];
                    ra_invtab[va]=min;
                    ra_invtab[vk]=max;
                }
                 
                }
                bo=false;
                //cout<<ra_invtab[va]<<"\n";
                }
     
     
     
 
 
 
 
 
int j,ty;
int temp;
 
cout<<"\n Inversion 2: \n";
for(int oi=sizeil-1;oi>=0;oi--){
        cout<<"\n";
        cout<<ra_invtab[0]<<"| ";
r = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
                rando[oi]=r;
                cout<<" liczba r wynosi: "<<rando[oi]<<"\n";
                if(rando[oi]<pipka){
        for(int oh=sizem-1;oh>=sizem-ra_invtab[0];oh--){
             
             cout<<tab_mutant[oi][oh];
            }
             
            j=sizem-ra_invtab[1]; 
            ty=sizem-ra_invtab[0];  
            while(j<ty)
            {
                temp=tab_mutant[oi][ty];
                tab_mutant[oi][ty]=tab_mutant[oi][j];
                tab_mutant[oi][j]=temp;
                ty--;
                j++;
            }
    for(int oj=sizem-ra_invtab[0];oj>sizem-ra_invtab[1];oj--){
             
             cout<<tab_mutant[oi][oj]<<" | ";
            }
     
            for(int aj=sizem-ra_invtab[1]-1;aj>=0;aj--){
             
             cout<<tab_mutant[oi][aj];
            }
            }
            else
            for(int aj=sizem-1;aj>=0;aj--){
             cout<<tab_mutant[oi][aj];
}
  
cout<<" |"<<ra_invtab[1];  
}
 
 
 
//cout<<"\n Krzyzowania \n";
//cout<<"\n-------------------\n";
 
//cout<<"\n Liczenie wartosci r dla kazdego wiersza \n";
    for(int li=sizeil-1;li>=0;li--){
                //cout<<"\n\n\tNumer wiersza: ["<<li<<"]\n";
                r = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
                rando[li]=r;
                //cout<<" liczba r wynosi: "<<rando[li]<<"\n";
                    for(int ki=sizem-1;ki>=0;ki--){
                     
                         
                            //cout<<tab_mutant[li][ki];
                        }
                     
                }
                //cout<<"\n-------------------\n";
        int ktory=0;
        int cocos=0;   
        int tab_wiersz[sizeil];
        //cout<<"\n Wybieramy wierszy do krzyzowania \n";    
                for(int wo=sizeil-1;wo>=0;wo--){
                if(rando[wo]<pk){
                    //cout<<"\n liczba r: "<<rando[wo]<<" jest < od pk:"<<pk<<"\n";
                //cout<<"\n";
                    for(int wi=sizem-1;wi>=0;wi--){
                tab_krzyz[cocos][wi]=tab_mutant[wo][wi];
                //cout<<tab_krzyz[cocos][wi];
                 
                }
                tab_wiersz[cocos]=wo;
                //cout<<"\nnumer wiersza: "<<cocos<<" pod indeksem: "<<tab_wiersz[cocos]<<"\n";
                 
            cocos++;
             
             
                }
                }
                ktory=cocos;
                 
                int z=sizeil-1-cocos-1;
                if(cocos%2!=0){
                    //cout<<"\n Liczba wierszy do krzyzowania jest nieparzysta \n";  
                    //cout<<"\n Dodajemy jednego osobnika \n";   
                    for(int nw=cocos+1;nw<=cocos+1;nw++){
                //cout<<"\n";
                 
                    for(int nf=sizem-1;nf>=0;nf--){
                    tab_krzyz[nw][nf]=rand()%2;
                    //cout<<tab_krzyz[nw][nf];
                     
                }
                }
                cocos++;
                ktory=cocos;
                 
                }
                else if(cocos==0){
                    //cout<<"\n Liczba wierszy do krzyzowania jest 0! \n";
                    //cout<<"\n Tworzymy osobnikow! \n";     
                for(int gw=sizeil-1;gw>=sizeil-2;gw--){
                //cout<<"\n";
                 
                    for(int jf=sizem-1;jf>=0;jf--){
                    tab_krzyz[gw][jf]=rand()%2;
                    //cout<<tab_krzyz[gw][jf];
                 
                 
                }
                }
                cocos=2;
                ktory=2;
                 
                }
                else{
                 
                //cout<<"\n Wybrane wierszy: \n";    
                //cout<<"\n do krzyzowania: \n"; 
                for(int kd=0;kd<cocos;kd++){
                 
                //cout<<"\n";
                    for(int zf=sizem-1;zf>=0;zf--){
                //cout<<tab_krzyz[kd][zf];
                    }
                     
                    }
                     
                     
                    }
                                int losowa[100];
                 
            int coco=0;
             
             
             
                //cout<<"\n Mieszmy wierszy: \n";    
                 
                for(int ki=0;ki<cocos;ki++){
                 
                //cout<<"\n";
                    for(int za=sizem-1;za>=0;za--){
                         
                        int ind=rand()%cocos+0;
                        int te;
                        te=tab_krzyz[ki][za];
                        tab_krzyz[ki][za]=tab_krzyz[ind][za];
                        tab_krzyz[ind][za]=te;
                 
                    }
                     
                    }
             
             
             
             
             
                for(int zi=0;zi<ktory;zi++){
                                 
                    losowa[zi]=zi;
                 
                }
             
                //cout<<"\n robimy aby losowe liczby nie powtarzaly sie: \n";
            bool boob=false;
                int vo;    
            for( vo=0;vo<ktory;vo++){
                for(int vj = vo; vj < ktory; vj++) {
                if(vo!=vj){
                     if(losowa[vo] == losowa[vj]) {
                    boob = true;
                }
                }
                if(boob==true)
                {
                    losowa[vo]=rand()%cocos+0;
                }
                 
                }
                boob=false;
                //cout<<losowa[vo]<<"\n";
                }
                //cout<<"\n jeszcze rozmieszam losowe liczby: \n";   
            for(int vi=0;vi<ktory;vi++){
                                 
                    int index=rand()%cocos+0;
                    int temp=losowa[vi];
                    losowa[vi]=losowa[index];
                    losowa[index]=temp;
                }
                 
            for(int vo=0;vo<ktory;vo++){
                 
                cout<<losowa[vo]<<"\n";
                 
                }
cout<<"\n Krzyzowanie jednopunktowe\n";
 
 
int licznik[ktory];
        cout<<"\nPunk krzyzowania jednopunktowego wynosi:\n"<<ra_invtab[0];
        for(int mi=-1;mi<ktory;mi++){
             
        //cout<<"\n";
 
                     
             
                 
             
                         
         
             
        if(mi>=0){
            cout<<"\n Krzyzuja wierszy: "<<losowa[mi-1]<<" oraz "<<losowa[mi]<<"\n";
            for(int mj=sizem-1;mj>=sizem-ra_invtab[0];mj--){
            tab_kx1[mi][mj]=tab_krzyz[losowa[mi-1]][mj];
             
            tab_kx2[mi][mj]=tab_krzyz[losowa[mi]][mj];
            tab_krzyzyk[coco][mj]=tab_kx2[mi][mj];
            tab_krzyzyk[coco+1][mj]=tab_kx1[mi][mj];
                }
                 
            for(int mo=sizem-ra_invtab[0]-1;mo>=0;mo--){
         
            tab_ky1[mi][mo]=tab_krzyz[losowa[mi]][mo];
            //if(coco!=0){
            tab_ky2[mi][mo]=tab_krzyz[losowa[mi-1]][mo];
            tab_krzyzyk[coco][mo]=tab_ky2[mi][mo];
            tab_krzyzyk[coco+1][mo]=tab_ky1[mi][mo];
            //}
                }
             
         
                 
                 
                 
                        for(int z=sizem-1;z>=0;z--){
                            cout<<tab_krzyzyk[coco][z];
                            tab_pocz[coco][z]=tab_krzyzyk[coco][z];
                             
                        }
                         
                        licznik[coco]=mi;
                    //  cout<<"coco: "<<coco<<"licznik: "<<licznik[coco]<<"\n";
                        coco++; }//endif
     
     
             
        mi++;      
         
}
     
cout<<"\nIlosc wierszy zgodnych z warunkiem krzyzowania jednopunktowego: "<<coco;
 
cout<<"\n-------------------\n";
 
 
 
 
 
cout<<"\n\n";
for(int li=sizeil-1;li>=coco;li--){
                cout<<"\n";
                    for(int ki=sizem-1;ki>=0;ki--){
                    tab_poczadd[li][ki]=tab_mutant[li][ki];
                    cout<<tab_poczadd[li][ki];
                    }}
                     
                     
                     
for(int to=coco-1;to>=0;to--){
                cout<<"\n";
                    for(int ot=sizem-1;ot>=0;ot--){
                    tab_poczadd[to][ot]=tab_pocz[to][ot];
                    cout<<tab_poczadd[to][ot];
                    }}
 
     
//Epoki++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
         
        int arg;
    int il_ep;
    cout<<"\n\n----------------------------------------------- \n\n";
    cout<<"\n\nCzy generowac nastepna epoka? \n";
    cin>>arg;
    //cout<<"epoka calkowitym zastepowaniem \n";
    cout<<"podaj ilosc epok \n";
    cin>>il_ep;
        //tablica koniec
    int tab_epoka[il][m];
    int epoka=1;
    int tab_sukcesja[il][m];
    double tab_fmax[il_ep];
    double tab_fmin[il_ep];
    double tab_fsred[il_ep];
    for(int ki=epoka; ki<=il_ep;ki++){
     
//while(epoka>0 &amp;&amp; epoka<=il_ep){
     
    //decimalNumber = 0, i = 0, remainder;
    //dziesietnie
        cout<<"\nWiersze z poprzedniej epoki do nastepnej: \n";
dziest=0;
    for(int i=sizeil-1;i>=0;i--){
    //cout<<"\n";
    count++;
 
     
     
     
    for(int j=sizem-1;j>=0;j--){
    tab[i][j]=tab_poczadd[i][j];
    tab_mutant[i][j]=tab[i][j];
    //cout<<(tab[i][j]);
     
    while (tab[i][j]!=0)
    {
    remainder = tab[i][j]%10;
        tab[i][j] /= 10;
    sum+=remainder*pow(2,j);
    dziest+=remainder*pow(2,j);
    dzies[i]=dziest;
    }
     
}
     
     
     
        //cout<<" dziesietnie: "<<dzies[i]<<"\n";
         
        x=a+(b-a)*dzies[i]/(pow(2,m)-1);
        //cout<<" x : "<<x<<"\n";
        fx=10*n+pow(x,2)-10*cos(20*pi*x);
        cout<<" fx : "<<fx<<"\n";
         
         
        if(x>=0){
        //cout<<" x jest dotatnim: "<<x<<"\n";
        x_tab[i]=x;
        }
        if(fx>=0){
        //cout<<" fx jest dotatnim: "<<fx<<"\n";
        fx_tab[i]=fx;
        sum_fx+=fx;
        }
         
     
        //cout<<" sum : "<<sum<<"\n";
         
    dziest=0;
    x=0;
    }
 
         
 
     
//cout<<"\n Suma wszystkich x wynosi: "<<sum<<"\n";
//cout<<"\n Suma wszystkich fx wynosi: "<<sum_fx<<"\n";
 
     
    for(int t=0;t<il;t++){
    //cout<<"\n --------------------------- \n";
    
    //cout<<"\n fx["<<t<<"]wynosi: "<<fx_tab[t]<<"\n";
    pipi=fx_tab[t]/sum_fx;
    //cout<<"\n prawdopodobienstwo["<<t<<"]wynosi: "<<pipi<<"\n";
    sumpipi+=pipi;
    //cout<<"\n suma prawdopodobienstw["<<t<<"]wynosi: "<<sumpipi<<"\n";
    dystrybuanto+=pipi;
    dystrybuant[t]=dystrybuanto;
    //cout<<"\n dystrybuant pod num["<<t<<"]wynosi: "<<dystrybuant[t]<<"\n";
     
    //cout<<"\n wartosc dziesetna num["<<t<<"]wynosi: "<<dzies[t]<<"\n";
     
     
  }
     
 
     
 
    for(ti=il-1;ti>=0;ti--){
     
   
    r = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
    ra[ti]=r;
    //cout<<"\n liczba los wynosi: "<<ra[ti]<<"\n";
     
    if(dystrybuant[ti]>ra[ti]){
    //cout<<"\n Blok 1 \n";
    //cout<<"\n1 Wartosc dystrybuanta["<<ti<<"]wynosi: "<<dystrybuant[ti]<<" oraz jest ona > r="<<ra[ti]<<"\n";
    //cout<<"\n1 Wartosc wiersza["<<ti<<"]wynosi: "<<dzies[ti]<<"\n";
 
    }
    if (dystrybuant[ti-1]<ra[ti] &amp;&amp; ra[ti]<=dystrybuant[ti]){
            //cout<<"\n Blok 2 \n";
            //cout<<"\n Wartosc dystrybuanta["<<ti-1<<"]wynosi: "<<dystrybuant[ti-1]<<" oraz jest ona < r="<<ra[ti]<<"\n";
            //cout<<"\n Wartosc dystrybuanta["<<ti<<"]wynosi: "<<dystrybuant[ti]<<"oraz jest ona >= r="<<ra[ti]<<"\n";
            //cout<<"\n Wartosc wiersza["<<ti<<"]wynosi: "<<dzies[ti]<<"\n";
                 
            }
            else
            {
             
            //cout<<"\n Wartosc dystrybuanta["<<ti<<"]wynosi: "<<dystrybuant[ti];
            //cout<<"\n i ty: ["<<ti<<"]\n";
           }
            
    }
     
     
    //cout<<"\n Mutanty: \n";
        for(int mi=sizeil-1;mi>=0;mi--){
        //cout<<"\n";
     
     
     
            for(int mj=sizem-1;mj>=0;mj--){
                 
                r = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
                rando[mi]=r;
                //cout<<" liczba r wynosi: "<<rando[mi]<<"\n";
             
                 
                if(rando[mi]<pm){
                    if(tab_mutant[mi][mj]==1){
                     
                    tab_mutant[mi][mj]=0;
                    tab_k_m[mi][mj]=tab_mutant[mi][mj];
                    //cout<<tab_mutant[mi][mj];
                }
                else {
                    tab_mutant[mi][mj]=1;
                    tab_k_m[mi][mj]=tab_mutant[mi][mj];
                    //cout<<tab_mutant[mi][mj];
                }
                }
            //  else //cout<<tab_mutant[mi][mj];
         
}
     
}
     
     
            //cout<<"\n Inversion: \n";
        pipka=0.1;
         
        punkt=0;
        ra_invtab[2];
        while(punkt<2){
        ra_invtab[punkt] = rand()% mm+0;
        //cout<<ra_invtab[punkt]<<"\n";
        punkt++;
        }
                //cout<<"Sprawdzamy czy pierwsza wylosowana liczba nie jest wieksza od drugiej!"<<"\n";
        //cout<<"Jezeli tak, to zmieniamy miejscami"<<"\n";
        bool bo=false;
                int va;    
            for( va=0;va<2;va++){
                for(int vk = va; vk < 2; vk++) {
                if(va!=vk){
                     if(ra_invtab[va] >= ra_invtab[vk]) {
                    bo = true;
                }
                }
                if(bo==true)
                {int max,min;
                    min=ra_invtab[vk];
                    max=ra_invtab[va];
                    ra_invtab[va]=min;
                    ra_invtab[vk]=max;
                }
                 
                }
                bo=false;
                //cout<<ra_invtab[va]<<"\n";
                }
     
     
 
 
 
 
 
 
 
//cout<<"\n Inversion 2: \n";
for(int oi=sizeil-1;oi>=0;oi--){
        //cout<<"\n";
        //cout<<ra_invtab[0]<<"| ";
r = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
                rando[oi]=r;
                //cout<<" liczba r wynosi: "<<rando[oi]<<"\n";
                if(rando[oi]<pipka){
        for(int oh=sizem-1;oh>=sizem-ra_invtab[0];oh--){
             
             //cout<<tab_mutant[oi][oh];
            }
            j=sizem-ra_invtab[1]; 
            ty=sizem-ra_invtab[0];  
            while(j<ty)
            {
                temp=tab_mutant[oi][ty];
                tab_mutant[oi][ty]=tab_mutant[oi][j];
                tab_mutant[oi][j]=temp;
                ty--;
                j++;
            }
            for(int oj=sizem-ra_invtab[0];oj>sizem-ra_invtab[1];oj--){
             
             //cout<<tab_mutant[oi][oj]<<" | ";
            }
            for(int aj=sizem-ra_invtab[1]-1;aj>=0;aj--){
             
             //cout<<tab_mutant[oi][aj];
            }
            }
            else
            for(int aj=sizem-1;aj>=0;aj--){
             //cout<<tab_mutant[oi][aj];
}
  
//cout<<" |"<<ra_invtab[1];
}
 
 
 
//cout<<"\n Krzyzowania \n";
//cout<<"\n-------------------\n";
 
//cout<<"\n Liczenie wartosci r dla kazdego wiersza \n";
    for(int li=sizeil-1;li>=0;li--){
                //cout<<"\n\n\tNumer wiersza: ["<<li<<"]\n";
                r = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
                rando[li]=r;
                //cout<<" liczba r wynosi: "<<rando[li]<<"\n";
                    for(int ki=sizem-1;ki>=0;ki--){
                     
                         
                            //cout<<tab_mutant[li][ki];
                            tab_k_i[li][ki]=tab_mutant[li][ki];
                        }
                     
                }
                //cout<<"\n-------------------\n";
        ktory=0;
        cocos=0;   
        tab_wiersz[sizeil];
        //cout<<"\n Wybieramy wierszy do krzyzowania \n";    
                for(int wo=sizeil-1;wo>=0;wo--){
                if(rando[wo]<pk){
                    //cout<<"\n liczba r: "<<rando[wo]<<" jest < od pk:"<<pk<<"\n";
                //cout<<"\n";
                    for(int wi=sizem-1;wi>=0;wi--){
                tab_krzyz[cocos][wi]=tab_mutant[wo][wi];
                //cout<<tab_krzyz[cocos][wi];
                 
                }
                tab_wiersz[cocos]=wo;
                //cout<<"\nnumer wiersza: "<<cocos<<" pod indeksem: "<<tab_wiersz[cocos]<<"\n";
                 
            cocos++;
             
             
                }
                }
                ktory=cocos;
                 
                z=sizeil-1-cocos-1;
                if(cocos%2!=0){
                    //cout<<"\n Liczba wierszy do krzyzowania jest nieparzysta \n";  
                    //cout<<"\n Dodajemy jednego osobnika \n";   
                    for(int nw=cocos+1;nw<=cocos+1;nw++){
                //cout<<"\n";
                 
                    for(int nf=sizem-1;nf>=0;nf--){
                    tab_krzyz[nw][nf]=rand()%2;
                    //cout<<tab_krzyz[nw][nf];
                     
                }
                }
                cocos++;
                ktory=cocos;
                 
                }
                else if(cocos==0){
                    //cout<<"\n Liczba wierszy do krzyzowania jest 0! \n";
                    //cout<<"\n Tworzymy osobnikow! \n";     
                for(int gw=sizeil-1;gw>=sizeil-2;gw--){
                //cout<<"\n";
                 
                    for(int jf=sizem-1;jf>=0;jf--){
                    tab_krzyz[gw][jf]=rand()%2;
                    //cout<<tab_krzyz[gw][jf];
                 
                 
                }
                }
                cocos=2;
                ktory=2;
                 
                }
                else{
                 
                //cout<<"\n Wybrane wierszy: \n";    
                //cout<<"\n Laczymy w pary losowo: \n";  
                for(int kd=0;kd<cocos;kd++){
                 
                //cout<<"\n";
                    for(int zf=sizem-1;zf>=0;zf--){
                //cout<<tab_krzyz[kd][zf];
                    }
                     
                    }
                     
                     
                    }
                                int losowa[100];
                 
            int coco=0;
             
             
             
                //cout<<"\n Mieszmy wierszy: \n";    
                 
                for(int ki=0;ki<cocos;ki++){
                 
                //cout<<"\n";
                    for(int za=sizem-1;za>=0;za--){
                         
                        int ind=rand()%cocos+0;
                        int te;
                        te=tab_krzyz[ki][za];
                        tab_krzyz[ki][za]=tab_krzyz[ind][za];
                        tab_krzyz[ind][za]=te;
                 
                    }
                     
                    }
             
             
             
             
             
                for(int zi=0;zi<ktory;zi++){
                                 
                    losowa[zi]=zi;
                 
                }
             
                //cout<<"\n robimy aby losowe liczby nie powtarzaly sie: \n";
            bool boob=false;
                int vo;    
            for( vo=0;vo<ktory;vo++){
                for(int vj = vo; vj < ktory; vj++) {
                if(vo!=vj){
                     if(losowa[vo] == losowa[vj]) {
                    boob = true;
                }
                }
                if(boob==true)
                {
                    losowa[vo]=rand()%cocos+0;
                }
                 
                }
                boob=false;
                //cout<<losowa[vo]<<"\n";
                }
                //cout<<"\n jeszcze rozmieszam losowe liczby: \n";   
            for(int vi=0;vi<ktory;vi++){
                                 
                    int index=rand()%cocos+0;
                    int temp=losowa[vi];
                    losowa[vi]=losowa[index];
                    losowa[index]=temp;
                }
                 
            for(int vo=0;vo<ktory;vo++){
                 
                //cout<<losowa[vo]<<"\n";
                 
                }
//cout<<"\n Krzyzowanie jednopunktowe\n";
        //cout<<"\nPunk krzyzowania jednopunktowego wynosi:\n"<<ra_invtab[0];
        for(int mi=-1;mi<ktory;mi++){
         
        //cout<<"\n";
 
                             
                    //cout<<"\n Krzyzuja wierszy: "<<losowa[mi-1]<<" oraz "<<losowa[mi]<<"\n";
                 
             
                         
         
             
        if(coco>0){
         
            for(int mj=sizem-1;mj>=sizem-ra_invtab[0];mj--){
            tab_kx1[mi][mj]=tab_krzyz[mi][mj];
             
            tab_kx2[mi][mj]=tab_krzyz[mi-1][mj];
            tab_krzyzyk[coco][mj]=tab_kx2[mi][mj];
            tab_krzyzyk[coco+1][mj]=tab_kx1[mi][mj];
                }
                 
            for(int mo=sizem-ra_invtab[0]-1;mo>=0;mo--){
         
            tab_ky1[mi][mo]=tab_krzyz[losowa[mi]][mo];
            //if(coco!=0){
            tab_ky2[mi][mo]=tab_krzyz[losowa[mi-1]][mo];
            tab_krzyzyk[coco][mo]=tab_ky2[mi][mo];
            tab_krzyzyk[coco+1][mo]=tab_ky1[mi][mo];
            //}
                }
                 
                 
                 
                 
                 
                        for(int z=sizem-1;z>=0;z--){
                            //cout<<tab_krzyzyk[coco][z];
                             
                            tab_pocz[coco][z]=tab_krzyzyk[coco][z];
                        }
                coco++; }//endif
     
                         
        mi++;      
                 
         
}
     
//cout<<"\nIlosc wierszy zgodnych z warunkiem krzyzowania jednopunktowego: "<<coco;
 
//cout<<"\n-------------------\n";
 
for(int li=sizeil-1;li>=coco;li--){
                 
                    for(int ki=sizem-1;ki>=0;ki--){
                    tab_poczadd[li][ki]=tab_mutant[li][ki];
                    tab_k_k[li][ki]=tab_poczadd[li][ki];
                    }}
                     
                     
                     
for(int to=coco-1;to>=0;to--){
                 
                    for(int ot=sizem-1;ot>=0;ot--){
                    tab_poczadd[to][ot]=tab_pocz[to][ot];
                    tab_k_k[to][ot]=tab_poczadd[to][ot];
                    }}
 
int coconut;
//++ Sukcesja P i K
cout<<"\nMutanty \n";
coconut=0;
int tab_kopie[100][21];
int tab_k_p[10][21];
    for(int mu=0;mu<sizeil;mu++){
        cout<<"\n";
        for(int mt=0;mt<sizem;mt++){
             
        tab_kopie[coconut][mt]=tab_k_m[mu][mt];
        cout<<tab_k_m[mu][mt];
             
        }
        coconut++;
        }
     
cout<<"\nInversy \n";
 
    for(int in=0;in<sizeil;in++){
        cout<<"\n";
        for(int iv=0;iv<sizem;iv++){
         
        tab_kopie[coconut][iv]=tab_k_i[in][iv];
        cout<<tab_k_i[in][iv];
             
        }
        coconut++;
        }
     
cout<<"\nKrzyzyki \n";
    for(int kr=0;kr<sizeil;kr++){
        cout<<"\n";
        for(int kz=0;kz<sizem;kz++){
         
        tab_kopie[coconut][kz]=tab_k_k[kr][kz];
        cout<<tab_k_k[kr][kz];
             
        }
        coconut++;
        }
         
    //  cout<<"\n Ilosc wierszy w tablicy kopie (M, I, K) wynosi: "<<coconut;
         
    //  cout<<"\n Tablica kopie (M, I, K) \n";
    for(int tk=0;tk<coconut;tk++){
    //  cout<<"\n";
        for(int to=0;to<sizem;to++){
         
     
    //  cout<<tab_kopie[tk][to];
             
        }
     
        }
         
         
        int tab_losowa[0];
        tab_losowa[0]=rand()%10+0;
            //cout<<"\n Tablica czesciowo K i P \n";
            //cout<<"\n Rozdzielna losowa K i P: "<<tab_losowa[0];
    for(int tc=0;tc<tab_losowa[0];tc++){
        //cout<<"\n";
        for(int tz=0;tz<21;tz++){
         
     
        //cout<<tab_kopie[tc][tz];
        tab_k_p[tc][tz]=tab_kopie[tc][tz];
        }
        }
        for(int te=tab_losowa[0];te<10;te++){
            //cout<<"\n";
        for(int to=0;to<21;to++){
     
        //cout<<tab_pocz[te][to];//poczatkowa populacja
        tab_k_p[te][to]=tab_poczadd[te][to];
        }
     
        }
         
         
         
         
         
    cout<<"\n Tablica czesciowa K i P: \n";
    for(int tl=0;tl<sizeil;tl++){
        cout<<"\n";
        for(int ts=0;ts<sizem;ts++){
         
     
        cout<<tab_k_p[tl][ts];
         
        }
         
     
        }
         
         
         
         
//++Sukcesja najwieksza wartosc funkcji
cout<<"\n--------------------- Wartosci fx w epokach: --------------------------------\n";
    cout<<"\n Epoka pod numerem: "<<ki<<"\n";
    for(int pp=0;pp<sizeil;pp++){
        //cout<<"\n";
        for(int pe=0;pe<sizem;pe++){
         
     
        tab_pocz[pp][pe]=tab_poczadd[pp][pe];
        //licz_fx();
        }
         
     
        }
count=0;
//decimalNumber = 0, i = 0, remainder;
dziest=0;
    //dziesietnie
    for(int i=sizeil-1;i>=0;i--){
    cout<<"\n";
    count++;
 
     
     
     
    for(int j=sizem-1;j>=0;j--){
    tab[i][j]=tab_poczadd[i][j];
    tab_mutant[i][j]=tab[i][j];
    cout<<(tab[i][j]);
     
    while (tab[i][j]!=0)
    {
    remainder = tab[i][j]%10;
        tab[i][j] /= 10;
    sum+=remainder*pow(2,j);
    dziest+=remainder*pow(2,j);
    dzies[i]=dziest;
    }
     
}
     
     
     
        cout<<" dziesietnie: "<<dzies[i]<<"\n";
         
        x=a+(b-a)*dzies[i]/(pow(2,m)-1);
        //cout<<" x : "<<x<<"\n";
        fx=10*n+pow(x,2)-10*cos(20*pi*x);
        cout<<" fx : "<<fx<<"\n";
         
         
        if(x>=0){
        //cout<<" x jest dotatnim: "<<x<<"\n";
        x_tab[i]=x;
        }
        if(fx>=0){
        //cout<<" fx jest dotatnim: "<<fx<<"\n";
        fx_tab[i]=fx;
        sum_fx+=fx;
        }
         
     
        //cout<<" sum : "<<sum<<"\n";
         
    dziest=0;
    x=0;
    }
        //Najw wartosc fx
     
        double max;
        double min;
         
//cout<<" Szukam najw oraz najm wartosc fx \n";
 
    bool ba=false;
                int vaza;      
            for( vaza=0;vaza<sizeil;vaza++){
                for(int vz = vaza; vz < sizeil; vz++) {
                if(vaza!=vz){
                     if(fx_tab[vaza] > fx_tab[vz]) {
                    ba = true;
                }
                }
                if(ba==true)
                {
                         max=fx_tab[vaza];
                          
                }
                 
                if(ba==false)
                {
                        min=fx_tab[vaza];
                }
                 
                }
                ba=false;
                //cout<<losowa[vo]<<"\n";
                }
 
 
 
     
     
    //cout<<" Szukam srednia wartosc fx \n";
    double tab_suma;
    int wiele_el=0;
    double wynik;
for(int c=0;c<sizeil;c++){
         
 
tab_suma+=fx_tab;
        wiele_el++;
         
    }
 
         
 
wynik=tab_suma/wiele_el;
         
     
     
     
    tab_fmax[epoka]=max;
    tab_fmin[epoka]=min;
    tab_fsred[epoka]=wynik;
//  epoka++;
}//kon epoki
     
     
     
     
    double max;
    double min;
    epoka=1;
    for(int hi=0; hi<il_ep; hi++){
    cout<<"numer epoki: "<<epoka<<"najwieksza wartosc fx:"<<tab_fmax[epoka]<<"\n";
    cout<<"numer epoki: "<<epoka<<"najmniejsza wartosc fx:"<<tab_fmin[epoka]<<"\n";
    cout<<"numer epoki: "<<epoka<<"srednia wartosc fx:"<<tab_fsred[epoka]<<"\n";
    epoka++;
         
                                    }
 
 
 
 
 
 
 
bool ball=false;
                int vaga;      
            for( vaga=0;vaga<il_ep;vaga++){
                for(int vzz = vaga; vzz < il_ep; vzz++) {
                if(vaga!=vzz){
                     if(tab_fmax[vaga] > tab_fmax[vzz]) {
                    ball = true;
                }
                }
                if(ball==true)
                {
                         max=tab_fmax[vaga];
                          
                }
                 
             
                 
                }
                ball=false;
                //cout<<losowa[vo]<<"\n";
                }
 
 
 
 
bool bam=false;
                int vii;       
            for( vii=0;vii<il_ep;vii++){
                for(int viz = vaga; viz < il_ep; viz++) {
                if(vii!=viz){
                     if(tab_fmin[vii] < tab_fmin[viz]) {
                    ball = true;
                }
                }
                if(bam==true)
                {
                         min=tab_fmin[vii];
                          
                }
                 
             
                 
                }
                bam=false;
                //cout<<losowa[vo]<<"\n";
                }
 
 
//cout<<" Szukam srednia wartosc fx \n";
    double sumka;
    int wiel=0;
    double sred;
for(int cy=0;cy<sizeil;cy++){
         
 
sumka+=tab_fsred[cy];
        wiel++;
         
    }
 
         
 
sred=sumka/wiel;
         
     
 
 
cout<<"ilosc epok: "<< il_ep;
cout<<"\nnajwieksza wartosc fx: "<< max;
cout<<"\nnajmniejsza wartosc fx: "<< min;
cout<<"\nsrednia wartosc fx: "<< sred;
 
 
 
 
 
 
 
 
     
    return 0;
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *