예제 #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;
                }
            }
        }
        public Tester()
        {
            rnd = new Random();
            #region Odczyt z pliku
            Console.WriteLine("Przeciagnij tu plik wejsciowy i wcisnij ENTER...");
            sciezka_wejscia = Console.ReadLine();
            if (sciezka_wejscia[0] == '\"')
            {
                sciezka_wejscia = sciezka_wejscia.Substring(1, sciezka_wejscia.Length - 2);
            }
            Console.WriteLine(" ");
            odczyt = new StreamReader(sciezka_wejscia);
            String linia = "";
            while (linia.Length < 2 || linia[0] == '#')
            {
                linia = odczyt.ReadLine();
            }
            wyrazy = linia.Split(' ');
            if (wyrazy[0] == "WEZLY")
            {
                liczbawezlow = int.Parse(wyrazy[2]);
            }
            wezly    = new Wezel[liczbawezlow + 1];
            wezly[0] = null;
            for (int i = 1; i <= liczbawezlow; i++)//WEZEL ZEROWY JEST PUSTY
            {
                wezly[i] = new Wezel(i, liczbawezlow);
            }

            linia = odczyt.ReadLine();
            while (linia.Length < 2 || linia[0] == '#')
            {
                linia = odczyt.ReadLine();
            }
            wyrazy           = linia.Split(' ');
            tablica_polaczen = new double[liczbawezlow + 1, liczbawezlow + 1];

            for (int i = 0; i <= liczbawezlow; i++)
            {
                for (int j = 0; j <= liczbawezlow; j++)
                {
                    tablica_polaczen[i, j] = nieskonczonosc;
                }
            }
            if (wyrazy[0] == "LACZA")
            {
                liczbalaczy = int.Parse(wyrazy[2]);
            }
            lacza    = new Lacze[liczbalaczy + 1]; //Lacze zerowe jest puste
            lacza[0] = null;
            linia    = odczyt.ReadLine();          //odczytanie jednej lini z #

            for (int i = 0; i < liczbalaczy; i++)
            {
                linia     = odczyt.ReadLine();
                wyrazy    = linia.Split(' ');
                wyrazy2   = wyrazy[3].Split('.');
                wyrazy[3] = (wyrazy2[0] + "," + wyrazy2[1]);
                wyrazy2   = wyrazy[4].Split('.');
                wyrazy[4] = (wyrazy2[0] + "," + wyrazy2[1]);
                lacza[i]  = new Lacze(int.Parse(wyrazy[0]), int.Parse(wyrazy[1]), int.Parse(wyrazy[2]), double.Parse(wyrazy[3]), double.Parse(wyrazy[4]));

                tablica_polaczen[lacza[i].WezelPoczatek, lacza[i].WezelKoniec] = lacza[i].koszt;
            }

            linia = odczyt.ReadLine();
            while (linia.Length < 2 || linia[0] == '#')
            {
                linia = odczyt.ReadLine();
            }
            wyrazy = linia.Split(' ');
            if (wyrazy[0] == "ZAPOTRZEBOWANIA")
            {
                liczbazapotrzebowan = int.Parse(wyrazy[2]);
            }
            linia           = odczyt.ReadLine();
            zapotrzebowania = new Zapotrzebowanie[liczbazapotrzebowan + 1];
            for (int i = 1; i <= liczbazapotrzebowan; i++)
            {
                linia   = odczyt.ReadLine();
                wyrazy  = linia.Split(' ');
                wyrazy2 = wyrazy[3].Split('.');

                wyrazy[3]          = (wyrazy2[0] + "," + wyrazy2[1]);
                zapotrzebowania[i] = new Zapotrzebowanie(int.Parse(wyrazy[0]), int.Parse(wyrazy[1]), int.Parse(wyrazy[2]), double.Parse(wyrazy[3]));
            }
            odczyt.Close();
            #endregion
            #region Debug - odczyt z pliku
            Console.WriteLine(" ");
            Console.WriteLine("Debug: ");
            Console.WriteLine("Liczba Wezlow: " + liczbawezlow);
            Console.WriteLine("Liczba Laczy: " + liczbalaczy);
            Console.WriteLine("Liczba Zapotrzebowan: " + liczbazapotrzebowan);
            Console.WriteLine("Lacza:");
            for (int i = 0; i < liczbalaczy; i++)
            {
                Console.WriteLine("id: " + lacza[i].id + ", Wezel poczatkowy: " + lacza[i].WezelPoczatek + ", Wezel koncowy: " + lacza[i].WezelKoniec + ", Przeplywnosc: " + lacza[i].pojemnosc + ", Koszt Modulu: " + lacza[i].koszt);
            }
            Console.WriteLine("Zapotrzebowania:");
            for (int i = 1; i <= liczbazapotrzebowan; i++)
            {
                Console.WriteLine("id: " + zapotrzebowania[i].id + ", Wezel poczatkowy: " + zapotrzebowania[i].WezelPoczatek + ", Wezel koncowy: " + zapotrzebowania[i].WezelKoniec + ", Rozmiar: " + zapotrzebowania[i].rozmiar);
            }
            #endregion

            //UZUPELNIENIE INFORMACJI O WEZLACH

            siec = new Siec(lacza, liczbawezlow, liczbalaczy, wezly);

            //zapotrzebowania[nr_zapotrzebowania].tablica_uzytych_laczy = (int[])wybrane_lacza.Clone();
            wybrane_lacza = new int[liczbalaczy + 1];



            Console.WriteLine("xx");



            double[,] zamontowane = new double[liczbazapotrzebowan + 1, liczbalaczy];
            double[,] poprzednie  = new double[liczbazapotrzebowan + 1, liczbalaczy];

            for (int i = 0; i <= liczbazapotrzebowan; i++)
            {
                for (int j = 0; j < liczbalaczy; j++)
                {
                    poprzednie[i, j] = 0;
                }
            }

            /*
             * dijkstra = new Dijkstra(siec);
             * int a=1;
             * bool[] tab = new bool[liczbazapotrzebowan+1];
             * for (int j=1;j<=liczbazapotrzebowan;j++)
             * {
             *
             *  tab[j] = false;
             * }
             *
             *
             *
             * // Console.WriteLine(liczbazapotrzebowan + "zapot");
             * int x = rnd.Next(1, liczbazapotrzebowan+1);
             * while(a<=liczbazapotrzebowan)
             * {
             * //  Console.WriteLine("NR A: " + a);
             * x = rnd.Next(1, liczbazapotrzebowan+1);
             *  while (tab[x]!=false)
             *  {
             *   //   Console.WriteLine("weszlo+"+x);
             *      x = rnd.Next(1, liczbazapotrzebowan+1);
             *  }
             *
             *  dijkstra.sciezkaOthers(zapotrzebowania[x].WezelPoczatek, zapotrzebowania[x]);
             *  dijkstra.sciezkaAB(zapotrzebowania[x].WezelPoczatek, zapotrzebowania[x].WezelKoniec);
             *  koszt += dijkstra.koszt;
             *  tab[x] = true;
             *  a++;
             *  /*
             *  for (int j = 0; j < liczbalaczy; j++)
             *
             *  {
             *      zamontowane[i, j] = dijkstra.siec.lacza[j].iloscmodulow - poprzednie[i - 1, j];
             *      poprzednie[i, j] = dijkstra.siec.lacza[j].iloscmodulow;
             *
             *  }
             *
             * } */


            // Console.WriteLine("koszt:  " + koszt);

            /*
             * for (int i = 1; i <= liczbazapotrzebowan; i++)
             * {
             *  for (int j = 0; j < liczbalaczy; j++)
             *  { Console.Write(zamontowane[i, j] + "  "); }
             *  Console.WriteLine("");
             *
             * }
             *
             */


            int        iter         = 0;
            Lacze[]    rozwiazanie  = new Lacze[zapotrzebowania.Length];
            Lacze[]    koncowe_rozw = new Lacze[zapotrzebowania.Length];
            Wyzarzanie los          = new Wyzarzanie(10000, 0.1, 0.9999);
            najlepsze = Double.PositiveInfinity;
            double akt_roz = Double.PositiveInfinity;
            double xx;


            tablica_uzytych = new double[liczbalaczy];
            double[] tablica_uzytych_akt = new double[liczbalaczy];

            for (int i = 0; i < liczbalaczy; i++)
            {
                tablica_uzytych[i]     = 0;
                tablica_uzytych_akt[i] = 0;
            }



            double roznica = 0;
            Console.WriteLine("xx");
            aaa    = new List <int> [liczbazapotrzebowan + 1];
            naj    = new List <int> [liczbazapotrzebowan + 1];
            aaa[0] = null;
            naj[0] = null;
            // double akt_koszt = Double.PositiveInfinity;
            int a;
            while (los.temp_konc < los.temp)
            {
                iter++;
                koszt = 0;
                //   Console.WriteLine("no siema");

                for (int i = 1; i <= liczbazapotrzebowan; i++)
                {
                    if (zapotrzebowania[i].krawedzie.Count != 0)
                    {
                        zapotrzebowania[i].krawedzie.Clear();
                    }
                }

                aaa = new List <int> [liczbazapotrzebowan + 1];

                //  siec = new Siec(lacza, liczbawezlow, liczbalaczy, wezly);

                for (int i = 0; i <= liczbazapotrzebowan; i++)
                {
                    for (int j = 0; j < liczbalaczy; j++)
                    {
                        poprzednie[i, j] = 0;
                    }
                }


                dijkstra = new Dijkstra(siec);
                a        = 1;
                bool[] tab = new bool[liczbazapotrzebowan + 1];
                for (int j = 1; j <= liczbazapotrzebowan; j++)
                {
                    tab[j] = false;
                }



                // Console.WriteLine(liczbazapotrzebowan + "zapot");
                int x = rnd.Next(1, liczbazapotrzebowan + 1);
                while (a <= liczbazapotrzebowan)
                {
                    //  Console.WriteLine("NR A: " + a);
                    x = rnd.Next(1, liczbazapotrzebowan + 1);
                    while (tab[x] != false)
                    {
                        //   Console.WriteLine("weszlo+"+x);
                        x = rnd.Next(1, liczbazapotrzebowan + 1);
                    }

                    dijkstra.sciezkaOthers(zapotrzebowania[x].WezelPoczatek, zapotrzebowania[x]);
                    dijkstra.sciezkaAB(zapotrzebowania[x].WezelPoczatek, zapotrzebowania[x].WezelKoniec, zapotrzebowania[x]);
                    koszt += dijkstra.koszt;

                    aaa[x] = zapotrzebowania[x].krawedzie;


                    tab[x] = true;
                    a++;
                }

                /*
                 * for (int i = 0; i < liczbalaczy; i++)
                 * {
                 *  Console.WriteLine(siec.lacza[i].iloscmodulow);
                 *
                 *
                 * }
                 */


                roznica = koszt - akt_roz;

                if (roznica < 0)
                {
                    akt_roz = koszt;
                    for (int i = 0; i < liczbalaczy; i++)
                    {
                        // tablica_uzytych_akt[i] = lacza[i].iloscmodulow;
                    }
                }

                else
                {
                    xx = rnd.NextDouble();
                    if (xx < Math.Exp(-roznica / los.temp))
                    {
                        akt_roz = koszt;

                        for (int i = 0; i < liczbalaczy; i++)
                        {
                            // tablica_uzytych_akt[i] = lacza[i].iloscmodulow;
                        }
                    }
                }

                /*
                 * for (int i = 1; i <= liczbazapotrzebowan; i++)
                 * {
                 *
                 *  for (int j = 0; j < aaa[i].Count; j++)
                 *  { Console.WriteLine("   " + aaa[i][j]); }
                 *
                 *
                 *
                 * }
                 *
                 */

                if (najlepsze > akt_roz)
                {
                    najlepsze = akt_roz;
                    naj       = aaa;


                    for (int i = 1; i <= liczbazapotrzebowan; i++)
                    {
                        naj[i] = zapotrzebowania[i].krawedzie;
                    }

                    for (int i = 0; i < liczbalaczy; i++)
                    {
                        tablica_uzytych[i] = lacza[i].iloscmodulow;
                    }
                }

                /*
                 * for (int j = 0; j < liczbalaczy; j++)
                 *
                 * {
                 *  zamontowane[i, j] = dijkstra.siec.lacza[j].iloscmodulow - poprzednie[i - 1, j];
                 *  poprzednie[i, j] = dijkstra.siec.lacza[j].iloscmodulow;
                 *
                 * }
                 */
                /*
                 * for (int i = 0; i < liczbalaczy; i++)
                 * {
                 *  Console.WriteLine(tablica_uzytych_akt[i]);
                 *
                 *
                 * }
                 */
                los.temp = los.temp * los.lambda;



                // Console.WriteLine("koszt:  " + akt_roz);


                // Console.WriteLine("koszt:  " + akt_roz);
            }

            Console.WriteLine("najlepsze:  " + najlepsze);



            for (int i = 1; i <= liczbazapotrzebowan; i++)
            {
                Console.Write(i);
                for (int j = 0; j < naj[i].Count; j++)
                {
                    Console.Write("   " + naj[i][j]);
                }

                Console.WriteLine("");
                Console.WriteLine(naj[i].Count);
                Console.WriteLine("");
            }
            Zapis();
            Console.WriteLine("Liczba iteracji: " + iter);
        }