[OER] 4. domaća zadaća - 2021/2022
Banananjeros
Jel neko zna kaj znači korištenje topologije lanca i lokalnog susjedstva u 1. algoritmu s rojem čestica?
swish41
Banananjeros više ne pamtiš globalno najbolje rješenje, nego za svaku jedinku gledaš najbolju u njenom susjedstvu, a topologija lanca ti je način definiranja tog susjedstva. On ima parametar n, i on određuje veličinu susjedstva. vel_sus = 1 + 2n. Znači u susjedstvu neke jedinke je ta jedinka, i n jedinki sa svake strane u populaciji. Ovo je ukratko objašnjenje, a ako ti treba detaljnije, pogledaj u knjizi, tamo je opširnije
DankJakov
Banananjeros Koje parametre c1 i c2 koristis i koje rangeve za x i v?
Banananjeros
Fikalo
Kod diferencijske evolucije koje rizanje bi trebali korsitit, ekpsonencijalno, uniformno ili je svejedno?
DankJakov
Btw, postoji greska u knjizi sto se tice pseudoalgoritma roja cestica ili mi se cini? gbest je jednom definiran kao double[][] a onda drugi puta kao da je double[]. gbest[d] - x[d] nije izvedivo kad je gbest[d] vektor a x[d] skalar. Jel mi moze netko pojasnit sta je pisac tu htio reci
swish41
DnkCkv da, vjv je greška, jer globalBest predstavlja najbolju jedinku, znači to je samo jedna jedinka, tako da ovaj gbest = x dio treba biti samo gbest = x, a gbest[d] - x[d] je ok, jer se gleda svaka komponenta od jedinke
Retard00
Koja riješenja bi ovo trebalo izbacivat?
swish41
Banananjeros mislim da je trik u tome da implementiraš faktor inercije. Pogledaj u knjizi kako se on definira, al basicaly, on služi tome da se regulira promjena brzine kroz rad algoritma, znači da u ranijim iteracijama možeš raditi veće promjene brzine, a kasnije manje.
S time dobivam grešku reda 10^-26
samo_vagabundo
branimir1999 mozda dobro ne racunas MSE, ovo su rjesenja
Banananjeros a = 7, b = -3, c = 2, d = 1, e = -3, f = 3
ne cini mi se kao da su tvoja netocna za 7k MSE
(dogodilo mi se na jednom labosu lmao)
ako nije nesto toliko ocito, onda po redu @M̵̧̩͑̀͝î̶͍̉ć̴̝̾́̀o̶̺̟̣͂̽ odgovor
Retard00
Banananjeros e = -3
meni ispada da je e = 3, jel to tvoje typo il sam ja neš sjebo?
EDIT: ispada da su oba dobra, nekad mi ispadne e = -3, nekad e = 3, a nekad i zapne u nekom lok. opt.
samo_vagabundo
PlavušaSFilozofskog 10^-26 s globalnim ili lokalnim?
swish41
samo_vagabundo oba
mrki
PSO algoritam: smatramo li da su u topologiji lanca spojeni prvi i zadnji element? Nije li to onda topologija prstena.
branimir1999
Koji su vam parametri za iteracije i broj jedinki? Dobivam pogresku MSE red velicine 500 na pop 7 i iteracije 100
branimir1999
Ja ne znam je li krivo shvacam, ali posljednje tri laboratorijske vjezbe dobivam greske velicina izmedu 100-20000, nikada vise, nikad manje, a cesto bih pratio algoritam do slova. Ovo su izlazi pod populacijom 7 i iteracijama 150. Naglim povecanjem tih parametara rezultira u promjeni pogreske do 2 reda velicine. Varijable a,b,c,d,e,f (oznaceni s x ovdje) nekada budu stvarno blizu, a nekada potpuno promasi broj. Je li itko imao problema s ovim prije pa je znao rijesiti? Ja sam totalno bez ideja. Vec sam provjerio sve funkcije da li rade kako spada pa ne znam vise do cega ovo moze biti. Moze netko pomoci?
x = (5.439, -2.893, 1.293, 0.945, 5.726, 3.814)
MSE = 1267.952
x = (6.606, -2.672, 1.445, 0.877, -7.204, 2.727)
MSE = 1922.271
x = (7.313, -2.908, -2.450, 0.160, -6.05, 3.505)
MSE = 1258.899
x = (2.703, -2.816, 0.693, 1.086, -5.367, 2.955)
MSE = 1292.6401
x = (6.099, -2.915, 8.0, 0.467, 0.0845, 3.515)
MSE = 413.394
micho
branimir1999 Možda imaš samo shitne algoritme križanja i mutacije, najbolje da kažeš što imaš
Isto tako pop ti je vjerojatno premala i broj iteracija ti vjv treba biti veći, mislim, za 7 i 100 bi morao imati brutalne algoritme.
samo_vagabundo
branimir1999 return ((double) iteration / iteration_max) * (inertia_min - inertia_max) + inertia_max
ako je to java, msm da (double) iteration / iteration_max)
radi cjelobrojno dijeljenje pa onda to casta u double, probaj s iteration / (double) iteration_max)
.
Ne kazem da samo zbog toga imas lose rezultate, al sigurno ne pomaze.
EDIT:
branimir1999 Ovo su izlazi pod populacijom 7 i iteracijama 150
also, to je def premalo
EDIT2:
nah, nije ovo prvo
branimir1999
M̵̧̩͑̀͝î̶͍̉ć̴̝̾́̀o̶̺̟̣͂̽ Koristim PSO za ovaj zadatak specificno, a za ostale sam pratio i stavio sve parametre po uputama. Ovdje koliko vidim ne smeta 7 i 150 jer je slicno u knjizi te kao sto sam rekao, ako jako povecam te vrijednosti, ne vidim preznacajan napredak
micho
branimir1999 Aha, pardon, vidim da nije više klasični genetski. Kao što je netko preporučio, imaš li tzv. momentum
u njemu? On je dosta bitan za normalno funkcioniranje tog algoritma kad imaš jake oscilacije.
branimir1999
M̵̧̩͑̀͝î̶͍̉ć̴̝̾́̀o̶̺̟̣͂̽ Nisam propustio inerciju tj. momentu i ovako je implementiran:
return ((double) iteration / iteration_max) * (inertia_min - inertia_max) + inertia_max
gdje su inertia_min = 0.1 i inertia_max 0.9.
Ovako mi izgleda funkcija za racunanje brzine po dimenziji k:
Double new_velocity = inertia * p.velocity.get(k);
new_velocity += individual_factor * random.generateRandomDouble(0.0,1.0) * (p.best_position.get(k) - p.position.get(k));
new_velocity += social_factor * random.generateRandomDouble(0.0,1.0) * (best.position.get(k) - p.position.get(k));
new_velocity *= K;
gdje su individual_factor = social_factor = 2 i K=0.729, p = trenutna cestica, best = najbolja globalna/lokalna cestica
micho
branimir1999 Hmmm ovdje vidim potencijalne probleme:
- ne clampaš brzine, to ti je potencijalno loše jer ti čestica može otići u 3pm što će ti rezultirati nekakvim spiralnim gibanjem i potencijalno zaglavljivanjem
- moment ti je dosta velik, u praksi se koriste momenti između 0.2 i 0.5 za ovaj algoritam - kombinacija ovako velikog momenta s neograničenim brzinama ti može biti loša
Dakle ono što bih ja preporučio je da prvo postaviš faktor inercije da ti bude između 0.2 i 0.5. Okej je linearna interpolacija maksimuma prema minimumu i mislim da tu ne treba išta mijenjati.
Zatim, pogledaj malo koje brzine imaš. Specifično zanimaju te prvih par iterscija, preporučam da si raspišeš samo maksimalne i minimalne brzine čestica u prvih, nezz, 10-20 iteracija. Škicni malo i kako se mijenjaju. Zavrti to par puta i provjeri da ti ne spajkaju brzine nigdje - nakon promjene ovih vrijednosti inercije možda ni neće. Ti i sam znaš koliko su čestice udaljene od optimuma funkcije, pa ćeš znati prosuditi što su prevelike brzine.
Kako ti to ne bi bio konstantan hiperparametar, ja bih te limite brzina ograničio ovisno o inicijalnoj populaciji - dakle, nezz, gledao bih koje su dvije najudaljenije čestice i vjv ne bih dopustio da brzina bude ikad veća od toga. Nema smisla da neka čestica ima mogućnost otići vrlo daleko od inicijalne populacije ako to nemaju mogućnost sve čestice.
Teatiraj ove stvari jednu po jednu, i kad dobiš dobar rezultat umjesto da to dalje šminkaš pokušaj racionalizirati zašto je to pomoglo.
branimir1999
samo_vagabundo Ovo s inercijom nije problem jer sam provjerio za svaki slucaj. Ali svejedno sam implementirao kako si mi rekao i povecao populaciju na 50 i 150000 iteracija i dobio sam:
x = (7.090, -2.958, 1.986, 1.106, -2.897, 3.115)
MSE = 153.714
x = (6.843, -2.746, 3.005, 1.166, 3.184, 2.987)
MSE = 7067.312
M̵̧̩͑̀͝î̶͍̉ć̴̝̾́̀o̶̺̟̣͂̽ već sam implementirao clampanje samo sto sam zaboravio napomenuti da sam izostavio u postu. Ako stavim inerciju na interval [0.2,0.5], algoritam samo losije rezultate daje. Koristio sam 0.9 jer se tako preporuca u knjizi