#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& 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 && 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] && 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 && 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] && 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;
}
Dodaj komentarz