Symulacja sieci, rysowanie grafów

0

Witam, mam do napisania program o takiej treści:

Oprogramować klasę Sieć składającą się z następujących składowych: ilość węzłów w sieci,
ilość łuków, tablice zawierające informacje na temat przepustowości, bieżącego przepływu,
metryki danego łuku ( 3 tablice o rozmiarze równym ilości łuków) oraz dwuwymiarowej tablicy
z informacją które węzły łączy dany łuk. Napisz polecenia wczytujące sieć z pliku tekstowego
oraz ustawiające wartość przepustowości w każdym łuku na 10 jednostek, wartość przepływu
na 0 oraz oblicz początkową wartość metryki ( odpowiedni konstruktor). Następnie kolejno dla
każdej pary węzłów wyznacz najkrótsze połączenie używając informacji o bieżącej metryce
łuków w sieci ( np. Algorytm Dijkstra dla metryk) . Po każdym wyznaczeniu trasy między dan ą
parą węzłów przyjmij, iż pomiędzy tą parą realizowane jest połączenie z żądaniem przesłania
danych o wartości 2 jednostek ( do bieżącego przepływu w sieci dodaj wartość 2 w łukach,
które są w trasie połączenia między węzłami) . Jeżeli po danej operacji prz epływ w danym łuku
jest większy niż przepustowość dodaj do wartości przepustowości 10 ( czyli wartość
przepustowości w danym łuku musi być wielokrotnością 10 -ciu) . Jako metryki dla danego łuku
a użyj następującej zależności: Ma =(ca-fa)+fa/(ca-fa) gdzie fa jest bieżącą wartością przepływu
w danym łuku a ca jego przepustowością. Zadanie zrealizuj dla sieci posiadającej od 10 do 15
węzłów. Narysuj sieć z połączeniami oraz zaznacz przy łukach wartości ich metryk.

Ten program ma mieć wszystkie cechy programu obiektowego, czyli również dziedziczenie i tutaj pojawia się pierwszy problem - nie mam pomysłu jakie klasy oprócz tej głównej - " Sieć " mógłbym dopisać, poza tym nie wiem co mam rozumieć przez "znalezienie najkrótszej trasy dla 2 węzłów" chodzi o to. że używając tej tablicy 2-wymiarowej, mam dla każdego łuku znaleźć najkrótszą drogę między węzłami które on łączy, czy problem jest bardziej skomplikowany ?

1

Masz jakąś sieć, np. ISDN (nieistotne). Pomiędzy nadawcą i odbiorcą informacji znajduje się infrastruktura, która przesyła np. dane. Kabel nie jest położony prosto, z A do B. Są połączenia wykorzystujące węzły (w takim węźle może łączyć się kilka linii). Przykład poniżej.

user image

Przykładowo informacja ma zostać przesłana z Katowic do Poznania. Bez nadmiernego "udziwniania" weźmy pod uwagę 3 drogi:

Katowice - Opole - Wrocław - Zielona Góra - Poznań
Katowice - Częstochowa - Łódź - Poznań
Katowice - Częstochowa - Łódź - Warszawa - Poznań

Która droga będzie najlepsza ?

Pierwsze dwie są podobnej długości, trzecia wydaje się najdłuższa, co nie oznacza, że nie może być najlepsza. Trzeba uwzględniać aktualną rzeczywistą prędkość na poszczególnych odcinkach. Wtedy sumujemy ją, jeśli pierwsza okaże się najlepsza, to sygnał pójdzie tamtędy. Prędkości mogą się jednak zmieniać wraz z upływem czasu. Weźmy np. drugą i trzecią drogę. Powiedzmy, że na początku któraś z nich okaże się najszybsza. Np. druga. Sygnał dochodzi do Łodzi i nagle okazuje się, że odcinek jest bardzo obciążony. Jest jednak alternatywa, dłuższa trasa dla sygnału, przez Warszawę, węzeł ma jednak "zapisane" w tablicy, że prędkość tam będzie większa i sygnał idzie tamtędy. Trzeba jeszcze wziąć pod uwagę, że na jednym z odcinków może w pewnym momencie dojść do awarii, etc. Tego chyba nie musisz uwzględniać w programie.

Nie wiem czy to coś pomoże :)

0

Z treści wynika, że masz znaleźc najkrótszą drogę wg wag jakie amja łuki, czyli po prostu rozwiązać problem uzywajac dijkstry

0

ok, a co z klasami ? Myślałem o dołączeniu klasy "Węzeł" która zawierałaby IP danego węzła, maskę i bramkę sieci, jaką klasę mogę jeszcze dodać, żeby dziedziczenie było bardziej rozbudowane ? Cichociemny, ten przykład trochę wyjaśnił mi sytuację :)

1

To się cieszę :) Ten program to na studia ? Jeśli tak to się nie dziwię tym pomysłom, tzn. pewnie wykładowca wymaga używania OOP na siłę (na mojej uczelni gość też wymyśla cuda). Z klasami nie bardzo mam pomysł, ale jeśli miałaby być klasa Węzeł, z której klasy ma dziedziczyć ? Sieć ? To nie bardzo "gra", bo Węzeł nie jest szczególnym przypadkiem Sieci (tak mnie się wydaje, niedawno mi coś podobnego na forum wytłumaczono :)).

Na siłę może być coś w rodzaju ElementSieci i to jest klasa bazowa dla Węzła.

0

Tak, na studia. Wymagają żeby te programy były jak najbardziej obiektowe chociaż przez to są zupełnie "nie naturalne" :) Spoko, pomyśle nad taką klasą jaką zaproponowałeś, a co do klasy "Węzeł" - sugerowałem się innym programem który miałem napisać, chodziło o to żeby stworzyć klasę "Macierz" która dziedziczy z klasy "Wektor", to też było dziwne zastosowanie dziedziczenia.

0

Mam jeszcze jedno pytanie odnośnie tego zadania, korzystam z implementacji algorytmu Dijkstry (wersja z kolejką priotetytową) z tej strony: http://edu.i-lo.tarnow.pl/inf/utils/002_roz/ol012.php , moje zadanie wymaga aby po każdym wyznaczeniu najkrótszej ścieżki zwiększać przepływ, czyli inaczej wagę danego łuku (krawędzi w grafie) o 2, problem w tym że nie mam pomysłu jak to zrobić, wartość metryki obliczam ze wzoru podanego w zadaniu w innej klasie, wiem że po każdym wyznaczeniu drogi trzeba dodać wartość 2 do tablicy z wartościami aktualnego przepływu w klasie gdzie obliczam metrykę tylko nie wiem w którym momencie algorytm Dijkstry wyznacza najkrótszą krawędź...

1 użytkowników online, w tym zalogowanych: 0, gości: 1