Пример #1
0
 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];
 }
Пример #2
0
 public zapotrzebowanie(int _id, Wezel _zrodlo, Wezel _ujscie, double _rozmiar)
 {
     id           = _id;
     zrodlo       = _zrodlo;
     ujscie       = _ujscie;
     rozmiar      = _rozmiar;
     zrealizowano = 0;
 }
Пример #3
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;
 }
Пример #4
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);
        }