[UUUI] 1. laboratorijska vježba - 2020/2021
TheNubKiller
Jel tko riješio sporost astara sa 3×3? Lol, ne znam što mi je krivo. Radim sve po prezentaciji i za ostale primjere radi savršeno. Radim u javi, koristim liste za open i closed. Ovo nikako da se završi, kao da je u beskonačnoj petlji.
Vonj
Lumpy
Vjerojatno je problem u open, potreban je prioritetni red, ali pri provjeri jel neko stanje vec u redu open i usporedbi cija heuristika je manja, to je skupa operacija. Uz ubacivanje u red, dodaj da se ubacuju i vrijednosti u novu hash mapu.
Sad, prilikom svakog ubacivanja u open, taj isti Cvor ubacujes i u tu hash mapu, pa prilikom provjere nalazi li se neki cvor u redu open, provjeravas tu hash mapu, ako se vrijednost nalazi u hash mapi i veca je od trenutne vrijednosti, ides u izmjenu reda open.
angello2
ja ne razumijem kak oni dobiju ove pathove koje su dali u primjerima. na koju foru bfs koji sortira po abecedi moze prvo otic u fail_lab umjesto u complete_lab?
ista stvar za istru, kak je moguce da bfs ide jednakim putem kao ucs i astar kad to ocito ne bi smjelo bit tako? na koji nacin vi racunate/ispisujete path?
ppooww
angello2 path treba ispisati najkraci pronadeni put. ako sam dobro skuzio ti ispisujes sva stanja koja je posjetio.
angello2
pp zar se ne pronalazi najkraci put pomocu astar? al kakvog smisla ima da za pravilan ispis bfs-a moram radit i astar? ne kuzim uopce poantu ispisivanja patha kad ne ispisujemo ono sta bfs radi nego neki skroz nepovezani najkraci put, nije li poanta demonstrirat da je bfsov put do konacnog stanja puno dulji nego put od boljih algoritama? sori ak su glupa pitanja al fakat mi nije jasno sta zele
Rene
angello2 Pa iz broja posjecenih stanja se vidi da BFS luta okolo, a A* ide usmjereno. Konačni put koji ispisuješ je pronašao i BFS, samo mu je trebalo duže
ppooww
angello2 BFS isto uvijek pronade najkraci put. To je i logicno s obzirom da BFS posjecuje sva stanja razinu po razinu tj. u biti ispita sve moguce opcije. Prednost A* je da u prosjeku posjeti puno manje stanja nego BFS jer radi drukcije. To se ne vidi na ovim primjerima u labosu jer su grafovi dosta mali.
KitKat
Gulbash kao i sa svakim labosom koji je na autograder, puno i previše jer više od pola vremena provedeš da shvatiš kako te autograder neće posrati
KingGeedorah
Retard00 Jesi koristio tuple za strukturu cvora ili? Ja sam tako ali mi je na autograderu iscurilo vrijeme za A* i provjeru optimisticnosti na 3×3.
Uz to mi je pao UCS nad 3×3 jer se razlikuje path. Zanimljivo je da je i moj i njihov algoritam nasao path jednake duljine i s istim brojem posjecenih stanja (znaci svih 5 znamenki poklapa) al moj je iz nekog razloga drugaciji…
Retard00
King Geedorah Ne znam dal uopće imam ikakve čvorove tj. stablo. Napiso sam kod po njihovom algoritmu, skup open sam stavio da je prioritetni red (heapq), a skupovi closed i visited su obični setovi. Originalno (za BFS) sam imao klasu State koja sadži naziv i listu susjeda stanja, ali za sortiranje u heapq-u sam moro napravit StateWrapper koji u sebi sadrži cijenu i potrebne operatore za to. Za dobivanje putanje i uspoređivanje cijena sam jednostavno dodao atribute g_cost, f_cost i h_cost i previous State objektima. tuple-ove sam koristio kao elemente u listama susjeda stanja (parovi (ime, cijena)) i pri hash-iranju liste susjeda State-a (list -> tuple).
TheNubKiller
Vonj Jesi isprobao to? Radi li u razumnom vremenu?
Dlaid
Vonj
Kako iz prioritetnog reda open obrisat element koji ima veci f od trenutnog kojeg dodajemo?
Vonj
Lumpy
Da, skratilo je izvodenje na 2-3 sekunde.
dora
Treba li se nalaziti jos nesto u target\classes\ui jer mi autograder ne radi.
Solution.java mi je u src\main\java\ui
gladiator
Retard00 jedno pitanje: KAKO? Meni traje beskonačno više
Retard00
gladiator Skužio sam da i meni traje “beskrajno” ako maknem “if expanded_state in visited: continue” nakon ekspandiranja čvorova, pa sam ja jednostavno to tak ostavio (uz open i closed imam i set visited).
Sad dal je to dobro, ne znam. Ali prolazi njihove testove + neke moje. Moguće je da postoje krajnji(?) slučajevi gdje bi to moglo dovest do krivog rješenja al ih nisam uspio nać.
Retard00
Retard00 Ok, našo sam i način da se A* za 3×3+misplaced izvede brzo (u istom vremenu ko i prije) i bez sumnjive visited liste. Uglavnom visited sam skroz uklonio, a izvođenje sam ubrzao tako da sam setove open i closed pretvorio u rječnike (npr.open=dict(), open[some_state] = some_state
- time se provjeravanje i dohvačanje podataka brzo izvodi), i naravno uz to za open imam i priorityqueue, mada je mijenjanje podataka u njemu linearno. Sad je jedini problem što to kod mene za 3×3 i misplaced posječuje nešto više stanja (100870 > 95544, zašto? - nemam pojma) al to su tak i tak rekli u obavijesti da se to neće penalizirat.
Urmum
Kako zapamtiti path?
gladiator
mamaRu path je valjda u argv i dalje, nije nigdje pobjegao
Urmum
gladiator sori, krivo sam se izrazila, mislim na ovaj path i path length koji opisuju najkraći put.
Uchenikowitz
mamaRu meni moj search vrati konacni cvor, a svaki cvor ima roditelja, tak da ja za path odem od tog konacnog cvora natrag do prvog roditelja, obrnem listu, ispisem i u meduvremenu negdje prebrojim koliko ih ima
Dlaid
Jel ima netko pro tip kako da spustimo vrijeme za 3×3_puzzle(BFS) ispod 2 min
Extended_mix
Peter Jordanson Za open koristi PriorityQueue (trebat ces komparator napisati), za closed korsti HashMap/HashSet, ako ni to nije dovoljno napravi za open Dodatni HashMap u kojem ces sa O(1) ispitivat jel cvor u redu, ako ni to nije dovoljno
Run with Java Flight Recorder analizira ti koliko posto vremena se koji dio koda izvodi pa vidi sta se jos da popraviti
EDIT: ups nisam vidio da pitas za BFS ali za sve koji pisu u javi i pate se sa vremenom 🙂