/***************************************
Genetic Algorithm(Bin)//
Produced By MosleM Mansoori From Besat//
Mobile:
09133964875,09394115363//
1389-08-10//
****************************************/
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <graphics.h>
#define N 20
#define m 2
#define l  16
#define loop 100
float inc,xh,xl,max,max1,dec1,rand1,pm,pc,change,point;
int k,i,j,r,s,loo,x1,y1,x2,s1,s2;
char ch1;
float sumf,sump;
int mat[N][l];
int sort[l];
float arrdec[N][m];
float best_nor[loop][2];
float best_so_far[loop][3];
int best_cro[loop][l];
float best_fit[loop];
float fit_avg[loop];
float cir_sump[N];
int hozche[N][l];
float nor[N][m];
float fit[N];
float p[N];
int main(){
 again: clrscr();
 unsigned seed;
 cout<<"		Produced By MosleM MansoorI\n";
 cin>>seed;
 cout<<"enter:";
 cin>>pm>>pc;
 ///////////////////////meghdar dehie avaliyeh
 srand(seed);
 for(i=0;i<=N-1;i++){
  cout<<"\n";
  for(j=0;j<=l-1;j++){
   r=rand()%2;
   mat[i][j]=r;
  // cout<<r<<" ";
  }
 }
 cout<<"\n";
 s=l/m;
 max=0;
 for(k=s-1;k>=0;k--)
  max=(1<<k)+max;
 xh= 1 +rand()/32768.0* (2 - 1);
 xl= -4 +rand()/32768.0 * (-1.5 +4);
 for(loo=0;loo<loop;loo++){///////////start
  ////////////////ramzgoshaee";
  inc=0;
  for(i=0;i<=N-1;i++){
   for(j=0;j<=m-1;j++){
    dec1=0;
    for(k=s-1;k>=0;k--){
     dec1=(1<<k)*mat[i][inc]+dec1;
     inc++;
    }
    arrdec[i][j]=dec1;
   }
   inc=0;
  }
  //cout<<"\n/////////////////////mormal sazi";
  for(i=0;i<=N-1;i++){
   for(j=0;j<=m-1;j++)
    nor[i][j]=arrdec[i][j]/max*(xh-xl)+xl;
  }
  //cout<<"\n/////////////////taene shayestegi";
  sumf=0;
  best_fit[loo]=0;
  for(i=0;i<=N-1;i++){
   fit[i]=(1+cos(2*3.14*nor[i][0]*nor[i][1]))*exp(-(fabs(nor[i][0])+fabs(nor[i][1]))/2);
   sumf=fit[i]+sumf;
   if(best_fit[loo]<fit[i]){
    best_fit[loo]=fit[i];
    for(k=0;k<=l-1;k++)
     best_cro[loo][k]=mat[i][k];
    best_nor[loo][0]=nor[i][0];
    best_nor[loo][1]=nor[i][1];
   }
  }
  max1=0;
  if(loo>=1){
   for(i=0;i<=loo;i++){
    if(max1<best_fit[i]){
     max1=best_fit[i];
     best_so_far[loo][2]=best_fit[i];
     best_so_far[loo][0]=best_nor[i][0];
     best_so_far[loo][1]=best_nor[i][1];
    }
   }
  }
  else{
   best_so_far[0][2]=best_fit[0];
   best_so_far[loo][0]=best_nor[0][0];
   best_so_far[loo][1]=best_nor[0][1];
  }
  fit_avg[loo]=sumf/N; ////////meyangin
 // cout<<"\n///////////////////mohasebeh shans\\\\\\\\\\\\\\";
  sump=0;
  for(i=0;i<=N-1;i++){
   p[i]=fit[i]/sumf;
   sump=p[i]+sump;
  }
  ///////////// rolet////
  cir_sump[0]=p[0];
  for(i=0;i<=N-1;i++){
   cir_sump[i+1]=cir_sump[i]+p[i+1];
  }
  i=0;
  do {
   rand1=rand()/32768.0;
   for(j=0;j<=N-1;j++){
    if(rand1>cir_sump[j] && rand1<cir_sump[j+1]){
     for(k=0;k<=l-1;k++){
      hozche[i][k]=mat[j+1][k];
     }
     i++;
     goto l1;
    }
   }
  l1: }while(i<=N-1);
  //cout<<"\n********************{crosse over}***********";
  inc=0;
  for(i=0;i<=N-2;i=i+2){
   rand1=rand()/32768.0;
   if(rand1<pc){
    for(k=0;k<=l-1;k++){
     if(k<l/2){
      mat[inc][k]=hozche[i][k];
     }
     else{
      mat[inc][k]=hozche[i+1][k];
     }
    }
    inc++;
    for(k=0;k<=l-1;k++){
     if(k<l/2){
      mat[inc][k]=hozche[i+1][k];
     }
     else{
      mat[inc][k]=hozche[i][k];
     }
    }
    inc++;
   }
   else{
    for(j=i;j<=i+1;j++){
     for(k=0;k<=l-1;k++){
      mat[inc][k]=hozche[j][k];
     }
    inc++;
    }
   }
  }
//  cout<<"\n******************* jahesh *****";
  for(i=0;i<=N-1;i++){
   for(j=0;j<=l-1;j++){
    rand1=rand()/32768.0;
    r=mat[i][j];
    if (rand1<pm){
     switch(r){
      case 0:mat[i][j]=1;
      break;
      case 1:mat[i][j]=0;
      break;
     }
    }
   }
  }
 }///////////////////End
 ////////////////////////// graph ///////////////////////////////
 int gdriver = DETECT;
 int gmode,errorcode,a,b;
 float pi = 3.14159;
 initgraph(&gdriver,&gmode,"c:\\tc\\bgi");
 errorcode = graphresult();
 if ( errorcode != grOk)
 {
  exit(1);
 }
 x2=0;
 y1=10;
 for(i=1;i<=25;i++){
  for(j=1;j<=100;j++){
   putpixel(30+x2,260-y1,6);
   x2+=5;
  }
  x2=0;
  y1+=10;
 }
 x2=0;
 y1=50;
 for(i=1;i<=5;i++){
  for(j=1;j<=107;j++){
   putpixel(5+x2,260-y1,7);
   x2+=5;
  }
  x2=0;
  y1+=50;
 }
  x2=50;
 y1=0;
 for(i=1;i<=10;i++){
  for(j=1;j<=130;j++){
   putpixel(25+x2,10+y1,8);
   y1+=2;
  }
  x2=x2+50;
  y1=0;
 }
 setcolor(12);
 line(25,10,25,260);
 line(25,260,525,260);
 ////////////////////////////////// best_so_far /////:green
 x1=25;
 y1=260;
 for(i=0;i<loop;i++){
  point=best_so_far[i][2];
  change=0;
  for(k=1;k<250;k++){
   if(change<point && point<=change+0.01){
    if(i==0) goto jump;
    if(best_so_far[i][2]>best_so_far[i-1][2]){
     jump:
      setcolor(12);
      line(x1+5,260-k,x1+7,260-k);
      setcolor(2);
      line(x1,y1,x1+5,260-k);
      y1=260-k;
      goto exit1;
    }
    if(best_so_far[i][2]==best_so_far[i-1][2]){
     setcolor(12);
     line(x1+5,y1,x1+7,y1);
     setcolor(2);
     line(x1,y1,x1+5,y1);
     goto exit1;
    }
    else{
     setcolor(12);
     line(x1+5,260-k,x1+7,260-k);
     setcolor(2);
     line(x1,y1,x1+5,260-k);
     y1=260-k;
     goto exit1;
    }
   }
   change=change+0.01;
  }
  exit1: x1=x1+5;
 }
 ////////////////////// avg_fitness////////////:blue
 x1=25;
 y1=260;
 for(i=0;i<loop;i++){
  point=fit_avg[i];
  change=0;
  for(k=1;k<250;k++){
   if(change<point && point<=change+0.01){
    if(i==0) goto jump2;
    if(fit_avg[i]>fit_avg[i-1]){
     jump2:
      setcolor(12);
      line(x1+5,260-k,x1+7,260-k);
      setcolor(3);
      line(x1,y1,x1+5,260-k);
      y1=260-k;
      goto exit2;
    }
    if(fit_avg[i]==fit_avg[i-1]){
     setcolor(12);
     line(x1+5,y1,x1+7,y1);
     setcolor(3);
     line(x1,y1,x1+5,y1);
     goto exit2;
    }
    else{
     setcolor(12);
     line(x1+5,260-k,x1+7,260-k);
     setcolor(3);
     line(x1,y1,x1+5,260-k);
     y1=260-k;
     goto exit2;
    }
   }
   change=change+0.01;
  }
  exit2: x1=x1+5;
 }
////////////////////////// best_fitness ////////////////
 x1=25;
 y1=260;
 for(i=0;i<loop;i++){
  point=best_fit[i];
  change=0;
  for(k=1;k<250;k++){
   if(change<point && point<=change+0.01){
    if(i==0) goto jump3;
    if(best_fit[i]>best_fit[i-1]){
     jump3:
      setcolor(12);
      line(x1+5,260-k,x1+7,260-k);
      setcolor(5);
      line(x1,y1,x1+5,260-k);
      y1=260-k;
      goto exit3;
    }
    if(best_fit[i]==best_fit[i-1]){
     setcolor(12);
     line(x1+5,y1,x1+7,y1);
     setcolor(5);
     line(x1,y1,x1+5,y1);
     goto exit3;
    }
    else{
     setcolor(12);
     line(x1+5,260-k,x1+7,260-k);
     setcolor(5);
     line(x1,y1,x1+5,260-k);
     y1=260-k;
     goto exit3;
    }
   }
   change=change+0.01;
  }
  exit3: x1=x1+5;
 }
///////////////////End graph
 gotoxy(1,18);
 printf("************{ Produced By MosleM Mansoori }************\n");
 cout<<"best_so_far:y=yes or n=no: ";
 cin>>ch1;
 if(ch1=='y'){
  cout<<"best_so_far from:";
  cin>>s1;
  cout<<" to ";
  cin>>s2;
  for(i=s1;i<=s2;i++){
   for(k=0;k<3;k++)
    cout<<"  best_so_far:"<<best_so_far[i-1][k];
  cout<<"\n";
  }
 }
 cout<<"fit_avg:y=yes or n=no: ";
 cin>>ch1;
 if(ch1=='y'){
  cout<<"fit_avg from:";
  cin>>s1;
  cout<<" to ";
  cin>>s2;
  for(i=s1;i<=s2;i++)
   cout<<"  fit_avg:"<<fit_avg[i-1];
 }
 cout<<"best_fit:y=yes or n=no: ";
 cin>>ch1;
 if(ch1=='y'){
  cout<<"best_fit from:";
  cin>>s1;
  cout<<" to ";
  cin>>s2;
  for(i=s1;i<=s2;i++)
   cout<<"  best_fit:"<<best_fit[i-1];
 }
 getch();
 cout<<"for start:y=yes: ";
 cin>>ch1;
 if(ch1=='y') goto again;
 closegraph();
 return 0;
}

