Genetic Algorithm
Genetic Algorithm is a program for converging to a required point through a given set of data.This program is written to converge to a population consisting of fittest members.
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void initialize(int *a)
{
int i;
for(i=0;i<4;i++)
{
a[i] = rand()%64;
}
printf("\n\tThe present generation is:");
for(i=0;i<4;i++)
{
printf(" %d ",a[i]);
}
}
void encoding(int a[],int arr[][6])
{
int k,l,i,j;
for(i=0;i<4;i++)
{
k=a[i];
for(j=5;j>=0;j--)
{
if(k<2)
{
arr[i][j]=k;
while(j>0)
{
j--;
arr[i][j]=0;
}
break;
}
arr[i][j]=k%2;
l=k/2;
k=l;
}
}
printf("\n\n");
for(i=0;i<4;i++)
{
printf("\n");
printf(" %d\t:",a[i]);
for(j=0;j<6;j++)
{
printf(" %d",arr[i][j]);
}
}
}
int selection(int a[], int approx[4], int sarr[][6],int arr[][6],int b[])
{
int sum=0,i,j,k,sum1=0,l=0;
double avg,array[4];
for(i=0;i<4;i++)
{
sum=sum+a[i];
}
printf("\n\n\t SUM : %d",sum);
avg=sum/4.0;
printf("\n\n\t AVERAGE : %lf",avg);
printf("\n\nnumber \texpected count \tapprox count");
printf("\n");
for(i=0;i<4;i++)
{
array[i]=a[i]/avg;
approx[i]=array[i]+.5;
sum1=sum1+approx[i];
printf("\n%d \t%lf \t%d",a[i],array[i],approx[i]);
}
for(i=0;i<4;i++)
{
for(k=0;k<approx[i];k++)
{
for(j=0;j<6;j++)
{
sarr[l][j]=arr[i][j];
b[l]=a[i];
}
l++;
}
}
if(sum1!=4)
return 0;
else
return 1;
}
void crossover(int sarr[][6],int a[],int b[],int arr[][6])
{
randomize();
printf("\n\n\n\tCROSSOVER\n");
int i,j,num[4],c=0,x,y;
for(i=0;i<4;i++)
{
printf("\n %d : ",b[i]);
for(j=0;j<6;j++)
{
printf(" %d",sarr[i][j]);
}
}
for(i=0;i<4;i++)
{
num[i]=rand()%4;
c=0;
while(c==0)
{
c=1;
for(j=i;j>0;j--)
{
if(num[i]==num[j-1])
c=0;
}
if(c==0)
num[i]=rand()%4;
}
}
printf("\n\n\t THE COUPLES FOR CROSSOVER ARE");
y=rand()%5;
printf("\tcrossover point : %d",y);
printf("\n\n\tBefore crossover\n");
// printf("\t%d\t:",b[num1]);
for(i=0;i<4;i++)
{
if(i%2==0)
printf("\n\n\tCOUPLE\n ");
printf("\n\t%d\t:",b[num[i]]);
for(j=0;j<6;j++)
{
printf(" %d",sarr[num[i]][j]);
}
}
printf("\n\n\tAfter crossover");
for(i=0;i<4;i++)
{
if(i%2==0)
{
for(j=(5-y);j<6;j++)
{
x=sarr[num[i]][j];
sarr[num[i]][j]=sarr[num[i+1]][j];
sarr[num[i+1]][j]=x;
}
}
}
for(i=0;i<4;i++)
{
if(i%2==0)
printf("\n\n\tCOUPLE\n\t\t");
for(j=0;j<6;j++)
{
printf(" %d",sarr[num[i]][j]);
}
printf("\n\t\t");
}
for(i=0;i<4;i++)
{
for(j=0;j<6;j++)
{
arr[i][j]=sarr[num[i]][j];
}
}
}
void evaluate(int arr[][6],int a[])
{
printf("\n\t THE NEW GENERATION IS\n");
int i,j,sum;
for(i=0;i<4;i++)
{
sum=0;
for(j=0;j<6;j++)
{
sum=sum+(arr[i][j]*pow(2,(5-j)));
}
a[i]=sum;
printf("\n\n\t%d",a[i]);
}
}
void mutation(int arr[][6])
{
clrscr();
int x,y,j;
y=rand()%4;
x=rand()%5;
printf("\n\tMUTATION of element %d",y);
printf("\n\n\t AT POSITION %d",x);
printf("\n\n\tORIGINAL\n\n");
for(j=0;j<6;j++)
printf(" %d",arr[y][j]);
if(arr[y][x]==0)
arr[y][x]=1;
else
arr[y][x]=0;
printf("\n\n\tAFTER MUTATION\n\n");
for(j=0;j<6;j++)
printf(" %d",arr[y][j]);
}
void main()
{
clrscr();
randomize();
int a[4],approx[4],b[4],i=0;
int arr[4][6],sarr[4][6];
initialize(a);
encoding(a,arr);
while(i<5)
{
if(i==0)
{
while((selection(a,approx,sarr,arr,b))==0)
{
clrscr();
initialize(a);
encoding(a,arr);
}
}
else
selection(a,approx,sarr,arr,b);
crossover(sarr,a,b,arr);
if(getch()==13)
mutation(arr);
evaluate(arr,a);
getch();
i++;
}
getch();
}
Download Program


