Ovu stranicu je najbolje pregledavati u modernom internet pregledniku s omogućenim JavaScriptom.

[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

Retard00
a = 7, b = -3, c = 2, d = 1, e = -3, f = 3

DnkCkv
c1 = 2, c2 = 2
xMin = -8, xMax = 8, vmax = (xMax - xMin) * 0.2, vmin = -vmax

Vjerojatno nije do parametara, ali ne dobivam dobre rezultate (najbolja kvadratna pogreska mi je bila oko 1000)


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

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

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


Sljedeća stranica »