/*
n - zadana liczba zmiennych
m - zadana liczba genów użyta do zakodowania jednej zmiennej
lp - zadana liczność populacji, z założenia parzysta
xmin[lp] - zadana jednowymiarowa tablica minimalnych wartości zmiennych projektowania
xmax[lp] - zadana jednowymiarowa tablica maksymalnych wartości zmiennych projektowania
f(x) - zadana funkcja przystosowania
x[n] - jednowymiarowa tablica zmiennych projektowania
fp[lp] - jednowymiarowa tablica funkcji przystosowania osobników populacji
tchr[lp][n*m] - dwuwymiarowa tablica chromosomów osobników rodzicielskich
nfp - funkcja przystosowania najlepszego aktualnie osobnika
nx[n] - jednowymiarowa tablica najlepszych aktualnie rozwiązań
tiz[lp] - jednowymiarowa tablica indeksów zwycięzców turniejów (potencjalnych rozwiązań rodzicielskich)
pk - zadane prawdopodobieństwo krzyżowania (bliskie 1)
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
/*parametry algorytmu widoczne w kazdej funkcji programu, wartosci testowe*/
#define n 2
#define m 24
#define lp 10
#define pk 0.97
/*zmienne globalne widoczne w kazdej funkcji programu, wartosci testowe*/
float xmin[n]={0,0};
float xmax[n]={20,20};
float nx[n];
float nfp;
float f(float x[n])
{
int i;
float s=0.;
for(i=0;i<n;i++) s+=x[i]*sin(x[i])*sin(x[i]);
return s;
}
void inicjalizacja_najlepszego_rozwiazania()
{
int i;
for(i=0;i<n;i++) nx[i]=xmin[i];
nfp=f(nx);
}
void drukuj_populacje(int tchr[lp][n*m])
{
int i,j;
for(i=0;i<lp;i++){
for(j=0;j<n*m;j++){
printf("%d",tchr[i][j]);
}
printf("\n");
}
printf("\n");
}
void inicjalizacja_pierwszej_populacji(int tchr[lp][n*m])
{
int i,j;
for(i=0;i<lp;i++){
for(j=0;j<n*m;j++){
tchr[i][j]=rand()%2;
}
}
}
void ocena_osobnikow_populacji(int tchr[lp][n*m], float fp[lp])
{
int i,j,k,ng;
float p2,wdi;
float x[n];
for(j=0;j<lp;j++){
for(i=0;i<n;i++){
p2=1.;
wdi=0.;
for(k=0;k<m;k++){
ng=i*m+k;
wdi+=tchr[j][ng]*p2;
p2*=2;
}
x[i]=xmin[i]+(xmax[i]-xmin[i])*wdi/(p2-1);
}
//for(k=0;k<n;k++) printf("%f\t",x[k]);
//printf("\n");
//for(k=0;k<n*m;k++) printf("%1d",tchr[j][k]);
//printf("\n");
fp[j]=f(x);
if(fp[j]>nfp){
nfp=fp[j];
for(k=0;k<n;k++) nx[k]=x[k];
}
}
}
void selekcja(float fp[lp], int tiz[lp])
{
int j;
for (j = 0;j<lp;j++)
{
int i1 = rand() % lp;
int i2 = rand() % lp;
if(fp[i1] > fp[i2])
{
tiz[j] = i1;
}
else
{
tiz[j] = i2;
}
}
}
void krzyzowanie(int tiz[lp], int tchr[lp][n*m], int tchp[lp][n*m])
{
int j,k,li=lp,i,i1,i2,r1,r2,p1,p2,n1,n2,pc;
for (j=0;j<lp/2;j++)
{
i1=rand() % li;
r1=tiz[i1];
tiz[i1]=tiz[li-1];
li--;
i2=rand() % li;
r2=tiz[i2];
tiz[i2]=tiz[li-1];
li--;
p1=2*j;
p2=p1+1;
float krzyz = rand() %100;
krzyz=(krzyz/100);
if(krzyz<=pk)
{
n1=1;
n2=n*m-1;
pc=rand() % (n1+1)+(n2-n1);
for (k=0;k<pc;k++)
{
tchp[p1][k]=tchr[r1][k];
tchp[p2][k]=tchr[r2][k];
}
for (k=pc;k<n*m;k++)
{
tchp[p1][k]=tchr[r2][k];
tchp[p2][k]=tchr[r1][k];
}
}
else
{
//printf("Nie krzyzuje\n");
for(k=0;k<n*m;k++)
{
tchp[p1][k]=tchr[r1][k];
tchp[p2][k]=tchr[r2][k];
}
}
}
}
int main()
{
int tchr[lp][n*m];
int tchp[lp][n*m];
float fp[lp];
int tiz[lp];
srand(time(0));
inicjalizacja_najlepszego_rozwiazania();
inicjalizacja_pierwszej_populacji(tchr);
ocena_osobnikow_populacji(tchr,fp);
selekcja(fp,tiz);
drukuj_populacje(tchr);
krzyzowanie(tiz,tchr,tchp);
drukuj_populacje(tchp);
return 0;
}