MPPT with GA, simulation full gen
Revision 0:862d3839389c, committed 2021-08-02
- Comitter:
- PrismaMegan
- Date:
- Mon Aug 02 04:53:52 2021 +0000
- Commit message:
- MPPT with GA, simulation full gen
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TextLCD.lib Mon Aug 02 04:53:52 2021 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/TextLCD/#308d188a2d3a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Mon Aug 02 04:53:52 2021 +0000
@@ -0,0 +1,370 @@
+#include "mbed.h"
+#include <math.h>
+#include "stdio.h"
+
+AnalogIn arusIn(A0);
+AnalogIn tegIn(A1);
+AnalogIn arusOut(A2);
+AnalogIn tegOut(A3);
+AnalogIn suhuPv(A4);
+AnalogIn suhuCore(A5);
+
+DigitalOut led(LED1);
+
+const int nGen = 24;
+const double nGen1 = nGen;
+const int nIndividu = 50;
+const int nGenerasi = 40;
+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 kromUng[nGen];
+float kromUngVal2;
+
+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);
+ }
+
+ float arusOut1;
+ arusOut1 = arusOut.read() *10;
+ float tegOut1;
+ tegOut1 = tegOut.read() *12;
+ float pOut;
+ pOut = arusOut1 *tegOut1;
+ kromEval[m][nGen] = indeksGen[m][1];
+ kromEval[m][nGen+1] = pOut;
+ 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");
+ }
+}
+
+void maksGen(){
+ float maks = 0.00;
+ int imaks = 0;
+ float val;
+ for (i=0; i<nGenerasi; i++){
+ val = kromUngGen[i][nGen];
+ if (val > maks){
+ maks = val;
+ imaks = i;
+ }
+ else{
+ maks = maks;
+ imaks = imaks;
+ }
+ }
+ printf("Generasi ke- %i\n\r", imaks);
+ printf("Nilai fitness : %.2f\n\r", maks);
+ printf("Kromosom : ");
+ for (n=0; n<nGen; n++){
+ int ag = kromUngGen[imaks][n];
+ kromUng[n] = ag;
+ kromUrut[imaks][nGen] = 0;
+ printf("%i", ag);
+ }
+ printf(" \n\r");
+ float binerTotal = 0.00;
+ for (n=0; n<nGen; n++){
+ x = kromUng[n];
+ binerTotal += x * pow(2,nGen1 - (n + 1));
+ }
+ float c = binerTotal /bawah;
+ float vRep = (xmin + (xmax - xmin)) * c;
+ printf("Nilai representasi : %.2f\n\r", vRep);
+}
+
+void urutGen(){
+ printf(" \n\r");
+ printf("\nKromosom unggul tercapai pada : \n\r");
+ for (m=0; m<nGenerasi; m++){
+ for (n=0; n<=(nGen); n++){
+ kromUrut[m][n] = kromUngGen[m][n];
+ }
+ }
+ maksGen();
+}
+
+int main()
+{
+ printf("\n----------ALGORITMA GENETIKA - MPPT----------\n\r");
+ float kromUngVal;
+
+ float suhuPv1;
+ suhuPv1 = suhuPv.read();
+ float suhuCore1;
+ suhuCore1 = suhuCore.read();
+ printf("\nSuhu PV : %.2f\n\r", suhuPv1);
+ printf("Suhu Core : %.2f\n\r", suhuCore1);
+
+ bangkitGen();
+ printf("\nKromosom unggul setiap generasi :\n\r");
+ for (i=0; i<nGenerasi; i++){
+ led = 1;
+ koding();
+ evaluasi();
+ urut();
+ silang();
+ mutasi();
+ led = 0;
+
+ 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]);
+ }
+ kromUngVal = kromEval[r[0]][nGen+1];
+ kromUngGen[i][nGen] = kromUngVal;
+
+ kromUngVal2 = kromUngGen[i][nGen];
+ printf(" : %.2f", kromUngVal2);
+ printf(" \r");
+
+ }
+ urutGen();
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Aug 02 04:53:52 2021 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/b484a57bc302 \ No newline at end of file