/* 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.98 /*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,iteracja=1; for (j=0;j<lp/2;j++) { printf("iteracja %d\n",iteracja); iteracja++; li=li-1; i1=rand() % li; r1=tiz[i1]; tiz[i1]=tiz[li]; li=li-1; i2=rand() % li; r2=tiz[i2]; tiz[i2]=tiz[li]; p1=2*j; p2=p1+1; //double krzyz = (double) rand() / RAND_MAX; int krzyz = rand() %2; if(krzyz<=pk) { n1=1; n2=n*m-1; pc=rand() % n2; 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]; } } drukuj_populacje(tchp); } } 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; }