» »

Ciklično routanje po grafu ali nekaj podobnega

Ciklično routanje po grafu ali nekaj podobnega

dr. Zgemba ::

Imam tako situacijo.
Vzamimo zemljevid in iz njega zgradimo graf ulic. Križišče je vozlišče, uteži povezav so razdalje med križišči. Za vsako vozlišče vem še geografsko širino in dolžino.
Iz izhodiščnega vozlišča želim poiskati vse poti, ki se vrnejo nazaj v izhodišče. Pri tem lahko postavljam dodatne omejitve, npr:
- pot mora iti skozi nekaj izbranih vozlišč
- dolžina poti mora biti čim bližja izbrani
- nočem subciklov, razen degeneriranih v krajše vračanje po isti poti
- iz izhodišča želim krenit v dano smer (S, J, V, Z)
- nočem nazaj v izhodišče ampak v poljubno vozlišče
- in podobno...

Kakšna ideja, kako se zadeve lotit elegantno? Na pamet mi najprej pade nekaj (na grobo) v stilu A*, s hevristiko, ki rine v želeno smer in zavrača neperspektivna kandidatna vozlišča.

OwcA ::

Kak evolucijski algoritem?
Načeloma iščeš Hamilltionanove cikle (na podgrafih) kar je NP-polen problem, tako da izjemno elegantnih rešitev ni.
Otroška radovednost - gonilo napredka.

dr. Zgemba ::

To je sicer res, ampak Hamiltonovi cikli na podgrafih so dejansko prestrog kriterij za pogoje in so samo podmnožica meni interesantnih rešitev.
Praktično rabim suboptimalne rešitve, itak so dodatni pogoji 'mehki' in sploh ni nujno, da jih je mogoče eksaktno izpolnit.

Zadeva bo praktično uporabna, če bo delovala na poprečnem PC-ju v skoraj realtime na nekaj deset tisoč vozliščih.

snow ::

> Iz izhodiščnega vozlišča želim poiskati vse poti, ki se vrnejo nazaj v izhodišče.

Vse poti? Koliko vozlišč pa imaš?

Evolucijski ja... ampak niti nebi bil tako preprost. Načeloma razumem problem.. ampak tisto z vsemi možnimi potmi me moti.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Gundolf ::

> Iz izhodiščnega vozlišča želim poiskati vse poti, ki se vrnejo nazaj v izhodišče.
Če iščeš vse poti (brez podciklov, tako da jih ni neskončno) potem brezveze A*. Iščeš pač po drevesu rešitev v globino, širino, kakorkoli ti paše, dokler celega ne preiščeš.

> - dolžina poti mora biti čim bližja izbrani
To je sedaj povsem drug primer, kjer bi kakšen sistem lokalne optimizacije prišel prav, npr. postaviš random rešitev in jo potem po odsekih popravljaš da se približaš tvoji iskani dolžini.

> - pot mora iti skozi nekaj izbranih vozlišč
Potem razdeliš problem na podprobleme ko iščeš poti med posameznimi podanimi vozlišči

Ker imaš toliko različnih omejitev je težko kaj smiselnega izbrati, kar bi se v vseh primerih razumno obnašalo. Jaz bi morda poskusil takole. Gradnja poti od starta do cilja in hkrati od cilja do starta (naključna ali po A* ali kako drugače). Ko se poti srečata imaš rešitev. Potem to rešitev optimiraš ali pa poiščeš nove, odvisno od izbranih omejitev. Če imaš podana obvezna vozljišča potem hkrati gradiš poti iz vseh obveznih vozlišč v vsa druga obvezna vozlišča. Tiste poti, ki se prve srečajo obdržiš, ostale zavržeš. Seveda pri pogoju da je obveznih vozlišč malo, drugače bo to boom v kompleksnosti. Če imaš podano željeno dolžino poti lahko prvo dobljeno pot potem spreminjaš po odsekih (med obveznimi vozlišči). Za cikle skrbiš med gradnjo. Za željeno smer skrbiš takisto med gradnjo (recimo da ti A* poti bližje vozlišču, ki gredo v napačno smer slabo oceni). In podobno...

Thomas ::

Če je to nek precej konstanten zemljevid - recimo Ljubljane - bi se jest lotil takole.

Zgeneriral bi vse permutacije križišč in iz njih izločal "neprehodne". Vse krajše od neke konstante bi skladiščil v neko veliko polje ali datoteko, ki bi jo potem že poindeksiral.

Desetkrat(?) gnezdena for zanka, kjer gre vsaka zanka skozi vsa križišča.

Early exist, kadar stvar "nikamor ne vodi".
Man muss immer generalisieren - Carl Jacobi

dr. Zgemba ::

Hvala vsem, nekaj novih idej je padlo.

Sergio ::

Ali si ze kdaj programiral v Prologu? Ker je to pretezno logicni problem, bi se ga dalo elegantno resit z uporabo Prologa.

Kar pa ne zagotavlja hitrosti.

Za delovanje v real time na nekaj deset tisoc vozliscih bos pa moral poiskati, kot si sam rekel, suboptimalne resitve. Poglej si kaksno resitev HC z uporabo aproksimacijskih algoritmov, kjer lahko na racun natancnosti oziroma omejitve inputa zrtvujes NP-polnost.
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

Sergio ::

- dolžina poti mora biti čim bližja izbrani
- nočem nazaj v izhodišče ampak v poljubno vozlišče

Ce upostevas alineji, potem temu problemu recemo problem minimalnega vpetja drevesa (Minimal Spanning Tree), ce se pravilno razumeva. Problem ni NP-poln.
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Napadi z 51 odstotki postajajo resničnost

Oddelek: Novice / Kriptovalute
1915253 (10180) Eandro5res
»

Izračun normale v C++ in povezava z Excelom

Oddelek: Programiranje
141616 (1266) primoz4p
»

Pozor, pokvarjena čebula

Oddelek: Novice / Varnost
117032 (5083) poweroff
»

[C++] Iskalno drevo implementacija

Oddelek: Programiranje
52276 (1834) eXoo
»

Računalnik (končno) dovolj dober za pravoveren matematični dokaz (strani: 1 2 )

Oddelek: Novice / --Nerazporejeno--
677966 (6336) Thomas

Več podobnih tem