Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Szukam algorytmu najkrótszej drogi między końcami wielu odcinków

Ostatnio zmodyfikowano 2015-08-28 21:41
Autor Wiadomość
wefhy
Temat założony przez niniejszego użytkownika
Szukam algorytmu najkrótszej drogi między końcami wielu odcinków
» 2015-08-27 22:02:11
Szukam czegoś, co naprowadzi mnie na algorytm znalezienia najkrótszej drogi między końcami kilku(-nastu/-dziesięciu) odcinków.
Problem wygląda następująco:
Mam zbiór n odcinków(max 50-60). Każdy odcinek ma swój początek i koniec zapisany współrzędnymi. Można go przebyć w obie strony. Celem jest przebycie każdego odcinka w jedną ze stron oraz drogi między tymi wierzchołkami w jak najkrótszym czasie. W praktyce każdaz możliwych dróg zawiera w sobie długość odcinków, więc jest ona pomijalna, a liczy się odległość między kolejnymi odcinkami. Jedna z dróg np:

Każdy odcinek ma końce A i B. Zaczynamy od punktu A pierwszego odcinka. Następnie z punktu B pierwszego odcinka musimy dotrzeć do punktu B drugiego odcinka, z punktu A drugiego odcinka do punktu B czwartego, a z punktu A czwartego do punktu A trzeciego itd.
Nie mam pomysłu na znalezienie najkrótszej z tych dróg poza starą, dobrą metodą Brute force. Tyle że tych kombinacji jest sporo i o ile przy 10 odcinkach nie robi to problemu, to przy 30-u już jest gorzej i z każdym kolejnym odcinkiem czas się zwielokratnia.

{{x1,y1},{x2,y2}}
C/C++
Tablica[ 5 ][ 2 ][ 2 ] = {
    { { 40, 0 }, { 40, 20 } },
    { { 40, 10 }, { 60, 10 } },
    { { 40, 10 }, { 65, 20 } },
    { { 65, 15 }, { 90, 15 } },
    { { 80, 0 }, { 80, 20 } }
};

Myślałem nad tym, czy nie da się użyć faktu, że 0<Y<20(wszystkie odcinki mieszczą się w pewnym obszarze...), a |X2-X1|<30(...i nie są zbyt długie) i w ten sposób ustalić jako taką kolejność odcinków, co umożliwiło by podzielenie ich na grupy, ale... wierzę, że da się jakoś wydajniej i dokładniej.

Jedyny algorytm, którego umiem używać to flood fill, tu bezużyteczny, bo trzeba zaliczyć wszystkie punkty w dowolnej kolejności.
Strzelam, że powinienem szukać gdzieś wśród algorytmów rozwiązywania grafów, ale kilka przeanalizowałem i nie widzę możliwości ich implementacji(nawet nie wiem, jakiego rodzaju graf mam).
P-136942
darko202
» 2015-08-28 10:37:06
musisz poszukać wśród algorytmów google"najkrótsza ścieżka w grafie nieskierowanym"
końce odcinków uznajesz za wierzchołki grafu, a podane odcinki są krawędziami

np.
http://zasoby1.open.agh.edu.pl​/dydaktyka/informatyka​/c_algorytmy_i_str_danych​/index.php?go=minimalna_droga

http://edu.i-lo.tarnow.pl/inf​/alg/001_search/0127.php

P-136970
wefhy
Temat założony przez niniejszego użytkownika
» 2015-08-28 12:37:17
Dzięki, trochę popatrzyłem, ale nie idzie mi. Wszystko co opisywane pokazuje możliwość znalezienia jakiejkolwiek najkrótszej drogi, a mnie interesuje ta, ktora przebiega przez wszystkie odcinki.
Jednak kierując się wskazówkami i logiką udało mi się przekształcić mój problem na graf.
Uznałem, że droga 1A->2B->3B to droga między punktami: 1A->1B->2B->2A->3B->3A, czyli między kolejnymi odcinkami oznaczeniem jest jego PIERWSZY punkt. Ogólnie... nie ma znaczenia, jak, ważne, że umiem to zastosować do dowolnej liczby odcinków ;)
W rezultacie wyszedł mi graf, w którym mam podaną drogę w każdą stronę z każdego punktu do każdego. Celem jest przejechanie przez punkt (1A lub 1B) oraz (2A lub 2B) oraz (3A lub 3B)
http://snag.gy/kG7RP.jpg[/img]
[url]http://snag.gy/kG7RP.jpg[/url]

I ewentualnie przed chwilą przyszło mi do głowy inne, być może prostsze zobrazowanie. W tym wypadku punktów jest o 50% więcej, ale należy przejść przez wszystkie i droga w obie strony ma tą samą wartość.:
http://snag.gy/CyCX0.jpg[/img]
[url]http://snag.gy/CyCX0.jpg[/url]

Przepraszam, chyba nie umiem na tym forum wstawić grafiki
P-136979
darko202
» 2015-08-28 13:38:09
poczytaj o drodze Eulera, Hamiltona w grafach

i algorytmach np.
http://www.google.pl/url?sa=t​&rct=j&q=&esrc=s&source=web​&cd=10​&ved=0CFcQFjAJahUKEwiytKHl1cvH​AhUjvXIKHSTJAv0​&url=http%3A%2F%2Fwww.kaims.pl​%2F~deren%2Fgms%2Fwyklady%2F04​_kom_opt.pdf​&ei=gkXgVbLrNaP6ygOkkovoDw​&usg=AFQjCNF6fhHfww6Jy6xVXxm_nOOq1gmKpg

musisz taki algorytm tylko zmodyfikować, gdy szukasz początku uwzględniasz wszystkie wierzchołki jeszcze nie odwiedzone, ale po wyborze początku następny punkt który jest końcem odcinka jest zdeterminowany i z tego punktu końcowego kontynuujemy poszukiwania kolejnego
P-136983
wefhy
Temat założony przez niniejszego użytkownika
» 2015-08-28 21:41:51
Hamiltonowskie chyba rozwiązują sprawę. A właściwie całkowicie nie rozwiązują, bo z tego co widzę, jedyną metodą jest brutalne sprawdzenie wszystkich możliwych dróg(przynajmniej wiem, że nic lepszego nie wymyślę :D). Wychodzi na to, że nie wyrobię się z obliczeniami w rozsądnym czasie i będę musiał samemu pomyśleć, jak rozbić algorytm na fragmenty i znaleźć "prawie" optymalną drogę korzystając po części z podpowiedzi.
Niezależnie od rezultatu, wiele z tego co przeczytałem na pewno się kiedyś przyda, a pewnie i teraz pomoże mi zrobić znacznie wydajniejszy kod.
Tak, czy inaczej dzięki za pomoc. Jak uda mi się zrobić coś, co będzie działało zaskakująco dobrze, to się podzielę wynikami ;)

PS Link nie działa, wstawiam w poprawnej formie, żeby nie trzeba było potem szukać: http://www.kaims.pl/~deren/gms/wyklady/04_kom_opt.pdf
P-137013
« 1 »
  Strona 1 z 1