Celem projektu jest stworzenie programu dydaktycznego wprowadzającego w problematykę zadań transportowych, oraz ich metody i algorytmy rozwiązywania. Końcowym efektem jest statystyczne porównanie uzyskanych wyników.
Program jest dydaktyczna formą przedstawienia problemu transportowego rozwiązanego kilkoma algorytmami. Jest przeznaczona dla odbiorów mało zaznajomionych z tematem chcących lepiej poznać zagadnienie zarówno problemu transportowego jak i algorytmów heurystycznych. Program w prosty sposób za pomocą slajdów wprowadza użytkownika w cześć teoretyczna problemu. Może przeczytać o zagadnieniu, warunkach i wymaganiach stawianych przez problem. Następnie na kolejnym slajdzie użytkownik przechodzi do części praktycznej gdzie jest konkretne zadanie do rozwiązania. A mianowicie mamy pewnego właściciela firmy transportowej Jana Kowalskiego, który zwraca się do nas o pomoc w rozwiązaniu jego problemu. Ma do dyspozycji kilka ciężarówek i mnóstwo klientów, których ma odwiedzić. Całe zagadnienie sprowadza się do rozwiązania problemu komiwojażera (TSP). Użytkownik ma pełna kontrole nad zadaniem. Może ustawić takie parametry jak ilość klientów do odwiedzenia oraz ich współrzędne na mapie, koszt paliwa, ilość ciężarówek, ilość litrów spalanych przez ciężarówkę, itp. Poruszając się za pomocą myszki użytkownik programu ma możliwość dokonać wszelkich zmian, według własnego upodobania. Kiedy już sprecyzuje zadanie może przejść do rozwiązania problemu. Tutaj ma pełną swobodę wyboru algorytmu, oraz ich parametrów, może odpowiednio przyśpieszyć lub polepszyć działanie programu:
Do dyspozycji są algorytmy:
a) Symulowane wyżarzanie
b) Algorytm genetyczny
c) Algorytm zachłanny (losowy)
Po wybraniu odpowiednich parametrów użytkownik może uruchomić algorytm, zobaczyć jego efekty działania, oraz wyznaczoną trasę. Na koniec użytkownik może na wykresie zobaczyć przebieg poszukiwań rozwiązania, ilość cykli, oraz odczytać statystyki dla najlepszego rozwiązania. Daje to możliwość efektywnego porównania algorytmów, oraz ich wyników. Oczywiście istnieje możliwość powtórzenia działania algorytmu, uruchomienie innego algorytmu z innymi parametrami tak aby zobaczyć jak dane zmiany wpływają na końcowy wynik. Poruszając się wstecz i do przodu w slajdach można dowolnie zmieniać wszelkie wcześniej ustawione parametry.
Do rozwiązania problemu zastosowano 3 algorytmy:
Opis algorytmu pochodzi ze strony: http://kysy.rst.com.pl/projects.php
Jedną z
popularnych metod poszukiwania globalnego rozwiązania jest symulowane
wyżarzanie. W 1983 roku naukowcy Scott Kirkpatrick, Charles Gelatt i
Mario
Vecchi zaproponowali algorytm, którego ideę obrazuje stosowana
od wielu wieków
przez kowali metoda wyżarzania metalu w procesie jego hartowania. W
algorytmach
przeszukiwania, w tym także symulowanego wyżarzania, zakłada się, że
dla
każdego elementu przestrzeni rozwiązań potrafimy wyznaczyć wartość
funkcji
oceniającej jakość rozwiązania. Zazwyczaj funkcja ta ma interpretację
kosztową
i jej wartość jest odwrotnie proporcjonalna do jakości rozwiązania.
Szukamy,
zatem takiego elementu przestrzeni rozwiązań, w którym funkcja
kosztów jest
minimalna. Algorytm symulowanego wyżarzania działa iteracyjnie, krok po
kroku zbliżając
się do rozwiązania optymalnego. Jako kolejne przybliżenie rozwiązania
może być
wybrany dowolny element przestrzeni potencjalnych rozwiązań. Jednak
jego wybór
jest uzależniony od dwóch podstawowych czynników. Po
pierwsze - od różnicy
wartości między starym rozwiązaniem a propozycją nowego rozwiązania.
Jeżeli
propozycja nowego rozwiązania jest lepsza od swego poprzednika, to
zostaje ona
zatwierdzona jako nowe rozwiązanie (ponieważ lepiej przybliża
rozwiązanie
optymalne). Natomiast, jeśli nowa propozycja jest gorsza od
dotychczasowego
rozwiązania, wybiera się je drogą losowania. Wówczas
prawdopodobieństwo wyboru
nowej propozycji rozwiązania jest tym mniejsze, im różnica
między rozwiązaniami
jest większa. Ma to na celu ograniczenie zbytniego oddalenia się od
wcześniej
znalezionego rozwiązania.
Parametr nazywany temperaturą reguluje proces wyboru kolejnych przybliżeń w przypadku, gdy propozycja nowego rozwiązania jest gorsza. Jeżeli wartość temperatury jest duża, to prawdopodobieństwo wyboru jest duże. Jeżeli wartość temperatury jest mała, to prawdopodobieństwo wyboru nowego rozwiązania, gorszego od poprzednika, jest bardzo małe. Temperatura jest w miarę postępowania algorytmu stale obniżana. Oznacza to, że w kolejnych krokach szansa przejścia do nowego, gorszego położenia maleje. Z upływem czasu rozwiązanie stabilizuje się, aż wreszcie żadne zmiany nie są akceptowane. Algorytmy tego typu są wykorzystywane do poszukiwania rozwiązań bliskich rozwiązaniom optymalnym w dużych zadaniach optymalizacyjnych.
Opis algorytmu pochodzi ze strony: http://www.alife.pl/portal/gp/p/AGwstep.html
Algorytm genetyczny to najprościej rzecz ujmując jest to próba zasymulowania w pamięci komputera populacji jakiegoś gatunku. Na taką populację składają się dziesiątki, setki, tysiące pojedynczych osobników. Osobniki te między sobą mogą się krzyżować, mogą również następować jakieś samoistne zmiany w strukturze pojedynczego osobnika (tzw. mutacja). W wyniku krzyżowania i mutacji powstają nowe osobniki. Ze względu na fakt, że populacja ma swój z góry narzucony maksymalny rozmiar część osobników należy z niej usunąć (ten krok nazywany jest selekcją). Oczywiście usuwane są te najmniej przystosowane... Cały ten proces (krzyżowanie, mutacja, selekcja) powtarzany ustaloną wartość kroków. Jeżeli przez dłuższy czas nic się nie zmieni to kończone jest działanie programu.
Jako 'gatunek' przyjmujemy drogę dla ciężarówki, która ma pokonać. Każdy osobnik będzie pamiętał jedną trasę. Takich osobników może być dowolna ilość (im więcej tym bardziej zróżnicowana populacja jednak kosztem dłuższych obliczeń). Na początku do każdego osobnika wpisujemy trasę zupełnie losową... I rozpoczynamy algorytm genetyczny. Krzyżowanie polega na wymianie pomiędzy dwoma osobnikami pewnych elementów tras, natomiast mutacja może oznaczać wymianę w pojedynczym osobniku dwóch miast między sobą. Jeśli dodamy do tego krok selekcji, czyli wybór do następnej populacji osobników najlepiej przystosowanych (to znaczy takich które reprezentują trasy o najmniejszym koszcie) otrzymamy algorytm, który po pewnej liczbie kroków znajdzie nam całkiem niezłą trasę przez wszystkie miasta.
Dla porównania napisano kolejny prosty algorytm, który działa całkowicie w sposób losowy. Z istniejącej trasy wybierane są 2 dowolne miasta i cały ciąg miast pomiędzy nimi zamienia swoją kolejność. Jeżeli funkcja celu polepszyła się to nowa trasa zostaje zapisana. Potem znowu losujemy 2 miasta itd. Algorytm dzięki niewielu operacjom jest w stanie w szybkim czasie zaleś rozsądne rozwiązanie, które jest minimum lokalnym.
Opisany program oraz algorytmy całkowicie został zaimplementowane w C++ Borland Builder. W znacznej części wykorzystane zostały komponenty VCL do komunikacji programu z użytkownikiem. Wszystkie implementacje algorytmów zostały samodzielnie napisane z wykorzystaniem ogólnej teorii na temat sposobów realizacji.
Pierwszy slajd przedstawia wstęp teoretyczny do zagadnienia problemu transportowego. Założenia transportowe oraz sposób wyznaczania funkcji celu. Aby móc przejść do następnej strony klikamy w przycisk „>>” znajdujący się na prawo od napisu Teoria.
Slajd nr 1 przedstawiający wstęp teoretyczny do zagadnienia transportowego
Kolejny slajd opisuje konkretny problem właściciela pewnej firmy transportowej, który zwraca z pomocą o rozwiązanie problemu minimalizacji kosztów transportu. Poniżej opisany jest sposób rozwiązania problemu, ustawienia parametrów, oraz możliwe do wyboru algorytmy.
Slajd 2: Opis zadania problemu transportowego
Poniżej należy sprecyzować parametry zadania. Najpierw należy ustalić liczbę odbiorców do odwiedzenia. Następnie wybrać współrzędne dla punktów odbioru towarów. Do wyboru mamy, współrzędne:
Po wybraniu współrzędnych należy sprecyzować ceny paliwa, zużycie benzyny na 100 km, oraz ilość dostępnych ciężarówek przez firmę. Na prawo wyświetlone zostaną współrzędne punktów dystrybucji. Aby anulować współrzędne należy kliknąć w przycisk resetuj współrzędne.
Slajd 3: Ustawienie parametrów zadania transportowego
Ustawienie parametrów algorytmu dokonuje się przez wpisanie odpowiednich wartości w podanych poniżej polach. Do symulowanego wyżarzania możemy zmienić:
1. temperaturę początkową
2. szybkość studzenia (parametr delta)
W algorytmie genetycznym mamy większą możliwość zmiany parametrów. Ustawić możemy:
1. Liczebność populacji
2. Prawdopodobieństwo krzyżowania
3. Prawdopodobieństwo mutacji
4. Ilość kroków powtórzeń
Jest również możliwość wybrania algorytmu zachłannego, który daje całkiem dobre rezultaty przeszukiwania. Tutaj nie mamy możliwości sprecyzowania parametrów.
Na mapie możemy zobaczyć i ocenić jakość wybranej trasy.
Slajd 4 Algorytmy rozwiązania problemu
Na ostatnim slajdzie możemy zobaczyć statystyki znalezionego rozwiązania. Wykres obrazuje przebieg poszukiwania rozwiązania. Koszty danego rozwiązania w stosunku do cykli działania programu. Im więcej cykli tym rozwiązanie jest bliższe optymalnemu.
Slajd 5 Wykres i statystyki danego rozwiązania
Poniżej znajduje się tabela wraz z danymi uzyskanymi dla najlepszego znalezionego rozwiązania dla poszczególnych algorytmów. Na jej podstawie można precyzyjnie porównać i ocenić jakość danego algorytmu, oraz znalezionego rozwiania.
Do testów wybierzemy 2 zestawy zadań i porównamy uzyskane wyniki:
Cena paliwa: 4.1 zł
Zużycie benzyny: 12 l
Ilość ciężarówek: 5
|
Symulowane wyżarzanie |
Algorytm genetyczny |
||||||
|
|
|
|
|
Pop=100 Krokow=100 |
|||
|
Temp=10 Delta=0.99 Powt=50 |
Prawdop krzyz=0,6 mutacji 0,2 |
||||||
Lp |
Dlugośc |
Koszt |
Koszt |
Czas |
Dlugośc |
Koszt |
Koszt |
Czas |
|
[km] |
dzien [zl] |
mies. [zl] |
[s] |
[km] |
dzien [zl] |
mies. [zl] |
[s] |
1 |
166,6 |
409,84 |
8196 |
0,1 |
193,8 |
409,84 |
8196 |
0,311 |
2 |
166,6 |
409,84 |
8196 |
0,121 |
179,4 |
441,32 |
8826 |
0,281 |
3 |
166,6 |
409,84 |
8196 |
0,1 |
194,3 |
477,98 |
9559 |
0,2 |
4 |
170,1 |
418,45 |
8368 |
0,1 |
196,6 |
483,64 |
9672,72 |
0,19 |
5 |
166,6 |
409,84 |
8196 |
0,1 |
204 |
501,84 |
10036 |
0,22 |
|
|
|
|
|
Pop=1000 Krokow=100 |
|||
|
Temp=30 Delta=0.99 Powt=50 |
Prawdop krzyz=0,5 mutacji 0,3 |
||||||
1 |
166,6 |
409,84 |
8196 |
0,111 |
178,1 |
438,13 |
8792 |
3 |
2 |
166,6 |
409,84 |
8196 |
0,09 |
182,9 |
449 |
8998 |
2,34 |
3 |
166,6 |
409,84 |
8196 |
0,101 |
177,5 |
436 |
8733 |
2,86 |
4 |
166,6 |
409,84 |
8196 |
0,09 |
166,6 |
409,84 |
8196 |
5,1 |
5 |
166,6 |
409,84 |
8196 |
0,11 |
191,4 |
470 |
9416 |
2,8 |
|
|
|
|
|
Pop=300 Krokow=200 |
|||
|
Temp=10 Delta=0.9 Powt=5 |
Prawdop krzyz=0,7 mutacji 0,5 |
||||||
1 |
166,6 |
409,84 |
8196 |
0,03 |
178,9 |
440 |
8801 |
0,671 |
2 |
166,6 |
409,84 |
8196 |
0,04 |
191 |
472 |
9441 |
1 |
3 |
170,1 |
418,45 |
8368 |
0,03 |
185 |
455 |
9102 |
1 |
4 |
166,6 |
409,84 |
8196 |
0,03 |
180,5 |
444 |
8880 |
0,79 |
5 |
170,1 |
418,45 |
8368 |
0,021 |
167,8 |
412 |
8255 |
1,3 |
Algorytm zachłanny |
|||
Dlugośc |
Koszt |
Koszt |
Czas |
[km] |
dzien [zl] |
mies. [zl] |
[s] |
173,3 |
426 |
8526 |
0,11 |
167,8 |
412 |
8255 |
0,111 |
170,1 |
418 |
8368 |
0,09 |
167,8 |
412 |
8255 |
0,13 |
170,1 |
418 |
8368 |
0,13 |
Cena paliwa: 4.1 zł
Zużycie benzyny: 12 l
Ilość ciężarówek: 5
|
Symulowane wyżarzanie |
Algorytm genetyczny |
||||||
|
|
|
|
|
Pop=100 Krokow=100 |
|||
|
Temp=10 Delta=0.99 Powt=50 |
Prawdop krzyz=0,6 mutacji 0,2 |
||||||
Lp |
Długość |
Koszt |
Koszt |
Czas |
Długość |
Koszt |
Koszt |
Czas |
|
[km] |
dzien [zl] |
mies. [zl] |
[s] |
[km] |
dzien [zl] |
mies. [zl] |
[s] |
1 |
235,9 |
580 |
11606 |
0,49 |
601 |
1480 |
29603 |
1,2 |
2 |
235,6 |
579 |
11591 |
0,631 |
670 |
1648 |
32973 |
0,7 |
3 |
235,5 |
579 |
11586 |
0,88 |
604 |
1485 |
29716 |
0,8 |
4 |
240,3 |
591 |
11822 |
0,67 |
629 |
1549 |
30986 |
1,4 |
5 |
235,5 |
579 |
11586 |
0,901 |
632 |
1555 |
31114 |
1 |
|
|
|
|
|
Pop=1000 Krokow=100 |
|||
|
Temp=30 Delta=0.99 Powt=50 |
Prawdop krzyz=0,5 mutacji 0,3 |
||||||
1 |
236,6 |
582 |
1164 |
1,372 |
540 |
1328 |
26572 |
15 |
2 |
237,5 |
584 |
11685 |
1,432 |
568 |
1399 |
2798 |
16,8 |
3 |
235,5 |
579 |
11586 |
1,612 |
529 |
1301 |
26026 |
14,742 |
|
|
|
|
|
Pop=300 Krokow=200 |
|||
|
Temp=10 Delta=0.9 Powt=5 |
Prawdop krzyz=0,7 mutacji 0,5 |
||||||
1 |
243 |
597 |
11955 |
0,121 |
543 |
1335 |
26715 |
5,75 |
2 |
236,9 |
582 |
11655 |
0,19 |
557 |
1370 |
27409 |
4,2 |
3 |
245,8 |
604 |
12093 |
0,12 |
561 |
1380 |
27611 |
5,5 |
Algorytm zachłanny |
|||
Długość |
Koszt |
Koszt |
Czas |
[km] |
dzien [zl] |
mies. [zl] |
[s] |
239 |
588 |
11778 |
3,295 |
239,4 |
640 |
12816 |
3,35 |
258,7 |
636 |
12724 |
3,28 |
255 |
629 |
12590 |
3,2 |
255,3 |
628 |
12560 |
3 |
Analizując zad 1 wynika, że najlepsze znalezione rozwiązanie to droga o długości:
166,6 [km] koszt: 409,84 Koszt miesięczny: 8196 [ zł]
co w skali miesiąca daje najbardziej optymalny wynik
Temp=30 Delta=0.99 Powt=50
Skuteczność znajdywania najlepszego rozwiązania miał na poziomie 100% w czasie zadowalającym 0,1s.
Dla zadania 2 sytuacja się prezentowała podobnie:
Również symulowane wyżarzanie najlepiej się prezentowało ze wszystkich algorytmów. Znajdywało najlepsze rozwiązanie, oraz charakteryzuje się dużą regularnością powtarzania wyników w jednakowym czasie. Rozrzut uzyskiwanych wyników jest minimalny.
Algorytm zachłanny nie znalazł najlepszego rozwiązania, ale jego wyniki były 5% gorsze od symulowanego wyżarzania. Również czasowo był 4 razy dłuższy. Najgorzej się prezentował algorytm genetyczny. Jego wyniki były dużo gorsze od oczekiwanych.
Wynika to z tego, że algorytm genetyczny w bardzo szybkim czasie osiągał minimum lokalne. Cała populacja zostaje zdominowana przez jeden i ten sam osobnik, przez co nie ma możliwości wymiany genu. Zastosowana metoda ruletki do selekcji osobników nie jest najlepszym rozwiązaniem. Powoduje to właśnie osiąganie minimum lokalnego. Wówczas nawet mutacja niewiele nam pomaga. Zbyt mało zmian wprowadza w pojedynczym osobniku. Należało by zmienić sposób reprezentacji osobnika oraz poprawić metodę selekcji osobników, wówczas uzyskalibyśmy znacznie lepsze rezultaty, a algorytm nie osiągałby szybko minimum lokalnego.
Najlepiej zaprezentował się algorytm symulowanego wyżarzania. Zastosowane metody znacznie przyśpieszyły działanie programu, wizualnie widać ze praktycznie dany algorytm znajduje rozwiązanie optymalne. Radzi sobie doskonale z dużą ilością węzłów,: nawet 100 i 150.
Znalezienie najlepszego rozwiązania ma ogromne znaczenie. W przypadku kiedy najlepszym rozwiązaniem jest trasa o koszcie miesięcznym 11586 zł to algorytm zachłanny znajdywał najlepsza trasę o koszcie 12724 zł. To daje 800 zł różnicy. Jak widać różnica jest spora. 800 zł to minimalne wynagrodzenie 1 pracownika. Przy lepszym algorytmie osiągamy większe zyski, nie tracąc na kosztach transportu. Mimo że algorytm jest lepszy tylko o 1% to rzeczywiste koszty mają znacznie wyraźniejszą różnice. Wiec nawet jeśli algorytm symulowanego wyżarzania świetnie prezentuje się to warto jeszcze postarać się o zaimplementowanie algorytmu znajdującego jeszcze lepsze rozwiązanie. Poprawa o 1% algorytmu pozwoli zredukować koszty w skali miesięcznej nawet o pensje 1 pracownika. Wiec jest o co walczyć.
1. http://www.alife.pl/portal/gp/p/AGwstep.html
2. http://kysy.rst.com.pl/projects.php
3. http://pl.wikipedia.org/wiki/Komiwojażer
4. math.uni.lodz.pl/~marta/zajecia/sztuczna/cw6/gen.pdf