You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Dodatak B Detaljan opis implementacije 147<br />
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯<br />
jedinki koji se biraju za narednu generaciju, pri čemu treba imati u vidu da je ga-<br />
>newgener.nelite jedinki direktno izabrano u narednu generaciju. Brojeve intNM<br />
i intNP nalazimo po formuli (B.1).<br />
intN = ga->nitem - ga->newgener.nelite;<br />
intNM = (int) (intN * (1 + intTFM - ga->select.fcompet));<br />
intNP = intN - intNM;<br />
(B.1)<br />
Detaljan opis fino g<strong>rad</strong>irane turnirske selekcije, uporedna analiza sa običnom<br />
turnirskom selekcijom kao i ostalim načinima selekcije se može videti u [Fil98].<br />
B.3 Ukrštanje<br />
Datoteka cross.c sadrži realizacije nekoliko operatora ukrštanja, gde se<br />
pokazivač na izabrani operator dodeljuje promenljivoj ga->cross.f, na osnovu<br />
podataka učitanih iz konfiguracione datoteke "GENET.CFG".<br />
Prilikom primene svakog od operatora ukrštanja, formiraju se parovi jedinki<br />
za ukrštanje, kojih ima (N pop - N elite )/2 (u programu je to (ga->nitem - ga-<br />
>newgener.nelite) / 2). Za svaki par jedinki se sa verovatnoćom p cross (ga-<br />
>cross.prob) vrši ukrštanje njihovih genetskih kodova, a u suprotnom oni ostaju<br />
nepromenjeni. Sve implementirane funkcije ukrštanja podrazumevaju da je<br />
dužina genetskog koda (ga->pop[i]->codelen) ista za sve jedinke u populaciji.<br />
Operator ukrštanja u ovoj implementaciji, privremene genetske kodove<br />
jedinki ukršta ili ostavlja iste, što zavisi od nivoa ukrštanja ga->cross.prob, i<br />
zatim ih smešta kao genetske kodove datih jedinki. Ako se ukrštaju jedinke i i j<br />
tada se postupak može šematski prikazati kao:<br />
ga->pop[i]->tmpgencode ----------------> ga->pop[i]->gencode<br />
ga->pop[j]->tmpgencode (ukrštanje) ga->pop[j]->gencode<br />
Vrednost lokalne promenljive nbits je broj bitova u genetskim kodovima jedinki,<br />
a ta vrednost se čuva i globalno u ga->cross.bits. Zbog toga se na početku<br />
svake funkcije koja realizuje neki operator ukrštanja ispituje da li je globalna<br />
promenljiva ga->cross.bits postavljena, inače u suprotnom prekida <strong>rad</strong> GA, i<br />
štampa odgovarajući izveštaj.<br />
Implementirani su sledeći operatori ukrštanja:<br />
OnePointCrossover()<br />
Na početku se kopira privremeni genetski kod ga->pop[i]->tmpgencode<br />
svake jedinke i u genetski kod te jedinke ga->pop[i]->gencode. Kasnije se<br />
eventualno samo razmenjuju delovi genetskog koda između jedinki.<br />
U svakom koraku se na slučajan način iz populacije biraju po dve jedinke za<br />
ukrštanje, čiji su indeksi itm1 i itm2, i slučajan broj iz intervala [0, 1]. Ukoliko je<br />
dobijeni slučajni broj manji od nivoa mutacije ga->cross.prob, vrši se ukrštanje<br />
između datih jedinki, a pozicija za ukrštanje site se bira kao slučajan ceo broj iz<br />
intervala [0, nbits]. U suprotnom promenljiva site uzima vrednost nbits, i nema<br />
ukrštanja između datih jedinki. Posle sledećih operacija l = site/32; site =<br />
site%32; promenljiva l predstavlja redni broj 32-bitne reči koja sadrži poziciju<br />
ukrštanja, a site je redni broj bita unutar 32-bitne reči. Sve 32-bitne reči pre