Dependencies:   mbed

Committer:
PrismaMegan
Date:
Mon Aug 02 04:51:34 2021 +0000
Revision:
0:3670c5137ff2
MPPT with GA

Who changed what in which revision?

UserRevisionLine numberNew contents of line
PrismaMegan 0:3670c5137ff2 1 #include "mbed.h"
PrismaMegan 0:3670c5137ff2 2 #include <math.h>
PrismaMegan 0:3670c5137ff2 3
PrismaMegan 0:3670c5137ff2 4 AnalogIn analog_value(A1);
PrismaMegan 0:3670c5137ff2 5
PrismaMegan 0:3670c5137ff2 6 DigitalOut led(LED1);
PrismaMegan 0:3670c5137ff2 7
PrismaMegan 0:3670c5137ff2 8 const int nGen = 10;
PrismaMegan 0:3670c5137ff2 9 const double nGen1 = nGen;
PrismaMegan 0:3670c5137ff2 10 const int nIndividu = 8;
PrismaMegan 0:3670c5137ff2 11 const int nGenerasi = 10;
PrismaMegan 0:3670c5137ff2 12 const float kSil = 0.75;
PrismaMegan 0:3670c5137ff2 13 const float kMut = 0.5;
PrismaMegan 0:3670c5137ff2 14
PrismaMegan 0:3670c5137ff2 15 int kromInduk[nIndividu][nGen];
PrismaMegan 0:3670c5137ff2 16 int kromKode[nIndividu][nGen];
PrismaMegan 0:3670c5137ff2 17 float indeksGen[nIndividu][1];
PrismaMegan 0:3670c5137ff2 18 float kromEval[nIndividu][nGen+2];
PrismaMegan 0:3670c5137ff2 19 float kromUrut[nIndividu][nGen+2];
PrismaMegan 0:3670c5137ff2 20 int r[nIndividu/2];
PrismaMegan 0:3670c5137ff2 21 bool kromSel[nIndividu/2][nGen];
PrismaMegan 0:3670c5137ff2 22 bool kromSilInduk[nIndividu/2][nGen];
PrismaMegan 0:3670c5137ff2 23 bool kromSilAnak[nIndividu/2][nGen];
PrismaMegan 0:3670c5137ff2 24 bool kromMut[nIndividu][nGen];
PrismaMegan 0:3670c5137ff2 25 int arrayku[nGen];
PrismaMegan 0:3670c5137ff2 26 const int nMut = kMut *nGen;
PrismaMegan 0:3670c5137ff2 27 int chGen[nMut];
PrismaMegan 0:3670c5137ff2 28 float kromUngGen[nGenerasi][nGen+1];
PrismaMegan 0:3670c5137ff2 29
PrismaMegan 0:3670c5137ff2 30 int h,i,k,a,j,l,m,n,b,c,x;
PrismaMegan 0:3670c5137ff2 31 float d,e;
PrismaMegan 0:3670c5137ff2 32 const int bawah = pow(2,nGen1)- 1;
PrismaMegan 0:3670c5137ff2 33
PrismaMegan 0:3670c5137ff2 34 int xmin = 0;
PrismaMegan 0:3670c5137ff2 35 float xmax = 22.1;
PrismaMegan 0:3670c5137ff2 36
PrismaMegan 0:3670c5137ff2 37 void bangkitGen(){
PrismaMegan 0:3670c5137ff2 38
PrismaMegan 0:3670c5137ff2 39 printf("\n1. Pembangkitan Kromosom Induk\n\r");
PrismaMegan 0:3670c5137ff2 40
PrismaMegan 0:3670c5137ff2 41 for(m=0;m<nIndividu;m++){
PrismaMegan 0:3670c5137ff2 42 //Here I'd like to print each address field of each structure to the screen
PrismaMegan 0:3670c5137ff2 43 printf("Kromosom ke-%d : ", m);
PrismaMegan 0:3670c5137ff2 44 for (n=0;n<nGen;n++){
PrismaMegan 0:3670c5137ff2 45 bool s = rand() % 2;
PrismaMegan 0:3670c5137ff2 46 kromInduk[m][n] = s;
PrismaMegan 0:3670c5137ff2 47 printf("%i",kromInduk[m][n]);
PrismaMegan 0:3670c5137ff2 48 }
PrismaMegan 0:3670c5137ff2 49 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 50 }
PrismaMegan 0:3670c5137ff2 51 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 52 }
PrismaMegan 0:3670c5137ff2 53
PrismaMegan 0:3670c5137ff2 54 void koding(){
PrismaMegan 0:3670c5137ff2 55 printf("\n2. Pengkodean kromosom\n\r");
PrismaMegan 0:3670c5137ff2 56
PrismaMegan 0:3670c5137ff2 57 for (m=0; m<nIndividu; m++){
PrismaMegan 0:3670c5137ff2 58 printf("%d : ", m);
PrismaMegan 0:3670c5137ff2 59 float binerTotal = 0.00;
PrismaMegan 0:3670c5137ff2 60 for (n=0; n<nGen; n++){
PrismaMegan 0:3670c5137ff2 61 kromKode[m][n] = kromInduk[m][n];
PrismaMegan 0:3670c5137ff2 62 x = kromKode[m][n];
PrismaMegan 0:3670c5137ff2 63 binerTotal += x * pow(2,nGen1 - (n + 1));
PrismaMegan 0:3670c5137ff2 64
PrismaMegan 0:3670c5137ff2 65 printf("%i",kromInduk[m][n]);
PrismaMegan 0:3670c5137ff2 66 }
PrismaMegan 0:3670c5137ff2 67 float c = binerTotal /bawah;
PrismaMegan 0:3670c5137ff2 68 indeksGen[m][1] = (xmin + (xmax - xmin)) * c;
PrismaMegan 0:3670c5137ff2 69 d = indeksGen[m][1];
PrismaMegan 0:3670c5137ff2 70 printf(", %.0f, %.2f", binerTotal, d);
PrismaMegan 0:3670c5137ff2 71 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 72 }
PrismaMegan 0:3670c5137ff2 73 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 74 }
PrismaMegan 0:3670c5137ff2 75
PrismaMegan 0:3670c5137ff2 76 void evaluasi(){
PrismaMegan 0:3670c5137ff2 77 printf("\n3. Evaluasi\n\r");
PrismaMegan 0:3670c5137ff2 78 bool f;
PrismaMegan 0:3670c5137ff2 79 float h;
PrismaMegan 0:3670c5137ff2 80 for (m=0; m<nIndividu; m++){
PrismaMegan 0:3670c5137ff2 81 printf("%d : ", m);
PrismaMegan 0:3670c5137ff2 82 for (n=0; n<nGen; n++){
PrismaMegan 0:3670c5137ff2 83 kromEval[m][n] = kromKode[m][n];
PrismaMegan 0:3670c5137ff2 84 f = kromEval[m][n];
PrismaMegan 0:3670c5137ff2 85 printf("%i",f);
PrismaMegan 0:3670c5137ff2 86 }
PrismaMegan 0:3670c5137ff2 87 kromEval[m][nGen] = indeksGen[m][1];
PrismaMegan 0:3670c5137ff2 88 kromEval[m][nGen+1] = indeksGen[m][1] * 4.0;
PrismaMegan 0:3670c5137ff2 89 h = kromEval[m][nGen+1];
PrismaMegan 0:3670c5137ff2 90 printf(",%.2f", h);
PrismaMegan 0:3670c5137ff2 91 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 92 }
PrismaMegan 0:3670c5137ff2 93 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 94 }
PrismaMegan 0:3670c5137ff2 95
PrismaMegan 0:3670c5137ff2 96 void maks(){
PrismaMegan 0:3670c5137ff2 97 int i;
PrismaMegan 0:3670c5137ff2 98 float maks = 0.00;
PrismaMegan 0:3670c5137ff2 99 int imaks = 0;
PrismaMegan 0:3670c5137ff2 100 float val;
PrismaMegan 0:3670c5137ff2 101 for (i=0; i<nIndividu; i++){
PrismaMegan 0:3670c5137ff2 102 val = kromUrut[i][nGen+1];
PrismaMegan 0:3670c5137ff2 103 if (val > maks){
PrismaMegan 0:3670c5137ff2 104 maks = val;
PrismaMegan 0:3670c5137ff2 105 imaks = i;
PrismaMegan 0:3670c5137ff2 106 }
PrismaMegan 0:3670c5137ff2 107 else{
PrismaMegan 0:3670c5137ff2 108 maks = maks;
PrismaMegan 0:3670c5137ff2 109 imaks = imaks;
PrismaMegan 0:3670c5137ff2 110 }
PrismaMegan 0:3670c5137ff2 111 }
PrismaMegan 0:3670c5137ff2 112 r[l] = imaks;
PrismaMegan 0:3670c5137ff2 113 printf("%i, %.2f: ", imaks, maks);
PrismaMegan 0:3670c5137ff2 114 for (n=0; n<nGen; n++){
PrismaMegan 0:3670c5137ff2 115 int ag = kromUrut[imaks][n];
PrismaMegan 0:3670c5137ff2 116 kromSel[l][n] = ag;
PrismaMegan 0:3670c5137ff2 117 kromUrut[imaks][nGen+1] = 0;
PrismaMegan 0:3670c5137ff2 118 printf("%i",ag);
PrismaMegan 0:3670c5137ff2 119 }
PrismaMegan 0:3670c5137ff2 120 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 121 }
PrismaMegan 0:3670c5137ff2 122
PrismaMegan 0:3670c5137ff2 123 void urut(){
PrismaMegan 0:3670c5137ff2 124 printf("\n4. Seleksi\n\r");
PrismaMegan 0:3670c5137ff2 125 for (m=0; m<nIndividu; m++){
PrismaMegan 0:3670c5137ff2 126 for (n=0; n<=(nGen+1); n++){
PrismaMegan 0:3670c5137ff2 127 kromUrut[m][n] = kromEval[m][n];
PrismaMegan 0:3670c5137ff2 128 }
PrismaMegan 0:3670c5137ff2 129 }
PrismaMegan 0:3670c5137ff2 130
PrismaMegan 0:3670c5137ff2 131 for (l=0; l<(nIndividu/2); l++){
PrismaMegan 0:3670c5137ff2 132 maks();
PrismaMegan 0:3670c5137ff2 133 }
PrismaMegan 0:3670c5137ff2 134 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 135 }
PrismaMegan 0:3670c5137ff2 136
PrismaMegan 0:3670c5137ff2 137 void silang(){
PrismaMegan 0:3670c5137ff2 138 printf("\n5. Penyilangan\n\r");
PrismaMegan 0:3670c5137ff2 139 printf("\nInduk\n\r");
PrismaMegan 0:3670c5137ff2 140
PrismaMegan 0:3670c5137ff2 141 for (m=0; m<nIndividu/2; m++){
PrismaMegan 0:3670c5137ff2 142 for (n=0; n<nGen; n++){
PrismaMegan 0:3670c5137ff2 143 int sx = kromSel[m][n];
PrismaMegan 0:3670c5137ff2 144 printf("%i",sx);
PrismaMegan 0:3670c5137ff2 145 kromSilInduk[m][n] = sx;
PrismaMegan 0:3670c5137ff2 146 }
PrismaMegan 0:3670c5137ff2 147 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 148 }
PrismaMegan 0:3670c5137ff2 149 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 150 printf("\nAnak\n\r");
PrismaMegan 0:3670c5137ff2 151 int pSil = kSil *nGen;
PrismaMegan 0:3670c5137ff2 152 for (m=0; m<nIndividu/4; m++){
PrismaMegan 0:3670c5137ff2 153 for (int ma=0; ma<pSil; ma++){
PrismaMegan 0:3670c5137ff2 154 int ms1 = kromSilInduk[m*2][ma];
PrismaMegan 0:3670c5137ff2 155 kromSilAnak[m*2][ma] = ms1;
PrismaMegan 0:3670c5137ff2 156 int ms2 = kromSilInduk[(m*2)+1][ma];
PrismaMegan 0:3670c5137ff2 157 kromSilAnak[(m*2)+1][ma] = ms2;
PrismaMegan 0:3670c5137ff2 158 }
PrismaMegan 0:3670c5137ff2 159 for (int mb=pSil; mb<=nGen; mb++){
PrismaMegan 0:3670c5137ff2 160 int mb1 = kromSilInduk[(m*2)+1][mb];
PrismaMegan 0:3670c5137ff2 161 kromSilAnak[m*2][mb] = mb1;
PrismaMegan 0:3670c5137ff2 162 int mb2 = kromSilInduk[m*2][mb];
PrismaMegan 0:3670c5137ff2 163 kromSilAnak[(m*2)+1][mb] = mb2;
PrismaMegan 0:3670c5137ff2 164 }
PrismaMegan 0:3670c5137ff2 165 }
PrismaMegan 0:3670c5137ff2 166 for (int ma=0; ma<pSil; ma++){
PrismaMegan 0:3670c5137ff2 167 int ms1 = kromSilInduk[0][ma];
PrismaMegan 0:3670c5137ff2 168 kromSilAnak[0][ma] = ms1;
PrismaMegan 0:3670c5137ff2 169 int ms2 = kromSilInduk[1][ma];
PrismaMegan 0:3670c5137ff2 170 kromSilAnak[1][ma] = ms2;
PrismaMegan 0:3670c5137ff2 171 }
PrismaMegan 0:3670c5137ff2 172 for (int mb=pSil; mb<=nGen; mb++){
PrismaMegan 0:3670c5137ff2 173 int mb1 = kromSilInduk[1][mb];
PrismaMegan 0:3670c5137ff2 174 kromSilAnak[0][mb] = mb1;
PrismaMegan 0:3670c5137ff2 175 int mb2 = kromSilInduk[0][mb];
PrismaMegan 0:3670c5137ff2 176 kromSilAnak[1][mb] = mb2;
PrismaMegan 0:3670c5137ff2 177 }
PrismaMegan 0:3670c5137ff2 178
PrismaMegan 0:3670c5137ff2 179 for (m=0; m<nIndividu/2; m++){
PrismaMegan 0:3670c5137ff2 180 for (n=0; n<nGen; n++){
PrismaMegan 0:3670c5137ff2 181 int cb1 = kromSilAnak[m][n];
PrismaMegan 0:3670c5137ff2 182 printf("%i",cb1);
PrismaMegan 0:3670c5137ff2 183 }
PrismaMegan 0:3670c5137ff2 184 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 185 }
PrismaMegan 0:3670c5137ff2 186 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 187 }
PrismaMegan 0:3670c5137ff2 188
PrismaMegan 0:3670c5137ff2 189 void genArray(){
PrismaMegan 0:3670c5137ff2 190 for (int r=0; r<nGen; r++){
PrismaMegan 0:3670c5137ff2 191 arrayku[r] = r;
PrismaMegan 0:3670c5137ff2 192 }
PrismaMegan 0:3670c5137ff2 193 }
PrismaMegan 0:3670c5137ff2 194
PrismaMegan 0:3670c5137ff2 195 void pickRandom(){
PrismaMegan 0:3670c5137ff2 196 genArray();
PrismaMegan 0:3670c5137ff2 197 for (int i=0; i<(nGen-nMut); i++){
PrismaMegan 0:3670c5137ff2 198 int ame = (nGen-1)-i;
PrismaMegan 0:3670c5137ff2 199 int choosen = rand() % ame;
PrismaMegan 0:3670c5137ff2 200 arrayku[choosen] = 0;
PrismaMegan 0:3670c5137ff2 201
PrismaMegan 0:3670c5137ff2 202 for (int l=choosen; l<nGen; l++){
PrismaMegan 0:3670c5137ff2 203 int m = arrayku[l+1];
PrismaMegan 0:3670c5137ff2 204 arrayku[l] = m;
PrismaMegan 0:3670c5137ff2 205 }
PrismaMegan 0:3670c5137ff2 206
PrismaMegan 0:3670c5137ff2 207 }
PrismaMegan 0:3670c5137ff2 208
PrismaMegan 0:3670c5137ff2 209 printf("Nomor gen termutasi: ");
PrismaMegan 0:3670c5137ff2 210 for (int q=0; q<nMut; q++){
PrismaMegan 0:3670c5137ff2 211 chGen[q] = arrayku[q];
PrismaMegan 0:3670c5137ff2 212 int p = chGen[q];
PrismaMegan 0:3670c5137ff2 213 printf("%i,",p);
PrismaMegan 0:3670c5137ff2 214 }
PrismaMegan 0:3670c5137ff2 215 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 216 }
PrismaMegan 0:3670c5137ff2 217
PrismaMegan 0:3670c5137ff2 218 void mutasi(){
PrismaMegan 0:3670c5137ff2 219 printf("\n6. Mutasi\n\r");
PrismaMegan 0:3670c5137ff2 220 pickRandom();
PrismaMegan 0:3670c5137ff2 221
PrismaMegan 0:3670c5137ff2 222 for (m=0; m<nIndividu/2; m++){
PrismaMegan 0:3670c5137ff2 223 for (n=0; n<nGen; n++){
PrismaMegan 0:3670c5137ff2 224 int sy = kromSilInduk[m][n];
PrismaMegan 0:3670c5137ff2 225 kromMut[m][n] = sy;
PrismaMegan 0:3670c5137ff2 226 }
PrismaMegan 0:3670c5137ff2 227 }
PrismaMegan 0:3670c5137ff2 228 for (m=nIndividu/2; m<=nIndividu; m++){
PrismaMegan 0:3670c5137ff2 229 for (n=0; n<nGen; n++){
PrismaMegan 0:3670c5137ff2 230 int sh = kromSilAnak[m - (nIndividu/2)][n];
PrismaMegan 0:3670c5137ff2 231 kromMut[m][n] = sh;
PrismaMegan 0:3670c5137ff2 232 }
PrismaMegan 0:3670c5137ff2 233 }
PrismaMegan 0:3670c5137ff2 234
PrismaMegan 0:3670c5137ff2 235 for (m=0; m<nIndividu; m++){
PrismaMegan 0:3670c5137ff2 236 for (n=0; n<nGen; n++){
PrismaMegan 0:3670c5137ff2 237 }
PrismaMegan 0:3670c5137ff2 238 }
PrismaMegan 0:3670c5137ff2 239
PrismaMegan 0:3670c5137ff2 240 for (int s=0; s<nIndividu; s++){
PrismaMegan 0:3670c5137ff2 241 for (int t=0; t<nMut; t++){
PrismaMegan 0:3670c5137ff2 242 int u = chGen[t];
PrismaMegan 0:3670c5137ff2 243 if (kromMut[s][u]==1){
PrismaMegan 0:3670c5137ff2 244 kromMut[s][u] = 0;
PrismaMegan 0:3670c5137ff2 245 }
PrismaMegan 0:3670c5137ff2 246 else{
PrismaMegan 0:3670c5137ff2 247 kromMut[s][u] = 1;
PrismaMegan 0:3670c5137ff2 248 }
PrismaMegan 0:3670c5137ff2 249 }
PrismaMegan 0:3670c5137ff2 250 }
PrismaMegan 0:3670c5137ff2 251
PrismaMegan 0:3670c5137ff2 252 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 253
PrismaMegan 0:3670c5137ff2 254 for (int v=0; v<nIndividu; v++){
PrismaMegan 0:3670c5137ff2 255 for (int x=0; x<nGen; x++){
PrismaMegan 0:3670c5137ff2 256 int wa = kromMut[v][x];
PrismaMegan 0:3670c5137ff2 257 printf("%i",wa);
PrismaMegan 0:3670c5137ff2 258 }
PrismaMegan 0:3670c5137ff2 259 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 260 }
PrismaMegan 0:3670c5137ff2 261 }
PrismaMegan 0:3670c5137ff2 262
PrismaMegan 0:3670c5137ff2 263 int main()
PrismaMegan 0:3670c5137ff2 264 {
PrismaMegan 0:3670c5137ff2 265 bangkitGen();
PrismaMegan 0:3670c5137ff2 266 printf("\nKromosom unggul setiap generasi :\n\r");
PrismaMegan 0:3670c5137ff2 267 for (i=0; i<1; i++){
PrismaMegan 0:3670c5137ff2 268 koding();
PrismaMegan 0:3670c5137ff2 269 evaluasi();
PrismaMegan 0:3670c5137ff2 270 urut();
PrismaMegan 0:3670c5137ff2 271 silang();
PrismaMegan 0:3670c5137ff2 272 mutasi();
PrismaMegan 0:3670c5137ff2 273
PrismaMegan 0:3670c5137ff2 274 for (m=0; m<nIndividu; m++){
PrismaMegan 0:3670c5137ff2 275 for (n=0; n<nGen; n++){
PrismaMegan 0:3670c5137ff2 276 kromInduk[m][n] = kromMut[m][n];
PrismaMegan 0:3670c5137ff2 277 }
PrismaMegan 0:3670c5137ff2 278 }
PrismaMegan 0:3670c5137ff2 279 koding();
PrismaMegan 0:3670c5137ff2 280 evaluasi();
PrismaMegan 0:3670c5137ff2 281 urut();
PrismaMegan 0:3670c5137ff2 282
PrismaMegan 0:3670c5137ff2 283 printf("Generasi ke-%d : ", i);
PrismaMegan 0:3670c5137ff2 284 for (m=0; m<nGen; m++){
PrismaMegan 0:3670c5137ff2 285 kromUngGen[i][m] = kromSel[0][m];
PrismaMegan 0:3670c5137ff2 286 printf("%.0f",kromUngGen[i][m]);
PrismaMegan 0:3670c5137ff2 287 }
PrismaMegan 0:3670c5137ff2 288 kromUngGen[i][nGen+1] = kromEval[r[0]][nGen+1];
PrismaMegan 0:3670c5137ff2 289 float kromUngVal = kromUngGen[i][nGen+1];
PrismaMegan 0:3670c5137ff2 290 printf(" : %.2f", kromUngVal);
PrismaMegan 0:3670c5137ff2 291 printf(" \n\r");
PrismaMegan 0:3670c5137ff2 292 }
PrismaMegan 0:3670c5137ff2 293 }