/* 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; }