00001 #include <ecf/ECF.h>
00002 #include "GPcacheEvalOp.h"
00003 #include <math.h>
00004 #include <time.h>
00005
00006
00007
00008
00009 class Chrpa_varijabli {
00010
00011 int memorija[VEL_CASHA] ;
00012 int prije_koraka_koristen[VEL_CASHA];
00013 int puta_koristen[VEL_CASHA] ;
00014 int zadnji_izbaceni ;
00015 int prvi_prazni ;
00016 int br_promasaja ;
00017 unsigned int brojac ;
00018 bool prazno ;
00019
00020 public :
00021
00022 bool kajImaPraznog();
00023 bool kajVecImaOvaj(int);
00024 int najmanji();
00025 int najveci();
00026 int kolkoSamPromasil();
00027 int vratiBrojac();
00028 int najkasniji();
00029 int najnoviji();
00030 int najrijedi();
00031 int najcesci();
00032 void ubaciNa(int,int) ;
00033 void dodajUPrazno(int);
00034 void promasaj();
00035 void povecaj_brojac();
00036 void set_zadnji(int);
00037 void inicializiraj();
00038 void azurirajVremana(int);
00039
00040 };
00041
00042
00043
00044
00045
00046
00047 int Chrpa_varijabli::najmanji(){
00048
00049 int i , min=memorija[0] , index=0 ;
00050
00051 for(i=1;i<VEL_CASHA;i++){
00052 if(memorija[i]<min){
00053 min=memorija[i];
00054 index=i;
00055 }
00056 }
00057 return index ;
00058 }
00059
00060 int Chrpa_varijabli::najveci(){
00061
00062 int i , max=memorija[0] , index=0 ;
00063
00064 for(i=1;i<VEL_CASHA;i++){
00065 if(memorija[i]>max){
00066 max=memorija[i];
00067 index=i;
00068 }
00069 }
00070 return index ;
00071 }
00072
00073
00074 void Chrpa_varijabli::povecaj_brojac(){
00075
00076 brojac++ ;
00077 }
00078
00079 void Chrpa_varijabli::set_zadnji(int a){
00080
00081 zadnji_izbaceni=a;
00082 }
00083
00084
00085 void Chrpa_varijabli::inicializiraj(){
00086
00087 int i;
00088
00089 for(i=0;i<VEL_CASHA;i++){
00090 memorija[i]=0;
00091 prije_koraka_koristen[i]=999;
00092 puta_koristen[i]=0 ;
00093 }
00094 brojac=0;
00095 zadnji_izbaceni=0;
00096 prazno=true;
00097 prvi_prazni=0;
00098 br_promasaja=0;
00099
00100 }
00101
00102 bool Chrpa_varijabli::kajImaPraznog(){
00103
00104 if(prazno) return true;
00105 else return false;
00106 }
00107
00108 bool Chrpa_varijabli::kajVecImaOvaj(int ulaz){
00109
00110 int i ;
00111
00112 for(i=0;i<VEL_CASHA;i++){
00113 if(ulaz==memorija[i]) {
00114 this->azurirajVremana(i);
00115 return true;
00116 }
00117 }
00118 return false;
00119 }
00120
00121 void Chrpa_varijabli::dodajUPrazno(int iznos){
00122
00123 memorija[prvi_prazni]=iznos;
00124 this->azurirajVremana(prvi_prazni);
00125
00126 prvi_prazni++;
00127 if (prvi_prazni>=VEL_CASHA) {
00128 prazno = false ;
00129 }
00130 }
00131
00132 void Chrpa_varijabli::promasaj(){
00133
00134 br_promasaja++;
00135 }
00136
00137
00138 int Chrpa_varijabli::kolkoSamPromasil(){
00139
00140 return br_promasaja ;
00141 }
00142
00143 void Chrpa_varijabli::ubaciNa(int na_mjesto , int iznos){
00144
00145 int i ;
00146
00147 memorija[na_mjesto]=iznos;
00148 this->azurirajVremana(na_mjesto);
00149 }
00150
00151 int Chrpa_varijabli::vratiBrojac(){
00152
00153 return brojac ;
00154 }
00155
00156
00157 int Chrpa_varijabli::najnoviji(){
00158
00159 int i , min=prije_koraka_koristen[0] , index=0 ;
00160
00161 for(i=1;i<VEL_CASHA;i++){
00162 if(prije_koraka_koristen[i]<=min){
00163 min=prije_koraka_koristen[i] ;
00164 index=i ;
00165 }
00166 }
00167 return index ;
00168 }
00169
00170 int Chrpa_varijabli::najkasniji(){
00171
00172 int i , max=prije_koraka_koristen[0], index=0 ;
00173
00174 for(i=1;i<VEL_CASHA;i++){
00175 if(prije_koraka_koristen[i]>=max){
00176 max=prije_koraka_koristen[i] ;
00177 index=i;
00178 }
00179 }
00180 return index ;
00181 }
00182
00183
00184 int Chrpa_varijabli::najcesci(){
00185
00186 int i , max=puta_koristen[0] , index=0;
00187
00188 for (i=1;i<VEL_CASHA;i++){
00189
00190 if(puta_koristen[i]>=max){
00191 max=puta_koristen[i];
00192 index = i ;
00193 }
00194 }
00195 return index ;
00196 }
00197
00198 int Chrpa_varijabli::najrijedi(){
00199
00200 int i , min=puta_koristen[0], index=0 ;
00201
00202 for (i=1;i<VEL_CASHA;i++){
00203
00204 if(puta_koristen[i]<=min){
00205 min=puta_koristen[i];
00206 index=i ;
00207 }
00208 }
00209 return index ;
00210 }
00211 void Chrpa_varijabli::azurirajVremana(int index){
00212
00213 int i ;
00214 prije_koraka_koristen[index]=0;
00215 puta_koristen[index]++;
00216 for(i=0;i<VEL_CASHA;i++){
00217 prije_koraka_koristen[i]++;
00218 }
00219 }
00220
00222
00223
00224
00225 FitnessP GPcacheEvalOp :: evaluate(IndividualP individual){
00226
00227 FitnessP fitness = static_cast<FitnessP> (new FitnessMin);
00228
00229 TreeP tree = boost::dynamic_pointer_cast<Tree::Tree>
00230 (individual->getGenotype());
00231
00232 int polje[MAXPOLJE], i, j, k ;
00233 double temp[9];
00234 Chrpa_varijabli ime_hrpe_varijabli ;
00235
00236 ime_hrpe_varijabli.inicializiraj() ;
00238
00239
00240 if(VRSTA_POLJA==1){
00241 for (i=0; i<MAXPOLJE ; i++){
00242 polje[i]=((rand())%BR_STR)+1;
00243 }
00244 }
00246 else if(VRSTA_POLJA==2){
00247 for (i=0 ; i<MAXPOLJE ; i++){
00248
00249 polje[i]= ((rand())%BR_STR)+1 ;
00250 j=((rand())%KOEF_JEDNOG);
00251
00252 if (i+j<MAXPOLJE) {
00253 for (k=1; k<=j; k++){
00254 polje[i+k]=((polje[i+k-1])%BR_STR)+1;
00255 }
00256 i+=j ;
00257 }else{
00258 polje[i]= ((rand())%BR_STR)+1 ;
00259 }
00260 }
00261 }
00263 else if (VRSTA_POLJA==3){
00264 for(i=0;i<MAXPOLJE;i++){
00265 polje[i]=i%BR_STR+1;
00266 }
00267 }
00268
00270 double zamjena=0 ;
00271 int pom ;
00272
00273 bool flag ;
00274
00275 for ( i=0 ; i<MAXPOLJE ; i++ ){
00276
00277 ime_hrpe_varijabli.povecaj_brojac() ;
00278
00279 if(ime_hrpe_varijabli.kajVecImaOvaj(polje[i])){
00280 continue ;
00281 }
00282 ime_hrpe_varijabli.promasaj() ;
00283
00284 if (ime_hrpe_varijabli.kajImaPraznog()) {
00285 ime_hrpe_varijabli.dodajUPrazno(polje[i]);
00286 continue ;
00287 }
00288
00289
00290
00291
00292
00293 temp[0]=(double)ime_hrpe_varijabli.najmanji();
00294 temp[1]=(double)ime_hrpe_varijabli.najveci();
00295 temp[2]=(double)(rand()%VEL_CASHA);
00296 temp[3]=(double)VEL_CASHA;
00297 temp[4]=(double)((ime_hrpe_varijabli.vratiBrojac())%VEL_CASHA);
00298 temp[5]=(double)ime_hrpe_varijabli.najnoviji();
00299 temp[6]=(double)ime_hrpe_varijabli.najkasniji();
00300 temp[7]=(double)ime_hrpe_varijabli.najcesci();
00301 temp[8]=(double)ime_hrpe_varijabli.najrijedi();
00302
00303
00304
00305
00306
00307 tree->setTerminalValue("MIN", &temp[0]);
00308 tree->setTerminalValue("MAX", &temp[1]);
00309 tree->setTerminalValue("RANDOM", &temp[2]);
00310 tree->setTerminalValue("CASHSIZE", &temp[3]);
00311 tree->setTerminalValue("COUNTER", &temp[4]);
00312 tree->setTerminalValue("UPRAVO_IZBACEN", &temp[5]);
00313 tree->setTerminalValue("NAJDUZE_U_MEMORIJI", &temp[6]);
00314 tree->setTerminalValue("NAJCESCE", &temp[7]);
00315 tree->setTerminalValue("NAJRIJEDE", &temp[8]);
00316
00317 tree->execute(&zamjena);
00318 zamjena=(fabs(zamjena)) ;
00319 pom= ((int)zamjena)%VEL_CASHA ;
00320
00321 ime_hrpe_varijabli.ubaciNa(pom,polje[i]);
00322
00323
00324
00325 }
00326
00327
00328 fitness->setValue(ime_hrpe_varijabli.kolkoSamPromasil());
00329
00330 return fitness ;
00331
00332 }