Genetic algorithms project C++

posted in: 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;
}




Leave a Reply

Your email address will not be published. Required fields are marked *