MPPT with GA, simulation full gen
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Sat Jul 16 2022 11:26:24 by
1.7.2