|
Programiranje Programski jezici, tehnike, alatke... |
|
Alatke vezane za temu | Vrste prikaza |
14.2.2006, 4:00 | #1 |
Veteran
|
Racunanje distance (pathfinding problem)
Molio bih ljude koji imaju iskustva sa pathfindingom da mi pomognu (savetima)oko dobrog algoritma za odredjivanje putanje.
Problem: Potrebno je za uneti broj tacaka k (k < 20) odrediti njihova medjusobna rastojanja (tj. broj turnova od jedne tacke do druge) ako su poznate koordinate svake tacke i ako je data matrica po kojoj se treba kretati. Poznato: - Svaka tacka (npr. A, B, C) je definisana koordinatama X i Y - Data je matrica "sveta" dimenzija M X N na kojoj se nalaze tacke * M <= 10000 i N <= 10000 (ove velike dimenzije su glavni problem) * svako polje matrice je jedan integer i to: 0 - ako na polje nije moguce stati (zid) 1,2,3,4,5 - cena kretanja po datom polju (tj. koliko se poteza utrosi ako se krece preko tog polja; 1 najbrze, 5 najsporije) Ogranicenja: Postoji vremenski limit za nalazenje resenja koji iznosi 1 sec!!! S obzirom da se ne zna putanja izmedju tacaka pretpostavljam da je prvo potrebno naci optimalnu (ili dovoljno dobru) putanju, a onda "izmeriti" njenu duzinu i to sacuvati kao minimalno rastojanje. Ja sam se odlucio za A* u resavanju ovog problema i sa malim dimenzijama matrice radi savrseno. Ali problem se javlja kada M i N predju 1000, a sam svet je neki zaguljeni lavirint sa mnogo "slepih ulica". (pa A* trosi node u budzacima) Da li neko ima ideju za eventualno poboljsanje A* ili bi mozda trebao da probam sa nekim drugim algoritmom? Svaki savet ili link je dobrodosao. Jos da dodam da resenje ne mora da bude 100% tacno. Manje greske su prihvatljive ako se dobija na brzini. |
14.2.2006, 17:27 | #2 |
Član
Član od: 14.12.2005.
Poruke: 72
Zahvalnice: 0
Zahvaljeno 14 puta na 2 poruka
|
Re: Racunanje distance (pathfinding problem)
Bilo bi zgodno kad bi mape bile dostupne pre samog startovanja programa, onda bi bilo moguće uraditi deo ispitivanja offline i zatim ga keširati. Koliko sam shvatio, to ovde nije slučaj.
Možda bi trebao da pokušaš sa nekim adaptivnim metodom. Recimo, podeliš mapu 10,000 x 10,000 na sektore veličine 100 x 100. Zatim za svaki sektor utvrdiš povezanost sa okolnim, ispitujući ivične nodove. To sve naravno keširaš. Za svaki par tačaka A i B, koristeći povezanost sektora, određuješ najkraći put. Zatim za svaki sektor u dobijenoj putanji povezuješ tačke U i I, gde je U ulazna tačka u dati sektor, a I tačka izlaza tj. ulaza u sledeći. Ideja je veoma slična, kao kad u velikom gradu pokušavaš da sa jednog kraja stigneš u drugi. Svakako nećeš odmah da zabiješ lice u kartu u pratiš svaku uličicu i prolaz, već ćeš prvo u globalu isplanirati put(ovde prelazim most, idem do onog bulevara, kod trga skrenem desno...). Ovo je samo ideja. Nisam nikad implementirao ništa slično tome i generalno nemam nekog posebnog iskustva sa pathfinding-om (stoga, ovo je možda savršeno nepotreban post, ali eto, možda bude od koristi :) ) Takođe, možda bi trebalo da ispitaš svoju implementaciju, ima li prostora za neke optimizacije, pamćenje delova mape koje si već obišao, gde su slepe ulice i tome slično. neki linkovi o A* algoritmu: http://theory.stanford.edu/~amitp/GameProgramming/ http://www.policyalmanac.org/games/aStarTutorial.htm |
15.2.2006, 16:59 | #3 | |
Veteran
|
Re: Racunanje distance (pathfinding problem)
Hvala na savetima i linkovima. Prvi link je bio izuzetno koristan. Na osnovu njega sam promenio strukturu podataka i dobio malo ubrzanje algoritma. Jos uvek je daleko od zeljenog cilja, ali je ipak za nijansu brzi.
Citat:
Ali ako je neki lavirint u pitanja sa veoma uzanim putanjama, tako da po nekoliko putanja moze stati u jedan sektor, a da pri tom vode ka razlicitim tackama onda zaista imam problem. Na primer podelio sam mapu 10000 x 10000 na 100 x 100. Ono sto u 100 x 100 izgleda kao najbolja putanja moze biti i veoma losa jer je unutar tih sektora putanja puna prepreka ili ne vode sve putanje u istom pravcu. Postaje problem kako sad naci U i I tacke jer ih ima vise? A attachmentu saljem sliku u paint-u cisto ilustracije radi. Neka je mapa 100 x 100 izdeljena u sektore 10 x 10. Plave tacke oznacavaju pocetak i kraj zeljene putanje. Crveni pikseli su oni preko kojih je moguce kretanje (sada ne uzimam brzinu kao faktor) a crni su zidovi. Prvo trazim putanju preko sektora i ovde se algoritam zaleti i krene dole pa desno. (a trebao bi prvo levo pa dole, pa tek onda desno)Tek kada pocne povezivanje U i I tacaka i odredjivanje putanje unutar svakog sekotra zakljucuje da u poslednjem sektoru ima prepreku i da putanja nije dobra. Ovo za sada ne znam kako da resim. Inace, ako je mapa otvorena onda A* radi super kao i poboljsanje koje si predlozio! |
|
15.2.2006, 23:39 | #4 | |
Član
Član od: 14.12.2005.
Poruke: 72
Zahvalnice: 0
Zahvaljeno 14 puta na 2 poruka
|
Re: Racunanje distance (pathfinding problem)
Citat:
Pala mi je na pamet još jedna ideja. Malo je heavy, ali mislim da vredi razmotriti :) Pretvoriš postojeću, matricu integera, u bit-mapu. Grupišeš polja u grupe od 8 (ili 16, 32) i ako je polje slobodno setuješ bit na 1, a ukoliko je to polje zid, na 0. Tada neki hodnik (#....##.) gde su tarabama označeni zidovi dobija oblik 10000110 ili 134 dekadno. Umesto da porediš 8 integera(odnosno 32 bajta), porediš 1 bajt. Poređenje bi se realizovalo primenom operatora AND: Kod:
10000110 - niz polja (1 bajt) 11111111 - 255 dekadno -------------------------- AND 10000110 11111111 - niz polja 11111111 - 255 dekadno -------------------------- AND 11111111 = 255 dekadno Kod:
// ... char test_niz; if ((test_niz & 255)==255) { // sva polja su slobodna za prolaz } else { // negde postoji prepreka } // ... Interesuje me, da li se mapa generiše nekom funkcijom direktno u memoriju, ili se učitava iz fajla? Da li se vreme meri interno, pozivom funkcije, ili spolja, štopericom? Poslednja ispravka: void* (16.2.2006 u 1:46) |
|
17.2.2006, 23:46 | #5 | |||
Veteran
|
Re: Racunanje distance (pathfinding problem)
Citat:
Citat:
Inace, poznat mi je ovaj koncept jos od vremena igranja sa 2D grafikom u pascalu, kada je trebalo brzo flipovati sprajt (tj. boje) uzimajuci u obzir matricu transparentnosti. Nije mi palo na pamet da isto probam ovde. Hvala! Jedino sto ova varijanta ne uzima u obzir tezine, ali s obzirom na malu razliku, cena obilaska oko jedne celije je vece od proslaska kroz skuplju celiju tako da ce da prodje. Pitanje je da li ce to znacajno doprineti algoritmu koji se relativno dobro snalazi sa otvorenim mapama. Spirale i slicna "cudesa" su meni problem. Citat:
Nisam hteo u opisu problema da pisem nebitne stvari, ali posto si pitao... Ovaj algoritam je deo mnogo veceg AI algoritma koji sam koristio na takmicenju. Zamisli da imas neku RTS igru i da je potrebno napisati AI. Kad bi pisao sve detalje ovaj post bi bio predugacak. Poenta je da mi je jednina slaba tacka lose racunanje izmedju kljucnih tacaka zbog cega AI gresi. Meni je dozvoljeno samo da napisem AI dll. Ostatak je kod sudije. Svi takmicari predaju dll-ove sudiji koji ih spaja i potom pokrece program. Sudija bira mapu koja se ucitava iz fajla. Znaci mapa se ucitava ali sve sto ja imam je funkcija GetMap() koja vraca niz int-ova ili GetMap(int x, int y) koji vraca tezinu date celije. Sto se tice merenja vremena to je opet na sudiji, ali sigurno ne radi stopericom. Nema ni potrebe. Verovatno je interno merenje vremena jer ako kod radi duze od 1 sec. po potezu onda igra penalizuje taj kod preskakanjem celog poteza. Ako se ponovi obicno kosta i cele partije. |
|||
Bookmarks sajtovi |
|
|
Slične teme | ||||
tema | temu započeo | forum | Odgovora | Poslednja poruka |
Problem pri povezivanju sa TV-om | VMedic | Operativni sistemi | 11 | 3.2.2009 23:36 |
Zanimljiv problem Paljenja | risiko | Kvarovi | 7 | 12.2.2007 1:46 |
Pioneer 110D - DVD rezac PROBLEM | overlord | Nosači podataka | 16 | 5.2.2006 10:54 |
Problem sa XP-om | vladale | Operativni sistemi | 10 | 21.1.2006 22:11 |
U.S. Robotics problem | Nikola Milosavljevic | Kvarovi | 7 | 12.12.2005 0:36 |