MPPT with GA, simulation full gen

Dependencies:   mbed TextLCD

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include <math.h>
00003 #include "stdio.h"
00004 
00005 AnalogIn arusIn(A0);
00006 AnalogIn tegIn(A1);
00007 AnalogIn arusOut(A2);
00008 AnalogIn tegOut(A3);
00009 AnalogIn suhuPv(A4);
00010 AnalogIn suhuCore(A5);
00011 
00012 DigitalOut led(LED1);
00013 
00014 const int nGen = 24;
00015 const double nGen1 = nGen;
00016 const int nIndividu = 50;
00017 const int nGenerasi = 40;
00018 const float kSil = 0.75;
00019 const float kMut = 0.5;
00020 
00021 int kromInduk[nIndividu][nGen];
00022 int kromKode[nIndividu][nGen];
00023 float indeksGen[nIndividu][1];
00024 float kromEval[nIndividu][nGen+2];
00025 float kromUrut[nIndividu][nGen+2];
00026 int r[nIndividu/2];
00027 bool kromSel[nIndividu/2][nGen];
00028 bool kromSilInduk[nIndividu/2][nGen];
00029 bool kromSilAnak[nIndividu/2][nGen];
00030 bool kromMut[nIndividu][nGen];
00031 int arrayku[nGen];
00032 const int nMut = kMut *nGen;
00033 int chGen[nMut];
00034 float kromUngGen[nGenerasi][nGen+1];
00035 int kromUng[nGen];
00036 float kromUngVal2;
00037 
00038 int h,i,k,a,j,l,m,n,b,c,x;
00039 float d,e;
00040 const int bawah = pow(2,nGen1)- 1;
00041 
00042 int xmin = 0;
00043 float xmax = 22.1;
00044 
00045 void bangkitGen(){
00046     
00047     //printf("\n1. Pembangkitan Kromosom Induk\n\r");
00048 
00049     for(m=0;m<nIndividu;m++){
00050         //Here I'd like to print each address field of each structure to the screen
00051         //printf("Kromosom ke-%d : ", m);
00052         for (n=0;n<nGen;n++){
00053             bool s = rand() % 2;
00054             kromInduk[m][n] = s;
00055             //printf("%i",kromInduk[m][n]);
00056         }
00057         //printf(" \n\r");
00058     }
00059     //printf(" \n\r");
00060 }
00061 
00062 void koding(){
00063   //printf("\n2. Pengkodean kromosom\n\r");
00064   
00065   for (m=0; m<nIndividu; m++){
00066     //printf("%d : ", m);
00067     float binerTotal = 0.00;
00068     for (n=0; n<nGen; n++){
00069       kromKode[m][n] = kromInduk[m][n];
00070       x = kromKode[m][n];
00071       binerTotal += x * pow(2,nGen1 - (n + 1));
00072       
00073       //printf("%i",kromInduk[m][n]);
00074     }
00075     float c = binerTotal /bawah;
00076     indeksGen[m][1] = (xmin + (xmax - xmin)) * c;
00077     d = indeksGen[m][1];
00078     //printf(", %.0f, %.2f", binerTotal, d);
00079     //printf(" \n\r");
00080   }
00081   //printf(" \n\r");
00082 }
00083 
00084 void evaluasi(){
00085   //printf("\n3. Evaluasi\n\r");
00086   bool f;
00087   float h;
00088   for (m=0; m<nIndividu; m++){
00089     //printf("%d : ", m);
00090     for (n=0; n<nGen; n++){
00091       kromEval[m][n] = kromKode[m][n];
00092       f = kromEval[m][n];
00093       //printf("%i",f);
00094     }
00095     
00096     float arusOut1;
00097     arusOut1 = arusOut.read() *10;
00098     float tegOut1;
00099     tegOut1 = tegOut.read() *12;
00100     float pOut;
00101     pOut = arusOut1 *tegOut1;
00102     kromEval[m][nGen] = indeksGen[m][1];
00103     kromEval[m][nGen+1] = pOut;
00104     h = kromEval[m][nGen+1];
00105     //printf(",%.2f", h);
00106     //printf(" \n\r");
00107   }
00108   //printf(" \n\r");
00109 }
00110 
00111 void maks(){
00112   int i;
00113   float maks = 0.00;
00114   int imaks = 0;
00115   float val;
00116   for (i=0; i<nIndividu; i++){
00117     val = kromUrut[i][nGen+1];
00118     if (val > maks){
00119       maks = val;
00120       imaks = i;
00121     }
00122     else{
00123       maks = maks;
00124       imaks = imaks;
00125     }
00126   }
00127   r[l] = imaks;
00128   //printf("%i, %.2f: ", imaks, maks);
00129   for (n=0; n<nGen; n++){
00130     int ag = kromUrut[imaks][n];
00131     kromSel[l][n] = ag;
00132     kromUrut[imaks][nGen+1] = 0;
00133     //printf("%i",ag);
00134   }
00135   //printf(" \n\r");
00136 }
00137 
00138 void urut(){
00139   //printf("\n4. Seleksi\n\r");
00140   for (m=0; m<nIndividu; m++){
00141     for (n=0; n<=(nGen+1); n++){
00142       kromUrut[m][n] = kromEval[m][n];
00143     }
00144   }
00145 
00146   for (l=0; l<(nIndividu/2); l++){
00147     maks();
00148   }
00149   //printf(" \n\r");
00150 }
00151 
00152 void silang(){
00153   //printf("\n5. Penyilangan\n\r");
00154   //printf("\nInduk\n\r");
00155 
00156   for (m=0; m<nIndividu/2; m++){
00157     for (n=0; n<nGen; n++){
00158       int sx = kromSel[m][n];
00159       //printf("%i",sx);
00160       kromSilInduk[m][n] = sx;
00161     }
00162     //printf(" \n\r");
00163   }
00164   //printf(" \n\r");
00165   //printf("\nAnak\n\r");
00166   int pSil = kSil *nGen;
00167   for (m=0; m<nIndividu/4; m++){
00168     for (int ma=0; ma<pSil; ma++){
00169       int ms1 = kromSilInduk[m*2][ma];
00170       kromSilAnak[m*2][ma] = ms1;
00171       int ms2 = kromSilInduk[(m*2)+1][ma];
00172       kromSilAnak[(m*2)+1][ma] = ms2;
00173     }
00174     for (int mb=pSil; mb<=nGen; mb++){
00175       int mb1 = kromSilInduk[(m*2)+1][mb];
00176       kromSilAnak[m*2][mb] = mb1;
00177       int mb2 = kromSilInduk[m*2][mb];
00178       kromSilAnak[(m*2)+1][mb] = mb2;
00179     }
00180   }
00181   for (int ma=0; ma<pSil; ma++){
00182     int ms1 = kromSilInduk[0][ma];
00183     kromSilAnak[0][ma] = ms1;
00184     int ms2 = kromSilInduk[1][ma];
00185     kromSilAnak[1][ma] = ms2;
00186   }
00187   for (int mb=pSil; mb<=nGen; mb++){
00188     int mb1 = kromSilInduk[1][mb];
00189     kromSilAnak[0][mb] = mb1;
00190     int mb2 = kromSilInduk[0][mb];
00191     kromSilAnak[1][mb] = mb2;
00192   }
00193 
00194   for (m=0; m<nIndividu/2; m++){
00195     for (n=0; n<nGen; n++){
00196       int cb1 = kromSilAnak[m][n];
00197       //printf("%i",cb1);
00198     }
00199     //printf(" \n\r");
00200   }
00201   //printf(" \n\r");
00202 }
00203 
00204 void genArray(){
00205   for (int r=0; r<nGen; r++){
00206     arrayku[r] = r;
00207   }
00208 }
00209 
00210 void pickRandom(){
00211   genArray();
00212   for (int i=0; i<(nGen-nMut); i++){
00213     int ame = (nGen-1)-i;
00214     int choosen = rand() % ame;
00215     arrayku[choosen] = 0;
00216 
00217     for (int l=choosen; l<nGen; l++){
00218       int m = arrayku[l+1];
00219       arrayku[l] = m;
00220     }
00221     
00222   }
00223   
00224   //printf("Nomor gen termutasi: ");
00225   for (int q=0; q<nMut; q++){
00226     chGen[q] = arrayku[q];
00227     int p = chGen[q];
00228     //printf("%i,",p);
00229   }
00230   //printf(" \n\r");
00231 }
00232 
00233 void mutasi(){
00234   //printf("\n6. Mutasi\n\r");
00235   pickRandom();
00236   
00237   for (m=0; m<nIndividu/2; m++){
00238     for (n=0; n<nGen; n++){
00239       int sy = kromSilInduk[m][n];
00240       kromMut[m][n] = sy;
00241     }
00242   }
00243   for (m=nIndividu/2; m<=nIndividu; m++){
00244     for (n=0; n<nGen; n++){
00245       int sh = kromSilAnak[m - (nIndividu/2)][n];
00246       kromMut[m][n] = sh;
00247     }
00248   }
00249   
00250   for (m=0; m<nIndividu; m++){
00251     for (n=0; n<nGen; n++){
00252     }
00253   }
00254 
00255   for (int s=0; s<nIndividu; s++){
00256     for (int t=0; t<nMut; t++){
00257       int u = chGen[t];
00258       if (kromMut[s][u]==1){
00259         kromMut[s][u] = 0;
00260       }
00261       else{
00262         kromMut[s][u] = 1;
00263       }
00264     }
00265   }
00266 
00267   printf(" \n\r");
00268 
00269   for (int v=0; v<nIndividu; v++){
00270     for (int x=0; x<nGen; x++){
00271       int wa = kromMut[v][x];
00272       //printf("%i",wa);
00273     }
00274     //printf(" \n\r");
00275   }
00276 }
00277 
00278 void maksGen(){
00279   float maks = 0.00;
00280   int imaks = 0;
00281   float val;
00282   for (i=0; i<nGenerasi; i++){
00283     val = kromUngGen[i][nGen];
00284     if (val > maks){
00285       maks = val;
00286       imaks = i;
00287     }
00288     else{
00289       maks = maks;
00290       imaks = imaks;
00291     }
00292   }
00293   printf("Generasi ke- %i\n\r", imaks);
00294   printf("Nilai fitness : %.2f\n\r", maks);
00295   printf("Kromosom :  ");
00296   for (n=0; n<nGen; n++){
00297     int ag = kromUngGen[imaks][n];
00298     kromUng[n] = ag;
00299     kromUrut[imaks][nGen] = 0;
00300     printf("%i", ag);
00301   }
00302   printf(" \n\r");
00303   float binerTotal = 0.00;
00304   for (n=0; n<nGen; n++){
00305     x = kromUng[n];
00306     binerTotal += x * pow(2,nGen1 - (n + 1));
00307   }
00308   float c = binerTotal /bawah;
00309   float vRep = (xmin + (xmax - xmin)) * c;
00310   printf("Nilai representasi :  %.2f\n\r", vRep);
00311 }
00312 
00313 void urutGen(){
00314   printf(" \n\r");
00315   printf("\nKromosom unggul tercapai pada : \n\r");
00316   for (m=0; m<nGenerasi; m++){
00317     for (n=0; n<=(nGen); n++){
00318       kromUrut[m][n] = kromUngGen[m][n];
00319     }
00320   }
00321   maksGen();
00322 }
00323 
00324 int main()
00325 {
00326   printf("\n----------ALGORITMA GENETIKA - MPPT----------\n\r");
00327   float kromUngVal;
00328   
00329   float suhuPv1;
00330   suhuPv1 = suhuPv.read();
00331   float suhuCore1;
00332   suhuCore1 = suhuCore.read();
00333   printf("\nSuhu PV : %.2f\n\r", suhuPv1);
00334   printf("Suhu Core : %.2f\n\r", suhuCore1);
00335   
00336   bangkitGen();
00337   printf("\nKromosom unggul setiap generasi :\n\r");
00338   for (i=0; i<nGenerasi; i++){
00339     led = 1;
00340     koding();
00341     evaluasi();
00342     urut();
00343     silang();
00344     mutasi();
00345     led = 0;
00346   
00347     for (m=0; m<nIndividu; m++){
00348       for (n=0; n<nGen; n++){
00349         kromInduk[m][n] = kromMut[m][n];
00350       }
00351     }
00352     koding();
00353     evaluasi();
00354     urut();
00355     
00356     printf(" Generasi ke-%d : ", i);
00357     for (m=0; m<nGen; m++){
00358       kromUngGen[i][m] = kromSel[0][m];
00359       printf("%.0f",kromUngGen[i][m]);
00360     }
00361     kromUngVal = kromEval[r[0]][nGen+1];
00362     kromUngGen[i][nGen] = kromUngVal;
00363     
00364     kromUngVal2 = kromUngGen[i][nGen];
00365     printf(" : %.2f", kromUngVal2);
00366     printf(" \r");
00367     
00368   }
00369   urutGen();
00370 }