Exemplo n.º 1
0
        public void sciezkaAB(int p, int k, Zapotrzebowanie zzz)
        {
            int        a;
            List <int> pop = new List <int>();

            int x = k;

            if (p != k)
            {
                a = 0;

                int r = 1;

                pop.Insert(0, k);
                while (poprzednicy[x] != 0)

                {
                    pop.Insert(pop.Count, poprzednicy[x]);
                    x = poprzednicy[x];
                    r++;
                }
                int y    = 0;
                int razy = 1;

                /*
                 * Console.WriteLine("START");
                 * for (int i = 0; i < pop.Count; i++)
                 * {
                 *
                 *      Console.WriteLine(pop[i]);
                 *
                 * }
                 * Console.WriteLine("EnD");
                 * /*
                 * 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;
                 *   }
                 * }
                 */

                x++;
                //  Console.WriteLine("popcount"+x+" !!!!");

                for (int i = 0; i < pop.Count - 1; i++)
                {
                    razy = 0;
                    y    = siec.tablica_laczy[pop[i + 1], pop[i]];
                    razy = siec.tablica_uzyc[pop[i + 1], pop[i]];
                    //  Console.WriteLine(siec.lacza[y].id+"  LLL");
                    siec.lacza[y].iloscmodulow += razy;
                    //  Console.WriteLine(siec.lacza[y].iloscmodulow);
                    zzz.krawedzie.Insert(z.krawedzie.Count, (y + 1));

                    siec.lacza[y].wolna_pojemnosc += ((razy * siec.lacza[y].pojemnosc) - z.rozmiar);



                    /*
                     * for (int j=0; j<siec.wezly[pop[i+1]].drogi.Length-1;j++)
                     *
                     * {
                     *  if (siec.lacza[y].WezelKoniec == siec.wezly[pop[i+1]].drogi[j].dane)
                     *  {
                     *     // Console.WriteLine("aaaaaaaaaaaa");
                     *      if (siec.tablica_drog[pop[i+1],j] != siec.wezly[pop[i+1]].drogi[j].klucz)
                     *      {
                     *         // Console.Write(siec.tablica_drog[pop[i+1], j] + "  xxxxx   " + siec.wezly[pop[i+1]].drogi[j].klucz);
                     *         // Console.WriteLine("");
                     *
                     *          r = (int)(siec.wezly[pop[i+1]].drogi[j].klucz / siec.tablica_drog[pop[i+1], j]);
                     *
                     *      }
                     *  }
                     *
                     *
                     * }
                     */
                }

                //  Console.WriteLine("Zapotrzebowania " + zzz.krawedzie.Count);

                //  Console.Write("Sciezka (od koncowego do pierwsze)"+sciezka + "\n");

                // Console.Write("Sciezka: ");
                for (int i = 0; i < pop.Count; i++)
                {
                    //  Console.Write(pop[i] + "  ");
                }
                // Console.WriteLine("");

                for (int i = 0; i < siec.liczba_laczy; i++)
                {
                    //   Console.Write(i+1+"  ilosc:   "+siec.lacza[i].iloscmodulow + "\n");
                }

                for (int i = 0; i < siec.liczba_laczy; i++)
                {
                    //    Console.WriteLine(siec.lacza[i].wolna_pojemnosc);
                    //  Console.WriteLine(siec.lacza[i].pojemnosc);
                }


                // Console.Write("Dlugosc sciezki od" + p + " do " + k + "wynosi: " + drogi[k] + "\n");

                koszt = drogi[k];
                //  Console.WriteLine(drogi[k]);
            }
            else
            {
                a = 0;
                pop.Insert(pop.Count, p);
                koszt = 0;
                //  Console.Write(pop[i] + "  ")
                // Console.Write("Dlugosc sciezki od" + p + " do " + k + "wynosi: " + drogi[k] + "\n");
            }
        }
Exemplo n.º 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");
            }
        }
        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);
        }