public Siec(int _liczba_laczy, int _liczba_wezlow) { liczba_laczy = _liczba_laczy; liczba_wezlow = _liczba_wezlow; zbior_wezlow = new Wezel[_liczba_wezlow]; zbior_laczy = new Lacze[_liczba_laczy]; }
public zapotrzebowanie(int _id, Wezel _zrodlo, Wezel _ujscie, double _rozmiar) { id = _id; zrodlo = _zrodlo; ujscie = _ujscie; rozmiar = _rozmiar; zrealizowano = 0; }
public Lacze(int _id, Wezel _wezel_pocz, Wezel _wezel_konc, double _przepustowosc, double _koszt) { id = _id; wezel_pocz = _wezel_pocz; wezel_konc = _wezel_konc; przepustowosc = _przepustowosc; koszt = _koszt; przeplyw = 0; przepustowosc_resztkowa = 0; }
public List <int> najkrotsza(int vo, Siec _siec, int vt) { // Jest to wersja algorytmu poprawiania etykiet, szukajacych najkrotszej(wzgledem specjalnej wagi) sciezki double[] L = new double[_siec.liczba_wezlow]; int[] P = new int[_siec.liczba_wezlow]; //tablica poprzednikow wierzcholka na najkrotszej sciezce for (int j = 0; j < _siec.liczba_wezlow; j++) { if (_siec.zbior_wezlow[j].id == vo) { L[j] = 0; } else { L[j] = 100000.0; } } Queue <Wezel> fifo = new Queue <Wezel>(); fifo.Enqueue(_siec.zbior_wezlow[vo - 1]); while (fifo.Count != 0) { Wezel v = fifo.Dequeue(); int i = 0; for (; i < _siec.liczba_laczy; i++) { if ((_siec.zbior_laczy[i].wezel_pocz.id == v.id) && (_siec.zbior_laczy[i].przepustowosc_resztkowa != 0)) { if (L[_siec.zbior_laczy[i].wezel_konc.id - 1] > L[v.id - 1] + (1 + (_siec.zbior_laczy[i].przeplyw / (_siec.zbior_laczy[i].przepustowosc_resztkowa)) * Math.Pow((_siec.zbior_laczy[i].koszt), 2))) { L[_siec.zbior_laczy[i].wezel_konc.id - 1] = L[v.id - 1] + (1 + (_siec.zbior_laczy[i].przeplyw / (_siec.zbior_laczy[i].przepustowosc_resztkowa)) * Math.Pow((_siec.zbior_laczy[i].koszt), 2)); P[_siec.zbior_laczy[i].wezel_konc.id - 1] = v.id; fifo.Enqueue(_siec.zbior_laczy[i].wezel_konc); } } } } // Powyzej uzylismy specjalnej wagi (1 + (_siec.zbior_laczy[i].przeplyw / (_siec.zbior_laczy[i].przepustowosc_resztkowa)) * Math.Pow((_siec.zbior_laczy[i].koszt),2) // napoczatku przeplywy rownaja sie zero i kazde lacze ma wage 1 wiec algorytm wyszuka najkrotsza pod wzgledem ilosci laczy sciezke // potem bedzie znajdywal inne sciezki gdyz drugi czlon tej wagi bedzie sie zwiekszal, co chroni przed zapychaniem lacz // oraz minimalizuje koszt. // korzystajac z tablicy poprzednikow tworzymy sciezke int z = vt; List <int> sciezka = new List <int>(); while (z != 0) { sciezka.Insert(0, z); z = P[z - 1]; } int a = 0; Sciezka _sciezka = new Sciezka(); _sciezka.id_lacz = new List <int>(); for (; a < sciezka.Count - 1; a++) { int j = 0; for (; j < _siec.liczba_laczy; j++) { if ((_siec.zbior_laczy[j].wezel_pocz.id == sciezka[a]) && (_siec.zbior_laczy[j].wezel_konc.id == sciezka[a + 1])) { _sciezka.id_lacz.Add(_siec.zbior_laczy[j].id); } } } // zwraca najkrotsza sciezke return(_sciezka.id_lacz); }