Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] alogorytm
Taifun
post 5.05.2009, 20:50:24
Post #1





Grupa: Zarejestrowani
Postów: 222
Pomógł: 2
Dołączył: 10.07.2007

Ostrzeżenie: (10%)
X----


Witam,
poszukuję pomysłu na algorytm, który oblicza możliwie jak najkrótszą trasę. Np. mieszkam w Krakowie i chcę coś załatwić. Łączę się z bazą i sprawdzam pobliskie miasta oczywiście razem z Krakowem i podaje możliwie najbliższą miejscowość gdzie to coś można załatwić.


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
korro
post 5.05.2009, 20:56:04
Post #2





Grupa: Zarejestrowani
Postów: 259
Pomógł: 42
Dołączył: 8.04.2005
Skąd: Mława

Ostrzeżenie: (0%)
-----


Witam.

Mój pomysł jest taki:
1. rozwiązujesz Kraków na koordynaty (długość i szerokość geograficzną) - reverse geocoding
2. w bazie masz miasta i ich koordynaty
3. obliczasz odległość między miejscem z punku 1 i miastami w bazie
4. sortujesz asc i masz wynik.

Pozdrawiam.

Ten post edytował korro 5.05.2009, 20:59:16


--------------------
Go to the top of the page
+Quote Post
marcio
post 5.05.2009, 21:44:52
Post #3





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Nie znam sie na algorytmach ale pamietam klase bim2 ktora napisal do swojej gry moze pomoze rozwiazac twoj problem: http://forum.php.pl/index.php?showtopic=10...t=0&start=0

Ten post edytował marcio 5.05.2009, 21:45:18


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
v1t4n
post 5.05.2009, 23:10:52
Post #4





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 19.02.2005
Skąd: Dębica

Ostrzeżenie: (0%)
-----


Otóz to sie zwie problem komiwojażera. Nie ma rozwiązania idealnego ale pełno jest tego na google.


--------------------
Psik!! A masz!! ...chamie - Porucznik Borewicz
Go to the top of the page
+Quote Post
nu_moon
post 5.05.2009, 23:15:28
Post #5





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 26.01.2006

Ostrzeżenie: (0%)
-----


Cytat(korro @ 5.05.2009, 20:56:04 ) *
Witam.

Mój pomysł jest taki:
1. rozwiązujesz Kraków na koordynaty (długość i szerokość geograficzną) - reverse geocoding
2. w bazie masz miasta i ich koordynaty
3. obliczasz odległość między miejscem z punku 1 i miastami w bazie
4. sortujesz asc i masz wynik.

Pozdrawiam.



Twój pomysł ma jedną wadę - jeśli obliczę odległość między miastami w bazie, pierwszy i tak będzie wynik Kraków - dane miasto i nie będziesz miał trasy, a jedynie odległość. Żeby zbudować tego typu algorytm musisz jakoś rozwiązać ten problem.

Cytat(v1t4n @ 5.05.2009, 23:10:52 ) *
Otóz to sie zwie problem komiwojażera. Nie ma rozwiązania idealnego ale pełno jest tego na google.


Nie do końca, problem komiwojażera dotyczy sytuacji gdzie mamy siatkę miast i musimy połączyć wszystkie miasta.
Różnica w problemie komiwojażera polega na tym że tam masz podaną siatkę odległości z miasta a i b
http://pl.wikipedia.org/wiki/Problem_komiwoja%C5%BCera

Klasycznie rozwiązanie tego problemu dla tylko 2 punktów zawsze da ci warość z tabeli ( klasyczny problem komiwojarzera rozpatruje trasę zaczynającą się w danym punkcie i kończącą się w tym samym a trasa to suma losowych przebiegów po wszystkich miastach)


Moja koncepcja jest generlanie podobna (btw. Poczytaj o algorytmach genetycznych. ):



W skrócie można to opisać tak.
Potrzebujesz dwuwymiarową siatkę układu współrzędnych gdzie będziesz umieszczał koordynaty miast.
Wartości które podasz muszą być w odpowiedniej skali, tak by wyniki był w miarę dokładny.

Możesz np. za punkt odniesienia obrać np. lewy górny róg kwadratu w którym mieści się mapa kraju, bądź użyć szerokości / długości geograficzną i zapisywać odległości w km od tego punktu jako koordynaty miasta jako x i y wyrażone w km (punkt przecięcia).

Jeśli zdecydujesz się na współrzędne geograficzne, będziesz musiał mieć naprawdę dokładne wyniki (pewnie sekundy to zamało).
Musisz też obliczyć ile jedna sekunda np. w linii prostej ma kilometrów....

Odległość między 2 miastami obliczysz z twierdzenia pitagorasa.

Teraz puszczasz możliwe dużą liczbę losowych przebiegów po miastach na zasadzie losowo wybranych kierunków i wybierasz najoptymalnieszją trasę ( najkrótsza suma przekątnych ). Problem jest o tyle skomplikowany że nie bardzo wiadomo czy między miastem A i B jest właściwe połączenie drogowe więc kierunek wyznaczony przez algorytm będzie bardzo przybliżony.

Żeby uniknąć problemu o jakim wspomniałem na początku można by np (nie komplikując struktury danych), przyjąć że maksymalny krok to np.1/20 odległości w linii prostej.

Przykład:

Szukam trasy z Katowic do Sopotu.
Na podstawie współrzędnych obliczam że jest to ok 650km w linii prostej.
Stosuje dokładość 1/20 czyli maksymalny promień poszukiwań kolejnego miasta to ok 32 km/2 (zaczynamy w krakowie, promień okręgu od miejsca docelowego czyli 17 km w dowolną stronę od punktu w którym jesteśmy itp itd.).

Algorytm można zoptymalizować stosując wagi, tzn wyznaczamy mniej więcej kierunek w jakim trzeba się poruszać i staramy się częściej losować odpowednie koordynaty. Jako optymalizację można np. przerywać przeszukiwanie drogi która już daje wynik większy niż najmniejszy znaleziony albo przekracza o xx% odległość w linii prostej itp itd. możliwości jest sporo...

Z listy przebiegów wybieramy najmniejszy który dotarł do celu (bo prawdopodobnie większość nie dotrze wcale).

O skuteczności działania algorytmu będzie decydować przyjęta dokładność i ilość przebiegów.
Mam nadzieję że pomogłem bo problem rozwiązałęm jedynie teoretycznie, choć kiedyś miałem pomysł jak napisać coś podobnego smile.gif

Ten post edytował nu_moon 5.05.2009, 23:23:56
Go to the top of the page
+Quote Post
korro
post 6.05.2009, 06:54:32
Post #6





Grupa: Zarejestrowani
Postów: 259
Pomógł: 42
Dołączył: 8.04.2005
Skąd: Mława

Ostrzeżenie: (0%)
-----


Cytat(nu_moon @ 5.05.2009, 22:15:28 ) *
Twój pomysł ma jedną wadę - jeśli obliczę odległość między miastami w bazie, pierwszy i tak będzie wynik Kraków - dane miasto i nie będziesz miał trasy, a jedynie odległość. Żeby zbudować tego typu algorytm musisz jakoś rozwiązać ten problem.

Kolejny krok to wrzucenie punktów na mapę google, a google samo wyznaczy trasę.
To moja koncepcja. smile.gif


--------------------
Go to the top of the page
+Quote Post
Zyx
post 6.05.2009, 08:07:30
Post #7





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


Żadna siatka nie jest potrzebna. Zagadnienie wyszukiwania najkrótszej drogi na siatce to szczególny przypadek wyszukiwania najkrótszej ścieżki w grafie. W przypadku siatki jest on nieskierowany i bez wag, więc cały algorytm to najzwyklejsze w świecie przeglądanie grafu wszerz (znane jako algorytm BFS). Zamiast tego, możesz stworzyć sobie graf połączeń pokazujący, skąd można dotrzeć dokąd, połączeniom przypisać wagę oznaczającą czas/odległość. Wtedy masz do dyspozycji dwa algorytmy:

Algorytm Dijkstry
Algorytm Floyda-Warshalla - znajduje ścieżki między wszystkimi parami miast.

A problemu komiwojażera tu nie mieszajcie, bo to jest zupełnie inny rodzaj problemu smile.gif.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 09:45