Dependencies:   mbed

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