PROJEKT Z TEORETYCZNYCH PODSTAW INFORMATYKI

Podobne dokumenty
z :11

Algorytmy wyznaczania centralności w sieci Szymon Szylko

Podstawowe informacje o obsłudze pliku z uprawnieniami licencja.txt

Algorytm. a programowanie -

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Reprezentacje grafów nieskierowanych Reprezentacje grafów skierowanych. Wykład 2. Reprezentacja komputerowa grafów

Rekurencje. Jeśli algorytm zawiera wywołanie samego siebie, jego czas działania moŝe być określony rekurencją. Przykład: sortowanie przez scalanie:

Programowanie w języku Python. Grażyna Koba

Program 14. #include <iostream> #include <ctime> using namespace std;

Co to jest algorytm? przepis prowadzący do rozwiązania zadania, problemu,

1 Podstawy c++ w pigułce.

Programowanie w języku C++ Grażyna Koba

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Przykładowe sprawozdanie. Jan Pustelnik

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

TEST Z INSTRUKCJĄ I KARTĄ ODPOWIEDZI DLA UCZNIA

Program EWIDENCJA ODZIEŻY ROBOCZEJ INSTRUKCJA UŻYTKOWNIKA Przejdź do strony producenta programu

1 Podstawy c++ w pigułce.

Pomoc do programu Oferent

Instalacja i opis podstawowych funkcji programu Dev-C++

Porównanie algorytmów wyszukiwania najkrótszych ścieżek międz. grafu. Daniel Golubiewski. 22 listopada Instytut Informatyki

MenadŜer haseł Instrukcja uŝytkownika

Instalacja serwera Firebird

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Informatyka, Ćwiczenie Uruchomienie Microsoft Visual C++ Politechnika Rzeszowska, Wojciech Szydełko. I. ZałoŜenie nowego projektu

OSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) Algorytmy i Struktury Danych PIŁA

Sprawozdanie do zadania numer 2

1 Zapoznanie się ze środowiskiem Xenomai.

Kabel USB 2.0 do połączenia komputerów PCLinq2 (PL-2501) podręcznik uŝytkownika

3. Opracować program kodowania/dekodowania pliku tekstowego. Algorytm kodowania:

Program EWIDENCJA ODZIEŻY ROBOCZEJ INSTRUKCJA UŻYTKOWNIKA Przejdź do strony producenta programu

Modelowanie Systemów Dynamicznych Studia zaoczne, Automatyka i Robotyka, rok II. Podstawy MATLABA, cz2.

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu

Ćwiczenie 1. Przygotowanie środowiska JAVA

Wstęp. do języka C na procesor (kompilator RC51)

KaŜdy z formularzy naleŝy podpiąć do usługi. Nazwa usługi moŝe pokrywać się z nazwą formularza, nie jest to jednak konieczne.

Podstawy obsługi aplikacji Generator Wniosków Płatniczych

Zofia Kruczkiewicz, Algorytmu i struktury danych, Wykład 14, 1

z :16

c. Co by było, gdyby krok nr 2 wyglądał: przypisz k liczbę 1

Porównanie wydajności CUDA i OpenCL na przykładzie równoległego algorytmu wyznaczania wartości funkcji celu dla problemu gniazdowego

Problem straŝaka w drzewach. Agnieszka Skorupka Matematyka Stosowana FTiMS

Systemy liczenia. 333= 3*100+3*10+3*1

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

Efektywna metoda sortowania sortowanie przez scalanie

Routing. mgr inż. Krzysztof Szałajko

SystimPlus. Dokumentacja (FAQ) dla wersji: v

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 8. Karol Tarnowski A-1 p.

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

lekcja 8a Gry komputerowe MasterMind

Przypominacz Instrukcja uŝytkownika

etrader Pekao Podręcznik użytkownika Jak zacząć pracę z etrader Pekao?

PRZEWODNIK PO ETRADER PEKAO ROZDZIAŁ I. JAK ZACZĄĆ PRACĘ Z ETRADER PEKAO? SPIS TREŚCI

Teraz bajty. Informatyka dla szkoły podstawowej. Klasa VI

Instrukcja Instalacji

Mazowiecki Elektroniczny Wniosek Aplikacyjny

Wewnętrzny Pomiar Ryzyka* (WPR)

Informatyka I Lab 06, r.a. 2011/2012 prow. Sławomir Czarnecki. Zadania na laboratorium nr. 6

Divar - Archive Player. Instrukcja obsługi

Podstawy programowania Laboratorium. Ćwiczenie 2 Programowanie strukturalne podstawowe rodzaje instrukcji

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Ćwiczenie: JavaScript Cookies (3x45 minut)

WyŜsza Szkoła Zarządzania Ochroną Pracy MS EXCEL CZ.2

1. Znajdowanie miejsca zerowego funkcji metodą bisekcji.

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

Uniwersytet Zielonogórski Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Sterowania i Systemów Informatycznych

Multimetr cyfrowy MAS-345. Instrukcja instalacji i obsługi oprogramowania DMM VIEW Ver 2.0

Instrukcja instalacji

Usuwanie Trojana Zbot/Zeus/Panda

KANCELARYJNY SYSTEM PODATKOWY

Ustawianie lokalizacji dla indeksów Ustawianie lokalizacji dla indeksów spis kroków

Kondensator, pojemność elektryczna

Wykorzystanie protokołu SCEP do zarządzania certyfikatami cyfrowymi w systemie zabezpieczeń Check Point NGX

Administracja sieciowymi systemami operacyjnymi III Klasa - Linux

Tworzenie oprogramowania

POP 3.1. Czyli krótka historyjka w obrazkach jak poprawnie zainstalować i korzystać z programu POP

Ogólne wiadomości o grafach

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

1. Instalacja systemu Integra 7

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

W dowolnym momencie można zmienić typ wskaźnika.

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

ZAJĘCIA 25. Wartość bezwzględna. Interpretacja geometryczna wartości bezwzględnej.

Zadanie programistyczne nr 2 z Sieci komputerowych

System plików. Podstawy systemu Linux

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

EGZAMIN POTWIERDZAJĄCY KWALIFIKACJE W ZAWODZIE Rok 2018 ZASADY OCENIANIA

znalezienia elementu w zbiorze, gdy w nim jest; dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany.

Konfiguracja komputera przeznaczonego do pracy z IndustrialSQL Server 8.0 (komputer serwer)

Instytut Fizyki Politechniki Łódzkiej Laboratorium Metod Analizy Danych Doświadczalnych Ćwiczenie 3 Generator liczb losowych o rozkładzie Rayleigha.

Ćwiczenie 1. Wprowadzenie do programu Octave

Teoria automatów i języków formalnych. Określenie relacji

Strumienie, pliki. Sortowanie. Wyjątki.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

PLAN ZARZĄDZANIA WYMAGANIAMI PROJEKT <NAZWA PROJEKTU> WERSJA <NUMER WERSJI DOKUMENTU>

Laboratorium - Monitorowanie i zarządzanie zasobami systemu Windows Vista

Transkrypt:

Autor: DAWID PICHEN (132775) PROJEKT Z TEORETYCZNYCH PODSTAW INFORMATYKI Temat: ALGORYTM DIJKSTRA Wstęp Celem niniejszego projektu była implementacja, analiza i wskazanie złoŝoności obliczeniowej algorytmu Dijkstra. Algorytm Dijkstra słuŝy do wyznaczenia najmniejszej odległości od ustalonego wierzchołku do pozostałych wierzchołków grafu skierowanego. KaŜda krawędź grafu ma przypisaną odległość (lub wagę, jednak jej wartość musi być dodatnia). Nazwa tego algorytmu pochodzi od nazwiska jego twórcy, holenderskiego naukowca, pioniera informatyki Edsger a Wybe Dijkstra. Opis programu Analiza algorytmu Dijkstra polegała na mierzeniu czasu, jaki jest potrzebny na wyznaczenie najkrótszej ścieŝki od zadanego wierzchołka do wszystkich pozostałych wierzchołków. Badałem czas wyznaczenia podzbioru elementów dla 10, 50, 75, 100, 250, 500, 750, 1000 wierzchołków grafu. Dla kaŝdej z liczby wierzchołków, program wykonywał algorytm Dijkstra na liczbie krawędzi zaleŝnych od liczby wierzchołków, w taki sposób, Ŝe liczba krawędzi wynosiła 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80% i 90% liczby wierzchołków. Graf był reprezentowany, jako kwadratowa macierz odległości między wierzchołkami. KaŜdy z elementów macierzy był liczbą całkowitą bez znaku (unsigned int), liczba taka jest reprezentowana w pamięci w postaci 4 bajtów (kompilator GCC dla procesora i systemu 32-bitowego). Do implementacji grafu wybrałem macierz odległości, poniewaŝ metoda nadaje się doskonale dla duŝej liczby wierzchołków, gdyŝ dostęp do danych o odległościach grafu jest bardzo szybki. Oczywiście macierz kwadratowa zajmuje duŝo pamięci operacyjnej, jednakŝe dla 1000 wierzchołków, zapotrzebowanie na pamięć wyniesie (1000 4B) 2 ~15,3 MB. Jest to dopuszczalny blok pamięci, gdyŝ cały blok jeszcze zmieści się fizycznie w pamięci RAM. Jak w poprzednich projektach, tak teŝ w tym projekcie postanowiłem napisać program testujący algorytm Dijkstra w języku ANSI C, gdyŝ zaleŝało mi na moŝliwie szybkiej pracy programu. Aplikacja została napisana dla systemu operacyjnego Linux, jednakŝe nie powinno być większych problemów z jej skompilowaniem w innych systemach UNIXowych. Program składa się z 3 plików z kodami źródłowymi i 2 plików nagłówkowych. Plik main.c zawiera główną pętlę programu odpowiedzialną za uruchamiania algorytmu Dijkstra dla róŝnej liczby wierzchołków grafu, jak i dla róŝnej liczby krawędzi tegoŝ grafu. Dla kaŝdej pary danych o grafie (tzn. liczby wierzchołków i krawędzi) program wykonuje L_PROB prób wykonania algorytmu (domyślnie 10, definiowane w pliku czas.h). Dla kaŝdej pary danych o grafie alokowana jest macierz grafu, zawierająca dane o odległościach wierzchołków. Odległości wybierane są losowo, ich maksymalne ograniczenie górne zdefiniowane jest poprzez definicje

OGR_DROGI pliku graf.h (domyślne ograniczenie 20). W programie przyjąłem, Ŝe szukam najkrótszych dróg od pierwszego wierzchołka grafu do pozostałych wierzchołków. Jeśli jednak chcielibyśmy badać najkrótsze drogi od innego wierzchołka grafu, to wystarczy zmień argument wierzcholek_poczatkowy funkcji AlgorytmDijkstra(). Plik graf.c zawiera m.in. implementację algorytmu Dijkstra. Znajdują się w nim funkcje pozwalające zaalokować oraz zwolnić pamięć na macierz grafu, jak równieŝ funkcja wyświetlająca na ekranie macierz grafu, jak równieŝ zawartość wektora rozwiązań algorytmu Dijkstra.. Domyślnie program nie wyświetla macierzy grafu ani wektora wyniku, zawierającego najkrótsze drogi od wskazanego wierzchołka. Jeśli jednak chcemy zobaczyć powyŝsze dane, naleŝy ustawić makrodefinicję POKAZUJ_WSZYSTKO w pliku main.c. Jeśli dodatkowo ustawimy makrodefinicję POKAZ_KROK_PO_KROKU w pliku graf.c, to zobaczymy kaŝdy kolejny etap wykonywania algorytmu. W pliku tym znajduje się równieŝ funkcja wypełniająca macierz grafu wartościami losowymi, która wbrew pozorom nie jest prosta. Wypełnianie macierzy odbywa się w taki sposób, Ŝe dla kaŝdego wierzchołka losowany jest numer wierzchołka do którego moŝna poprowadzić krawędź, następnie sprawdzana jest wartość drogi wpisana we wskazanym miejscu w macierzy. Jeśli wartość ta jest równa nieskończoności, to znaczy, ze moŝna w nią wpisać losową wartość drogi, tworząc tym samym nową krawędź. W przeciwnym wypadku mamy do czynienia z dwiema sytuacjami: 1) wylosowany numer wierzchołka jest taki sam jak wierzchołek z którego chcemy poprowadzić graf, lub 2) do tego wylosowanego wierzchołka krawędź została juŝ poprowadzona. Generowana jest taka liczba krawędzi jaka została podana w argumencie funkcji. W pliku nagłówkowym graf.h oprócz nagłówków funkcji znajduje się takŝe definicje typu strukturowego zawierających dane o elementach wektora roboczego algorytmu. Dane te, to aktualna najkrótsza droga, oraz informacja o tym, czy wierzchołek ma być usunięty dla dalszych kroków algorytmu. Znajduje się takŝe makrodefinicja nieskończoności, bowiem liczby unsigned int mają ograniczone zakresy danych, dlatego przyjąłem, Ŝe nieskończoność to maksymalna wartość moŝliwa do zapisania na tego typu danych, czyli 4294967295. Z kolei plik czas.c zawiera funkcje związane z pomiarem czasu, jak równieŝ obliczaniem wartości średniej z L_PROB prób wykonywania algorytmu. ZaleŜało mi na jak najdokładniejszym pomiarze czasu. Nie mogłem uŝyć funkcji time(), gdyŝ funkcja ta zwracała czas tylko z dokładnością do sekundy. Postanowiłem wykorzystać w tym celu systemową funkcję gettimeofday(struct timeval *tp, void *tzp). Funkcję tę omówiłem szczegółowo w sprawozdaniach do poprzednich projektów. Program wyświetla wyniki czasów wykonania algorytmu na ekranie w sposób szczegółowy, tzn. dla kaŝdej próby. Tworzy on takŝe plik wyniki.txt w katalogu w którym został uruchomiony. Plik ten zawiera wyniki średnich czasów realizacji algorytmu Dijkstra dla kaŝdej zadanej ilości wierzchołków i krawędzi grafu. Kompilacja programu Dołączony do projektu dysk zawiera pliki źródłowe, jak równieŝ skompilowany plik wykonywalny programu. Uruchamiamy program poleceniem projekt3. Jeśli jednak chcemy skompilować program ze źródeł, to najpierw naleŝy go wypakować z archiwum poleceniem: tar -zxvf projekt3.tar.gz następnie uruchamiamy kompilację poleceniem make. Analiza złoŝoności obliczeniowej Przebieg programu dla kaŝdej pary liczby wierzchołków i krawędzi, oraz dla kaŝdej próby przedstawia się następująco: 2

1) alokuj pamięć na macierzy grafu; 2) wypełnij macierz odległościami między wierzchołkami; 3) alokuj pamięć na wektor roboczy algorytmu Dijkstra; 4) wykonanie algorytmu Dijkstra; 5) wynik problemu znajduje się w wektorze roboczym; 6) zwolnij pamięć macierzy i wektora. Analizę złoŝoność obliczeniową przeprowadzę dla kroku 3 i 4, gdyŝ zakładam, Ŝe algorytm Dijkstra znajduje wektor najkrótszych dróg dla podanej wcześniej macierzy. Oczywistym jest, Ŝe alokacja pamięci ma złoŝoność obliczeniową O(1). Pierwszym krokiem algorytmu Dijkstra jest skopiowanie zawartości wiersza, odpowiadającego wierzchołkowi początkowemu, z macierzy głównej do wektora robocza. ZłoŜoność tego kroku wynosi O(n). Następnie wykonywana jest pętla dopóty, dopóki w wektorze będą znajdowały się elementy nieusunięte. Pętla ta wykonuje zatem się n-1 razy. W pierwszym kroku pętli kroku dokonywana jest relaksacja drogi, złoŝoność obliczeniowa tego kroku wynosi O(n). W drugim kroku pętli kroku dokonywana znajdowany jest najmniejszy nieusunięty element wektora oraz usunięcie go z tego wektora. ZłoŜoność obliczeniowa tego kroku wynosi O(n). W drugim kroku pętli kroku dokonywana znajdowany jest najmniejszy nieusunięty element wektora oraz usunięcie go z tego wektora. ZłoŜoność obliczeniowa tego kroku wynosi O(n). Podsumowując, ogólna złoŝoność obliczeniowa algorytmu Dijkstra, to: O(1+(n-1) (n+n+n)) = O(1 + (n-1) (3n))= O(1+n 2 )=O(n 2 ). Jest to złoŝoność wielomianowa. Badanie czasów sortowań Uruchomiłem napisany program na następującym systemie komputerowym: o procesor: Intel Pentium III 450 MHz, o pamięć RAM: 160 MB SDRAM PC-100, o system operacyjny: Slackware Linux 10, o jądro systemu: 2.6.11.7. Przed uruchomieniem programu zamknąłem wszystkie zbędne procesy, które potencjalnie mogłabym spowalniać pracę aplikacji, pozostawiłem tylko niezbędne procesy systemowe. Program został uruchomiony pod zwykłą konsolą tekstową (serwer X wyłączony). Po uruchomieniu programu uzyskałem następujące wyniki (załączone na dyskietce). Otrzymane wyniki w tabeli: Liczba Liczba krawędzi jako procent liczby wierzchołków wierzchołków 10% 20% 30% 40% 50% 60% 70% 80% 90% 10 0,000016 0,000017 0,000020 0,000018 0,000033 0,000020 0,000018 0,000018 0,000022 50 0,000295 0,000309 0,000327 0,000340 0,000349 0,000358 0,000347 0,000335 0,000334 75 0,000659 0,000699 0,000738 0,000765 0,000791 0,000792 0,000786 0,000767 0,000752 100 0,001171 0,001236 0,001301 0,001363 0,001387 0,001398 0,001378 0,001356 0,001332 250 0,007339 0,007719 0,008119 0,008466 0,008616 0,008613 0,008570 0,008463 0,008391 500 0,032420 0,033970 0,035378 0,036030 0,037256 0,038195 0,038008 0,037160 0,036185 750 0,073466 0,076952 0,077574 0,081713 0,085217 0,086066 0,084808 0,081546 0,078935 1000 0,129340 0,133085 0,136548 0,145897 0,151993 0,152237 0,147909 0,141655 0,137980 3

Wnioski: Patrząc na dane w tabeli zauwaŝamy, Ŝe czas wykonania algorytmu głównie zaleŝy tylko od liczby wierzchołków. Owszem, liczba krawędzi równieŝ wpływa na otrzymane wyniki, jednak w niewielkim stopniu. Spostrzegamy następującą prawidłowość. Dla kaŝdej liczby wierzchołków algorytm wykonuje się najdłuŝej, jeśli liczba krawędzi w grafie będzie odpowiadała ok. 60% liczby wierzchołków. Natomiast najlepszy czas działania algorytm uzyskuje dla jak najmniejszej liczby krawędzi w grafie. Jednak liczba krawędzi mimo wszystko ma znikomy wpływ na czas wykonania algorytmu. Jak widać z wykresu czasu działania od liczby krawędzi, wartość czasu rośnie parabolicznie wraz z wzrastającą liczbą wierzchołków. Potwierdza to badania złoŝoności obliczonej, która wynosi O(n 2 ) dla tego algorytmu. Na zakończenie warto nadmienić, Ŝe algorytm Dijkstra jest szeroko stosowany. Jest on między innymi wykorzystywany w Internetowym protokole OSPF (Open Shortest Path First), uŝywanym przez zaawansowane routery do badania najlepszej trasy do innych węzłów sieci. 4

Wybrane wykresy Średni czas wykonywania algorytmu [s] (liczba krawędzi stanowi 50% liczby wierzchołków) 0,16 0,14 0,12 0,1 0,08 0,06 0,04 0,02 0 0 200 400 600 800 1000 Liczba krawędzi Średnie czasy wykonania algorytmu [s] (liczba wierzchołków 1000) 0,16 0,14 0,12 0,1 0,08 0,06 0,04 0,02 0 0 200 400 600 800 1000 Liczba krawędzi 5