Beispiel #1
0
        public Dijkstra(Siec s)
        {
            zap  = 0;
            siec = s;
            // x = 0;
            wybrane       = 0;
            wykorzystania = new double[siec.liczba_wezlow + 1, siec.liczba_wezlow + 1];
            poprzednicy   = new int[siec.zwrocLiczbewezlow() + 1];
            drogi         = new double[siec.zwrocLiczbewezlow() + 1];
            // drogi1 = new Lista<double, int>();
            for (int i = 1; i <= siec.liczba_wezlow; i++)
            {
                for (int j = 1; j <= siec.liczba_wezlow; j++)
                {
                    siec.lacza[siec.tablica_laczy[i, j]].wolna_pojemnosc = 0;
                    siec.lacza[siec.tablica_laczy[i, j]].iloscmodulow    = 0;
                }
            }

            for (int i = 0; i <= siec.liczba_wezlow; i++)
            {
                for (int j = 0; j <= siec.liczba_wezlow; j++)
                {
                    siec.tablica_uzyc[i, j] = 0;
                    //wykorzystania[i, j] = 0;
                }
            }
        }
Beispiel #2
0
        public void sciezkaOthers(int p, Zapotrzebowanie zzz)
        {
            zap = 1;
            z   = zzz;
            for (int i = 1; i <= siec.liczba_wezlow; i++)
            {
                for (int j = 0; j < siec.wezly[i].drogi.Length - 1; j++)
                {
                    siec.wezly[i].drogi[j].klucz         = siec.tablica_drog[i, j];
                    siec.wezly[i].drogi[j].przepustowsci = siec.lacza[siec.tablica_laczy[i, siec.wezly[i].drogi[j].dane]].wolna_pojemnosc;
                }
            }



            for (int i = 0; i <= siec.liczba_wezlow; i++)
            {
                for (int j = 0; j <= siec.liczba_wezlow; j++)
                {
                    siec.tablica_uzyc[i, j] = 0;
                    //wykorzystania[i, j] = 0;
                }
            }


            /*
             * for (int i = 0; i < siec.liczba_wezlow; i++)
             * {
             *  for (int j = 0; j < siec.liczba_wezlow; j++)
             *  {
             *      Console.WriteLine(siec.tablica_uzyc[i, j]);
             *      //wykorzystania[i, j] = 0;
             *  }
             * }
             */
            for (int i = 1; i <= siec.liczba_wezlow; i++)
            {
                for (int j = 0; j < siec.wezly[i].drogi.Length - 1; j++)
                {
                    while (siec.wezly[i].drogi[j].przepustowsci < zzz.rozmiar)
                    {
                        siec.wezly[i].drogi[j].klucz += siec.lacza[siec.tablica_laczy[i, siec.wezly[i].drogi[j].dane]].koszt;
                        siec.tablica_uzyc[i, siec.wezly[i].drogi[j].dane] += 1;

                        siec.wezly[i].drogi[j].przepustowsci = siec.wezly[i].drogi[j].przepustowsci + siec.lacza[siec.tablica_laczy[i, siec.wezly[i].drogi[j].dane]].pojemnosc;
                        // Console.WriteLine("aaaaaaaaaaaa");
                    }
                }
            }



            drogi1 = new MinHeap <double, int, double>(siec.liczba_wezlow);

            // poprzednicy = new int[siec.zwrocLiczbewezlow() + 1];

            for (int i = 1; i <= siec.zwrocLiczbewezlow(); i++) // 0 jest puste
            {
                if (i != p)
                {
                    siec.ustawWybor(i, 0);
                    poprzednicy[i] = 0;
                    drogi[i]       = nieskonczonosc;
                    drogi1.Insert(nieskonczonosc, i, 0);
                }
                else
                {
                    drogi1.Insert(0, i, 0);
                    siec.ustawWybor(i, 0);
                }
            }


            poprzednicy[p] = 0;
            drogi[p]       = 0;

            wybrane = 0;

            int    v   = p;
            double m   = nieskonczonosc;
            Random rnd = new Random(DateTime.Now.Millisecond);;

            double prz;

            while (wybrane != siec.liczba_wezlow)

            {
                Element <double, int, double> n = new Element <double, int, double>();
                wybrane++;

                while (siec.wezly[v].wybrany != false && drogi1.Count != 0)
                {
                    n = drogi1.ExtractMin();
                    v = n.dane;
                }

                // v = drogi1.ExtractMin().dane;



                siec.ustawWybor(v, 1);



                for (int i = 0; i < siec.wezly[v].drogi.Length - 1; i++)
                {
                    prz = rnd.NextDouble();
                    if (drogi[siec.wezly[v].drogi[i].dane] > siec.wezly[v].drogi[i].klucz + drogi[v])
                    {
                        if (prz >= 0.5)
                        {
                            if (drogi[siec.wezly[v].drogi[i].dane] > siec.wezly[v].drogi[i].klucz + drogi[v])
                            {
                                drogi[siec.wezly[v].drogi[i].dane] = siec.wezly[v].drogi[i].klucz + drogi[v];
                                //siec.ustawWybor(n.dane, 1);
                                poprzednicy[siec.wezly[v].drogi[i].dane] = v;
                                if (siec.wezly[siec.wezly[v].drogi[i].dane].wybrany != true)
                                {
                                    drogi1.Insert(siec.wezly[v].drogi[i].klucz + drogi[v], siec.wezly[v].drogi[i].dane, 0);
                                }
                            }
                        }
                    }
                }
            }



            for (int i = 1; i <= siec.zwrocLiczbewezlow(); i++)
            {
                //   Console.Write("d" + i + "   " + drogi[i]+ "  " + "p" + "   " + poprzednicy[i] + "\n");
            }
        }