/* 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 tchp[lp][n*m] - dwuwymiarowa tablica chromosomów osobników potomnych 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) pm - zadane prawdopodobieństwo mutacji (bliskie zera) lg - liczba generacji (iteracji) */ #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 100 #define pk 0.99 #define pm 0.01 #define lg 200 /*zmienne globalne widoczne w kazdej funkcji programu, wartosci testowe*/ float xmin[n]={0,0}; float xmax[n]={20,20}; float nx[n]; //sensownie zainicjowac float nfp=-1e30; //sensownie zainicjowac 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("%1d",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,i1,i2; FOR(j=0;j<lp;j++){ i1=rand()%lp; 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 li,j,i1,i2,r1,r2,k,p1,p2,pc; li=lp; FOR(j=0;j<lp/2;j++){ i1=rand()%li; r1=tiz[i1]; li--; tiz[i1]=tiz[li]; i2=rand()%li; r2=tiz[i2]; li--; tiz[i2]=tiz[li]; p1=2*j; p2=p1+1; IF(((float)rand()/RAND_MAX)<=pk){ pc=rand()%(n*m-1)+1; 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{ FOR(k=0;k<n*m;k++){ tchp[p1][k]=tchr[r1][k]; tchp[p2][k]=tchr[r2][k]; } } } } void mutacja(INT tchp[lp][n*m]) { INT i,j; FOR(i = 0; i < lp; i++) FOR(j = 0; j < n*m; j++) IF((float) (rand()%RAND_MAX) <= pm) { IF(tchp[i][j] == 1) { tchp[i][j] = 0; } ELSE { tchp[i][j] = 1; } } } void sukcesja(INT tchp[lp][n*m], INT tchr[lp][n*m]) { INT i,j; FOR(i = 0; i < lp; i++) { FOR(j = 0; j < n*m; j++) { tchr[i][j] = tchp[i][j]; } } } void drukuj_rozwiazanie() { INT i; printf("%f\n",nfp); FOR(i=0;i<n;i++) printf("%15.6f",nx[i]); printf("\n"); } INT main() { INT tchr[lp][n*m]; INT tchp[lp][n*m]; float fp[lp]; INT tiz[lp]; INT l,i; DOUBLE ar1=0, war1=0; srand(time(0)); l=0; inicjalizacja_najlepszego_rozwiazania(); inicjalizacja_pierwszej_populacji(tchr); FOR(i=0;i<1000;i++) { DO{ ocena_osobnikow_populacji(tchr,fp); selekcja(fp,tiz); // printf("Rodzice\n"); // drukuj_populacje(tchr); krzyzowanie(tiz,tchr,tchp); // printf("Krzyzowanie\n"); // drukuj_populacje(tchp); mutacja(tchp); // printf("Mutacja\n"); // drukuj_populacje(tchp); sukcesja(tchp,tchr); // printf("Sukcesja\n"); // drukuj_populacje(tchr); l++; l++; }WHILE(l<=lg); drukuj_rozwiazanie(); } RETURN 0; }