Warszawa, styczeń 2005

Grafy i sieci

Projekt


Generator Grafów Euklidesowych


Autorzy:

Łukasz Falaciński
Tomasz Podlaski

Założenia wstępne :

1.                              Graf Euklidesowy G jest tworzony w następujący sposób:
Dane: n –liczba wierzchołków, k–zasięg wierzchołka.
Wierzchołki są umieszczane w sposób losowy (rozkład równomierny) na płaszczyźnie
wewnątrz kwadratu o boku jednostkowym. Krawędzie grafu łączą wierzchołki, których
odległość Euklidesowa jest nie większa niż k.

2.                              D - średnica grafu t.j. największa odległość pomiędzy dwoma dowolnymi wierzchołkami
w grafie. L - średnia długość ścieżki w grafie, t.j. średnia odległość wierzchołków w
grafie, uśredniona po wszystkich parach wierzchołków.

Treść zadania :

Dla grafu G wyznaczyć :

o                                średnicę D i promień r

o                                centra

w funkcji parametrów n, k. Przedstawić wykresy zależności współczynników D, r od
parametrów modelu n, k.

Rozwiązanie :


Opis programu :

Program został napisany i do poprawnego działania wymaga środowiska JAVA. Sama aplikacja została stworzona w formie appletu i umieszczona na stronie www. Oprócz appletu dostępna jest także aplikacja(bez graficznego interfejsu), która odpowiedzialna jest za dokonywanie serii obliczeń w celu wygodniejszego tworzenia wykresów. Aplikacja oblicza średnicę i promień grafu(grafów) oraz uśrednia wyniki jeżeli zadana liczba symulacji jest większa. Program ten będzie przyjmuje następujące parametry wejściowe:
• ilość przeprowadzanych symulacji
• początkową wartość parametru n (liczba wierzchołków) dla serii symulacji
• końcową wartość parametru n dla serii symulacji
• początkową wartość parametru r (zasięg wierzchołków) dla serii symulacji
• końcową wartość parametru r dla serii symulacji
• nazwa pliku wyjściowego
• wielkość, o jaką powinny się zmieniać parametry r/n w każdym kroku symulacji

W samym applecie jako dane wejściowe wprowadzać można wartości parametrów k/n, po czym generowany i rysowany jest graf.


Opis algorytmów:

generacja grafu
Generacja grafu zapewnia losową generację(o jednostajnym rozkładzie) współrzędnych wierzchołków grafu. Założenia te spełniają biblioteczne funkcje języka JAVA. Generację grafu można przedstawić następująco (w postaci pseudokodu):

aktualna liczba wierzchołków = 0;
WHILE (liczba wierzchołków > aktualna liczba wierzchołków) DO
{
Współrzędna X = RANDOM(0.0,1.0);
Współrzędna Y = RANDOM(0.0,1.0);
aktualna liczba wierzchołków++;
}
FOR (i=0; i<liczba wierzchołków; i++)
{
FOR (k=0; k<liczba wierzchołków; k++)
{
IF (odległość(wierzchołek_k;wierzchołek_i)) < zasięg
THEN połącz wierzchołki(i;k)
}
}


wyszukiwanie najkrótszej ścieżki w grafie pomiędzy dwoma wierzchołkami

Ten algorytm jest głównym algorytmem programu, biorąc pod uwagę złożoność obliczeniową. Jego celem jest znalezienie najkrótszej ścieżki w grafie pomiędzy każdą parą wierzchołków. Do znalezienia tych odległości posłużono się algorytmem Dijkstry. Wyniki działania tego algorytmu(tzn. odległość pomiędzy zadanymi wierzchołkami) jest zapisywana do tablicy (rozmiar n x n, gdzie n to liczba wierzchołków), a jego działanie powtarza się dla kolejnej pary wierzchołków.
Po zakończeniu tej procedury otrzymujemy tablicę wypełnioną najmniejszymi odległościami pomiędzy wszystkimi wierzchołkami. Tablica ta jest symetryczna względem swojej przekątnej, ponieważ generowane grafy są grafami prostymi.

W algorytmie Dijkstry pamiętany jest zbiór Q wierzchołków, dla których nie obliczono jeszcze najkrótszych ścieżek, oraz wektor D[i] odległości od wierzchołka s do i. Początkowo zbiór Q zawiera wszystkie wierzchołki a wektor D jest pierwszym wierszem macierzy wag krawędzi A.
Algorytm przebiega następująco:

1. Dopóki zbiór Q nie jest pusty wykonuj:
2. Pobierz ze zbioru Q wierzchołek v o najmniejszej wartości D[v] i usuń go ze zbioru.
3. Dla każdego następnika i wierzchołka v sprawdź, czy D[i]>D[v]+A[v,i], tzn. czy aktualne oszacowanie odległości do wierzchołka i jest większe od oszacowania odległości do wierzchołka v plus waga krawędzi (v,i)
4. Jeżeli tak jest, to zaktualizuj oszacowanie D[i] przypisując mu prawą stronę nierówności (czyli mniejszą wartość).

znajdowanie średnicy grafu
Po obliczeniu wszystkich najmniejszych odległości pomiędzy wierzchołkami, z tabeli je przechowującej wybieramy największą wartość. Wartość ta będzie równa długości średnicy grafu.

znajdowanie promienia i centrów grafu
Z tej samej tabeli przechowującej odległości pomiędzy wierzchołkami szukamy największej odległości dla każdego z wierzchołków. Wartość tą otrzymujemy znajdując maksymalną wielkość w każdym wierszu lub kolumnie tabeli. W ten sposób dostajemy listę najdłuższych możliwych do przejścia ścieżek z danego wierzchołka. Z odległości tych wybieramy najmniejszą. Wartość ta będzie równa długości promienia grafu(dla naszego przykładowego grafu promień ma długość 2). Dodatkowo należy zapamiętać wierzchołek(-ki), dla którego wartość tą otrzymaliśmy. Wierzchołek(-ki) ten należy zaznaczyć jako centrum grafu.

Struktury danych :

Do najważniejszych struktur danych użytych w projekcie należą:

  • FTVertex
    Dynamiczna struktura danych przechowująca parę liczb reprezentujących współrzędne wierzchołków oraz wskaźniki do krawędzi wychodzących z danego wierzchołka.
  • FTEdge
    Dynamiczna struktura danych przechowująca wskaźniki do dwóch wierzchołków, które łączy oraz długość euklidesową krawędzi.
  • FTGraphTable
    Graf jest reprezentowany między innymi przez tabelę sąsiedztwa. Dzięki temu bardzo szybko można stwierdzić czy dane dwa wierzchołki są połączone.
  • FTGraph
    Główna struktura danych reprezentująca graf. Zawiera wskaźniki na strukturę przechowującą wierzchołki, krawędzie oraz tablicę sąsiedztwa(FTGrapgTable) grafu. .


Ograniczenia programu:

W czasie testowania programu stwierdzono istnienie pewnych ograniczeń. Przy każdej generacji grafu dla każdej pary wierzchołków obliczana jest najmniejsza odległość między nimi. Gdy liczba krawędzi gafu będzie ogromna, obliczenia mogą trwać bardzo długo i zajmować dużo czasu procesora.
W związku z tym programowe zawiera ograniczenia na liczbę wierzchołków i ich zasięg, które wynoszą odpowiednio 100 i 1,4. Należy pamiętać że Symulacje dla dużej ilości wierzchołków(>50), dużego zasięgu(>0.4), a co za tym idzie dużej ilości krawędzi mogą trwać długo nawet na komputerze o szybkim procesorze i dużej ilości pamięci.
Zapotrzebowanie na pamięć operacyjną jest małe i jako ograniczenie można je pominąć.


Wyniki:

Na potrzeby testowania programu oraz wyznaczenia szukanych zależności, stworzono specjalnie przygotowaną funkcję. Procedura ta zapisywała do pliku tekstowego długość promienia grafu oraz jego średnicę dla różnych wartości zasięgu wierzchołka oraz ich liczby. Na wejściu podawano początkową i końcową wartość parametru oraz skok, z jakim miał on się zmieniać. Na wyjściu otrzymywano plik tekstowy, który po zaimportowaniu do arkusza kalkulacyjnego służył do generacji wykresów. Należy zaznaczyć, że w jednym przebiegu funkcji możliwe było zmienianie tylko jednego parametru(zasięgu albo liczby wierzchołków, nigdy dwóch na raz).


Wykresy :

Wykres 1. Zależność długości promienia grafu od wielkości zasięgu wierzchołków, dla różnej liczby wierzchołków.

Wykres 2. Zależność długości średnicy grafu od wielkości zasięgu wierzchołków, dla różnej liczby wierzchołków.

Wykres 3. Zależność długości średnicy i promienia grafu od wielkości zasięgu wierzchołków, dla przykładowego grafu o 25 wierzchołkach.

test przeprowadzono dla różnych wartości liczby wierzchołków(5,15,25,35,45), przy zmieniającej się wartości zasięgu (od 0 do 1.4 ze skokiem 0.02).
Z przebiegu symulacji i otrzymanych w ten sposób wykresów widać, jak dla małych wartości zasięgu(<0.2) nawet przy dużej liczbie wierzchołków nie udało się otrzymać grafu spójnego. Należy pamiętać, że zero oznacza tutaj raczej brak średnicy/promienia, a nie zerową ich długość. Dla zasięgu większego od 0.2 ale mniejszego od 0.6 widać, że grafy spójne zaczęły pojawiać się tym „szybciej” im liczba wierzchołków była większa(np. dla 15 wierzchołków przy wartości 0.4, a dla 45 wierzchołków przy wartości zasięgu równej 0.26). Wynika to z oczywistego faktu, że odległość pomiędzy najbliższymi wierzchołkami w grafie euklidesowym jest tym mniejsza, im liczba tych wierzchołków większa.
Po przekroczeniu wartości zakresu oscylującej wokół 0.6 za każdym razem generowany graf był grafem spójnym. Wielkość promienia i średnicy początkowo była duża(tym większa im liczba wierzchołków większa), by wraz ze wzrostem zasięgu stopniowo maleć. Warto zauważyć, że spadek wielkości tych parametrów następował w sposób jednostajny a długość promienia była ok. dwóch razy mniejsza od długości średnicy. Działo się tak do momentu, gdy wartość średnicy osiągnęła 2, a promienia 1. Sytuacja ta oznacza, że graf nie jest jeszcze pełny, ale liczba jego krawędzi jest na tyle duża, że dowolne dwa wierzchołki dzieli ścieżka o długości co najwyżej 2.
Po przekroczeniu wartości zasięgu równej ok. 1,2-1,3 zaczęto obserwować wystąpienia grafu zupełnego. Na wykresie objawia się to faktem, że zarówno średnica jak i promień przyjmują wartość równą 1(każdy wierzchołek jest centrum).

Wykres 4. Zależność długości promienia grafu od liczby wierzchołków, dla różnych wielkości zasięgu wierzchołków.

Wykres 5. Zależność długości średnicy grafu od liczby jego wierzchołków, dla różnych wielkości zasięgu wierzchołków.

Wykres 6. Zależność długości średnicy i promienia grafu od liczby jego wierzchołków, dla przykładowego grafu o zasięgu wierzchołków równym 0,35.

W tym przypadku symulację przeprowadzano dla zadanej wartości zasięgu (0.35, 0.45, 0.55, 0.65, 0.75), przy zmieniającej się liczbie wierzchołków(od 2 do 50 ze skokiem 1).
Z powyższych wykresów widać kilka bardzo wyraźnych zależności. Po pierwsze im zasięg mniejszy tym obserwowana wielkość średnicy i promienia była większa. Po drugie tym szybciej generowane grafy były spójne, im większy był zasięg. Należy zauważyć, że przy małej liczbie wierzchołków nie udawało się wygenerować grafów spójnych. Jeżeli jednak liczba wierzchołków przekroczyła graniczną wartość, to zarówna promień jak i średnica zaczęły przyjmować wartości w bardzo małym stopniu zależne od tego parametru. Dalsze zwiększanie liczby wierzchołków prawie w ogóle nie wpływało na badane parametry.
Z tych wykresów również wyraźnie widać, że długość promienia jest prawie dwa razy mniejsza od długości średnicy (stanowi 55%-60% długości średnicy).


Podsumowanie:

Program mimo swej prostoty i ograniczeń pozwala na dość wygodne sprawdzanie właściwości grafów euklidesowych. Zaimplementowana funkcja testująca ułatwia generowanie serii symulacji i okazała się bardzo przydatna w projekcie. Sama analiza zależności długości średnicy i promienia od ilości i zasięgu wierzchołków, okazała się ciekawa, a zbudowana aplikacja analizę tą bardzo ułatwiła.


Źródła :

Dokumentacja projektu:

sprawozdanie nr 1 (.doc 28 kB)

sprawozdanie nr 2 (.doc 56 kB)

sprawozdanie nr 3- Końcowe (.doc 168 kB)

wersja offline tej strony(.zip 74kB)

Źródło programu (.zip 14 kB)

wyniki symulacji (.xls 434 kB)