public void Run()
        {
            int COUNTER_INIT_VALUE = 1500;

            InitPopulacja();
            Populacja = Populacja.OrderByDescending(x => x.Koszt).ToList();

            int    counter   = COUNTER_INIT_VALUE;
            Siec   najlepsza = Populacja[0];
            double maxValue  = Populacja[0].Koszt;

            while (counter > 0)
            {
                if (maxValue < Populacja[0].Koszt)
                {
                    counter   = COUNTER_INIT_VALUE;
                    maxValue  = Populacja[0].Koszt;
                    najlepsza = Populacja[0];
                }
                else
                {
                    counter--;
                }

                Sequence();
                Populacja = Populacja.OrderByDescending(x => x.Koszt).ToList();
            }

            Console.WriteLine("Najlepsza siec: \n" + najlepsza + ", koszt = " + najlepsza.Koszt);
        }
        private List <Siec> Krzyzowanie(List <Siec> populacja)
        {
            List <Siec> nowaPopulacja = new List <Siec>();
            int         i             = 0;

            foreach (Siec s in populacja)
            {
                List <Siec> pula = populacja.Where(x => x.Id != s.Id).ToList();
                if (pula.Count() == 0)
                {
                    return(null);
                }

                int  ran  = Random.Next(pula.Count() - 1);
                Siec newS = pula[ran] + s;
                newS.Id = i++;
                nowaPopulacja.Add(newS);
            }

            return(nowaPopulacja);
        }
示例#3
0
        // Operator krzyżowania
        public static Siec operator +(Siec s1, Siec s2)
        {
            if (s1.LiczbaLinii == s2.LiczbaLinii)
            {
                int przeciecie = s1.LosujPrzeciecie();
                //int przeciecie = (int)(s1.Koszt > s2.Koszt ? (s1.Koszt / s2.Koszt) : (s2.Koszt / s1.Koszt))* (s1.Linie.Count());
                Siec s = new Siec(0, s1.Model, s1.Random, s1.LiczbaLinii, generuj: false);

                //Porownaj
                List <int> l1              = s1.Linie.Select(x => x.GetUniqueCode()).ToList();
                List <int> l2              = s2.Linie.Select(x => x.GetUniqueCode()).ToList();
                double     stP             = (double)l1.Intersect(l2).Count() / (double)s1.Linie.Count() * 1000;
                int        stPokrewienstwa = (int)stP;
                //Console.WriteLine(stPokrewienstwa);

                s.Linie = new List <Linia>();
                //s.Linie.AddRange(s1.Linie.OrderByDescending(x => x.Koszt).Take(przeciecie));
                //s.Linie.AddRange(s2.Linie.OrderByDescending(x => x.Koszt).Skip(przeciecie).Take(s2.Linie.Count() - przeciecie));
                s.Linie.AddRange(s1.Linie.Take(przeciecie));
                s.Linie.AddRange(s2.Linie.Skip(przeciecie).Take(s2.Linie.Count() - przeciecie));

                //Im bardziej podobne tym większe prawdopodobieństwo mutacji.
                if (s.NextWithProbability(stPokrewienstwa))
                {
                    s.Mutuj();
                }

                s.WyznaczWykorzsytaneKrawedzie();
                s.WyznaczPolaczenia();
                s.WyznaczFunkcjeKosztu();
                return(s);
            }
            else
            {
                return(null);
            }
        }
示例#4
0
        static void Main(string[] args)
        {
            string filePath = "D:\\konfig.txt"; // ścieżka do pliku z modelem.
            int    n        = 35;               // liczba przystanków
            int    t        = 1;                // liczba interwalów czasowych.
            int    p        = 10;               // liczba petli.
            int    l        = 2;                // liczba linii.
            Random r        = new Random();
            Model  m        = new Model(r);

            m.Generuj(n, t, p);

            string command = "";

            while (command != "exit")
            {
                command = Console.ReadLine();
                int[]  param;
                string txtCommand;

                if (GetCommand(command, out txtCommand, out param))
                {
                    switch (txtCommand)
                    {
                    case "load":
                        if (param == null || param.Count() == 0)
                        {
                            m = new Model(r);
                            if (m.Wczytaj(filePath))
                            {
                                Console.WriteLine("Wczytano model z pliku.");
                            }
                            else
                            {
                                Console.WriteLine("Błędna składnia pliku. Nie udało się wczytać.");
                            }
                        }
                        else
                        {
                            Console.WriteLine("Błąd skladni");
                        }
                        break;

                    case "inc":
                        if (param != null && param.Count() == 1)
                        {
                            WriteIncydentneKrawedzie(m, param[0]);
                        }
                        else
                        {
                            Console.WriteLine("Błąd skladni");
                        }
                        break;

                    case "neig":
                        if (param != null && param.Count() == 1)
                        {
                            WriteSasiedzi(m, param[0]);
                        }
                        else
                        {
                            Console.WriteLine("Błąd skladni");
                        }
                        break;

                    case "term":
                        if (param == null || param.Count() == 0)
                        {
                            WritePetle(m);
                        }
                        else
                        {
                            Console.WriteLine("Błąd skladni");
                        }
                        break;

                    case "traf":
                        if (param != null && param.Count() == 1)
                        {
                            WriteRuch(m, param[0]);
                        }
                        else
                        {
                            Console.WriteLine("Błąd skladni");
                        }
                        break;

                    case "newline":
                        if (param == null || param.Count() == 0)
                        {
                            Linia T = LosujLinie(m, r);
                            WriteLinia(T);
                        }
                        else
                        {
                            Console.WriteLine("Błąd skladni");
                        }
                        break;

                    case "cntk":
                        if (param != null && param.Count() == 1)
                        {
                            Console.WriteLine("Liczba stacji o krawędziach " + param[0] + " = " + m.CountStacje(param[0]).ToString() + "\n");
                        }
                        else
                        {
                            Console.WriteLine("Błąd skladni");
                        }
                        break;

                    case "cntp":
                        if (param != null && param.Count() == 1)
                        {
                            Console.WriteLine("Liczba pętli o krawędziach " + param[0] + " = " + m.CountPetle(param[0]).ToString() + "\n");
                        }
                        else
                        {
                            Console.WriteLine("Błąd skladni");
                        }
                        break;

                    case "newweb":
                        if (param == null || param.Count() == 0)
                        {
                            Siec s = new Siec(1, m, r, l);
                            Console.WriteLine(s);
                            // Wyk kraw.
                            Dictionary <Krawedz, List <int> > wyk = s.GetWykorzystaneKrawedzie();
                            Console.WriteLine();
                            Console.WriteLine(string.Join("\n", wyk.Select(x => x.Key.ToString() + "=" +
                                                                           "{" + string.Join(",", x.Value) + "}").ToArray()));
                            List <Polaczenie> pol = s.GetWyznaczonePolaczenia();
                            Console.WriteLine();
                            Console.WriteLine(string.Join("\n", pol.Select(x => "[" + x.Id[0] + "," + x.Id[1] + "] = " +
                                                                           "{" + string.Join(",", x.Krawedzie.Select(y => y.Krawedz.StringFormatDlaPolaczen)) + "}").ToArray()));
                            Console.WriteLine();
                            Console.WriteLine(s.PrintKoszt());
                            Console.WriteLine();
                            Console.WriteLine("Wykorzystane przystanki: " + s.WykorzystanePrzystanki + "/" + m.GetStacje().Count() + "\n");
                        }
                        else
                        {
                            Console.WriteLine("Błąd skladni");
                        }
                        break;

                    case "run":
                        if (param == null || param.Count() == 0)
                        {
                            AlgorytmEwolucyjny alg = new AlgorytmEwolucyjny(m, r, l, 10);
                            alg.Run();
                        }
                        else
                        {
                            Console.WriteLine("Błąd skladni");
                        }
                        break;

                    case "exit":
                        Console.WriteLine("Wychodzę");
                        break;

                    default:
                        Console.WriteLine("Nieznana komenda");
                        break;
                    }
                }
                else
                {
                    Console.WriteLine("Błąd skladni");
                }
            }
        }