prisma megan
/
ga-mppt_sim_1gen
Diff: main.cpp
- Revision:
- 0:3670c5137ff2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Aug 02 04:51:34 2021 +0000 @@ -0,0 +1,293 @@ +#include "mbed.h" +#include <math.h> + +AnalogIn analog_value(A1); + +DigitalOut led(LED1); + +const int nGen = 10; +const double nGen1 = nGen; +const int nIndividu = 8; +const int nGenerasi = 10; +const float kSil = 0.75; +const float kMut = 0.5; + +int kromInduk[nIndividu][nGen]; +int kromKode[nIndividu][nGen]; +float indeksGen[nIndividu][1]; +float kromEval[nIndividu][nGen+2]; +float kromUrut[nIndividu][nGen+2]; +int r[nIndividu/2]; +bool kromSel[nIndividu/2][nGen]; +bool kromSilInduk[nIndividu/2][nGen]; +bool kromSilAnak[nIndividu/2][nGen]; +bool kromMut[nIndividu][nGen]; +int arrayku[nGen]; +const int nMut = kMut *nGen; +int chGen[nMut]; +float kromUngGen[nGenerasi][nGen+1]; + +int h,i,k,a,j,l,m,n,b,c,x; +float d,e; +const int bawah = pow(2,nGen1)- 1; + +int xmin = 0; +float xmax = 22.1; + +void bangkitGen(){ + + printf("\n1. Pembangkitan Kromosom Induk\n\r"); + + for(m=0;m<nIndividu;m++){ + //Here I'd like to print each address field of each structure to the screen + printf("Kromosom ke-%d : ", m); + for (n=0;n<nGen;n++){ + bool s = rand() % 2; + kromInduk[m][n] = s; + printf("%i",kromInduk[m][n]); + } + printf(" \n\r"); + } + printf(" \n\r"); +} + +void koding(){ + printf("\n2. Pengkodean kromosom\n\r"); + + for (m=0; m<nIndividu; m++){ + printf("%d : ", m); + float binerTotal = 0.00; + for (n=0; n<nGen; n++){ + kromKode[m][n] = kromInduk[m][n]; + x = kromKode[m][n]; + binerTotal += x * pow(2,nGen1 - (n + 1)); + + printf("%i",kromInduk[m][n]); + } + float c = binerTotal /bawah; + indeksGen[m][1] = (xmin + (xmax - xmin)) * c; + d = indeksGen[m][1]; + printf(", %.0f, %.2f", binerTotal, d); + printf(" \n\r"); + } + printf(" \n\r"); +} + +void evaluasi(){ + printf("\n3. Evaluasi\n\r"); + bool f; + float h; + for (m=0; m<nIndividu; m++){ + printf("%d : ", m); + for (n=0; n<nGen; n++){ + kromEval[m][n] = kromKode[m][n]; + f = kromEval[m][n]; + printf("%i",f); + } + kromEval[m][nGen] = indeksGen[m][1]; + kromEval[m][nGen+1] = indeksGen[m][1] * 4.0; + h = kromEval[m][nGen+1]; + printf(",%.2f", h); + printf(" \n\r"); + } + printf(" \n\r"); +} + +void maks(){ + int i; + float maks = 0.00; + int imaks = 0; + float val; + for (i=0; i<nIndividu; i++){ + val = kromUrut[i][nGen+1]; + if (val > maks){ + maks = val; + imaks = i; + } + else{ + maks = maks; + imaks = imaks; + } + } + r[l] = imaks; + printf("%i, %.2f: ", imaks, maks); + for (n=0; n<nGen; n++){ + int ag = kromUrut[imaks][n]; + kromSel[l][n] = ag; + kromUrut[imaks][nGen+1] = 0; + printf("%i",ag); + } + printf(" \n\r"); +} + +void urut(){ + printf("\n4. Seleksi\n\r"); + for (m=0; m<nIndividu; m++){ + for (n=0; n<=(nGen+1); n++){ + kromUrut[m][n] = kromEval[m][n]; + } + } + + for (l=0; l<(nIndividu/2); l++){ + maks(); + } + printf(" \n\r"); +} + +void silang(){ + printf("\n5. Penyilangan\n\r"); + printf("\nInduk\n\r"); + + for (m=0; m<nIndividu/2; m++){ + for (n=0; n<nGen; n++){ + int sx = kromSel[m][n]; + printf("%i",sx); + kromSilInduk[m][n] = sx; + } + printf(" \n\r"); + } + printf(" \n\r"); + printf("\nAnak\n\r"); + int pSil = kSil *nGen; + for (m=0; m<nIndividu/4; m++){ + for (int ma=0; ma<pSil; ma++){ + int ms1 = kromSilInduk[m*2][ma]; + kromSilAnak[m*2][ma] = ms1; + int ms2 = kromSilInduk[(m*2)+1][ma]; + kromSilAnak[(m*2)+1][ma] = ms2; + } + for (int mb=pSil; mb<=nGen; mb++){ + int mb1 = kromSilInduk[(m*2)+1][mb]; + kromSilAnak[m*2][mb] = mb1; + int mb2 = kromSilInduk[m*2][mb]; + kromSilAnak[(m*2)+1][mb] = mb2; + } + } + for (int ma=0; ma<pSil; ma++){ + int ms1 = kromSilInduk[0][ma]; + kromSilAnak[0][ma] = ms1; + int ms2 = kromSilInduk[1][ma]; + kromSilAnak[1][ma] = ms2; + } + for (int mb=pSil; mb<=nGen; mb++){ + int mb1 = kromSilInduk[1][mb]; + kromSilAnak[0][mb] = mb1; + int mb2 = kromSilInduk[0][mb]; + kromSilAnak[1][mb] = mb2; + } + + for (m=0; m<nIndividu/2; m++){ + for (n=0; n<nGen; n++){ + int cb1 = kromSilAnak[m][n]; + printf("%i",cb1); + } + printf(" \n\r"); + } + printf(" \n\r"); +} + +void genArray(){ + for (int r=0; r<nGen; r++){ + arrayku[r] = r; + } +} + +void pickRandom(){ + genArray(); + for (int i=0; i<(nGen-nMut); i++){ + int ame = (nGen-1)-i; + int choosen = rand() % ame; + arrayku[choosen] = 0; + + for (int l=choosen; l<nGen; l++){ + int m = arrayku[l+1]; + arrayku[l] = m; + } + + } + + printf("Nomor gen termutasi: "); + for (int q=0; q<nMut; q++){ + chGen[q] = arrayku[q]; + int p = chGen[q]; + printf("%i,",p); + } + printf(" \n\r"); +} + +void mutasi(){ + printf("\n6. Mutasi\n\r"); + pickRandom(); + + for (m=0; m<nIndividu/2; m++){ + for (n=0; n<nGen; n++){ + int sy = kromSilInduk[m][n]; + kromMut[m][n] = sy; + } + } + for (m=nIndividu/2; m<=nIndividu; m++){ + for (n=0; n<nGen; n++){ + int sh = kromSilAnak[m - (nIndividu/2)][n]; + kromMut[m][n] = sh; + } + } + + for (m=0; m<nIndividu; m++){ + for (n=0; n<nGen; n++){ + } + } + + for (int s=0; s<nIndividu; s++){ + for (int t=0; t<nMut; t++){ + int u = chGen[t]; + if (kromMut[s][u]==1){ + kromMut[s][u] = 0; + } + else{ + kromMut[s][u] = 1; + } + } + } + + printf(" \n\r"); + + for (int v=0; v<nIndividu; v++){ + for (int x=0; x<nGen; x++){ + int wa = kromMut[v][x]; + printf("%i",wa); + } + printf(" \n\r"); + } +} + +int main() +{ + bangkitGen(); + printf("\nKromosom unggul setiap generasi :\n\r"); + for (i=0; i<1; i++){ + koding(); + evaluasi(); + urut(); + silang(); + mutasi(); + + for (m=0; m<nIndividu; m++){ + for (n=0; n<nGen; n++){ + kromInduk[m][n] = kromMut[m][n]; + } + } + koding(); + evaluasi(); + urut(); + + printf("Generasi ke-%d : ", i); + for (m=0; m<nGen; m++){ + kromUngGen[i][m] = kromSel[0][m]; + printf("%.0f",kromUngGen[i][m]); + } + kromUngGen[i][nGen+1] = kromEval[r[0]][nGen+1]; + float kromUngVal = kromUngGen[i][nGen+1]; + printf(" : %.2f", kromUngVal); + printf(" \n\r"); + } +} \ No newline at end of file