Beispiel #1
0
 public Versenyzo(string nev, string nem, string lakhely)
 {
     Nev     = nev;
     Nem     = nem;
     Lakhely = lakhely;
     GenerateID();
     _folyadekigeny         = Program.Randomizer.NextDouble() * (2.5 - 1) + 1; // Egy próba két érték közötti double randomra.
     Versenyek              = new RegularChainedList <Verseny>();
     Program.NParticipates += NemVersenyzikTobbet;
 }
Beispiel #2
0
        /// <summary>
        /// A brigádban lévő versenyzőknek hasonló mennyiségű versenyt oszt ki a leterheltségük alapján.
        /// </summary>
        /// <param name="b"></param>
        public void VersenyBrigadBeosztasKiir(RegularChainedList <Verseny> versenyek)
        {
            //verseny.Reverse();
            var brigadelement = _FirstElement;

            //Console.WriteLine("brigadelement " + brigadelement);
            while (brigadelement != null)
            {
                string[] val = brigadelement.ElementValue.BrigadBeosztas(versenyek);
                //Console.WriteLine("HAHÓ");
                //Console.WriteLine(string.Join(" ", val));
                for (int i = 0; i < val.Length; i++)
                {
                    Console.Write(val[i] + "\t");
                }

                Console.WriteLine();
                brigadelement = brigadelement.NextElement;
            }
        }
Beispiel #3
0
        /// <summary>
        /// Átalakítja a láncolt listánkat egy két dimenziós tömbbé, és tulajdonképpen annyi oszlopot hoz
        /// létre ahány verseny van, illetve annyi sort ahány versenyző van a brigádban.
        /// Ezt követően a Backtrack logikája alapján elkezdi őket besorolni a lehetséges megoldásokkal
        /// az optimális egyetlen lehetőséghez.
        /// </summary>
        /// <param name="versenyek"></param>
        /// <param name="M"></param>
        /// <returns></returns>
        private Versenyzo[,] ConvertListTo2DimArray(RegularChainedList <Verseny> versenyek, ref int[] M)
        {
            // tesztként ez 7 oszlop és 3 sor lesz
            Versenyzo[,] tomb = new Versenyzo[versenyek.Count, Count];
            //Console.WriteLine("Versenyek: " + versenyek.Count);
            //Console.WriteLine("BR: " + Count);
            for (int i = 0; i < M.Length; i++)
            {
                M[i] = -1;
            }

            var aktualis = FirstElement;

            while (aktualis != null)
            {
                //Console.WriteLine("nev: " + aktualis.ElementValue.Nev);
                var versenyekelement = aktualis.ElementValue.Versenyek.FirstElement;
                while (versenyekelement != null)
                {
                    //Console.WriteLine("Verseny ami jön: " + versenyekelement.ElementValue.Megnevezes);
                    int index = int.Parse(versenyekelement.ElementValue.Megnevezes.Split('y')[1]) - 1;
                    //Console.WriteLine("M index: " + M[index] + " utána: " + (M[index] + 1) + " igazi idx: " + index + " L: " + M.Length);
                    tomb[index, ++M[index]] = aktualis.ElementValue;
                    if (versenyekelement.LastElement)
                    {
                        break;
                    }
                    versenyekelement = versenyekelement.NextElement;
                }
                if (aktualis.LastElement)
                {
                    break;
                }
                aktualis = aktualis.NextElement;
            }
            return(tomb);
        }
Beispiel #4
0
        /// <summary>
        /// Beosztja az embereket úgy, hogy azonos versenyeken vegyenek részt.
        /// A listájukat nem, ez a method vehető úgy, hogy a végleges verseny listát
        /// hozza létre a résztvevőknek, hogy kinek hol kell szerepelnie.
        /// </summary>
        /// <param name="versenyek"></param>
        /// <returns></returns>
        public string[] BrigadBeosztas(RegularChainedList <Verseny> versenyek)
        {
            int[] M = new int[versenyek.Count];
            Versenyzo[,] tomb = ConvertListTo2DimArray(versenyek, ref M);

            /*foreach (var x in tomb)
             * {
             *  if (x != null)
             *  {
             *      Console.WriteLine("BEKERÜLT: " + x.Nev);
             *  }
             *  else
             *  {
             *      //Console.WriteLine("null");
             *  }
             * }*/
            var beosztottCsapat = new Versenyzo[versenyek.Count];

            bool van = false;

            BTS(0, ref beosztottCsapat, ref van, M, tomb);

            if (van)
            {
                //Console.WriteLine("VAN MEGOLDÁS GEC");
                string[] nevek = new string[beosztottCsapat.Length];
                for (int i = 0; i < nevek.Length; i++)
                {
                    //Console.WriteLine(beosztottCsapat[i].Nev);
                    nevek[i] = beosztottCsapat[i].Nev;
                }

                return(nevek);
            }

            throw new BTSException("Nem sikerült optimális megoldást találni.");
        }
Beispiel #5
0
        public static void Main(string[] args)
        {
            Randomizer = new Random();

            if (!File.Exists("Brigadok.ini"))
            {
                throw new FileNotFoundException("Brigádok Ini file hiányzik!");
            }

            if (!File.Exists("Versenyek.ini"))
            {
                throw new FileNotFoundException("Versenyek Ini file hiányzik!");
            }

            // Kezelő Statikus Inicializálója
            VersenyzoKezelo.InitializeKezelo();
            VersenyzoKezelo handler = VersenyzoKezelo.Instance;

            // Versenyek beolvasása
            IniParser      versenyek                    = new IniParser("Versenyek.ini");
            List <Verseny> AvailableRacesNORML          = new List <Verseny>();
            RegularChainedList <Verseny> AvailableRaces = new RegularChainedList <Verseny>();

            try
            {
                foreach (var x in versenyek.EnumSection("Versenyek"))
                {
                    AvailableRaces.Add(new Verseny(x));

                    AvailableRacesNORML.Add(new Verseny(x));
                }
            }
            catch (Exception ex)
            {
                throw new FileLoadException("Hiba a versenyek file olvasásakor! " + ex);
            }


            // Versenyzők és brigádjaik/adataik beolvasása.
            IniParser ini = new IniParser("Brigadok.ini");

            try
            {
                //Versenyzo vteszt = null;
                //VersenyBrigad bteszt = null;
                foreach (var x in ini.Sections) // Végig megyünk az összes section-n [Section1]
                {
                    VersenyBrigad
                             brigad = new VersenyBrigad(x); // Létrehozzuk a brigádot, de még nem adjuk hozzá a listához.
                    foreach (var y in ini.EnumSection(x))
                    {
                        var data = ini.GetSetting(x, y).Split('~');
                        if (data[1].ToLower() != "f" && data[1].ToLower() != "n")
                        {
                            throw new InvalidRacerDatas("Hibás versenyző nem!");
                        }

                        Versenyzo
                            v = new Versenyzo(y, data[1],
                                              data[0]); // Létrehozzuk a versenyzőt az adatokkal, majd hozzáadjuk a brigádhoz rendezett beilesztéssel
                        handler.VersenyzoHozzaAdd(brigad, v);
                        foreach (var z in data[2].Split(','))
                        {
                            foreach (var verseny in AvailableRacesNORML)
                            {
                                if (verseny.Megnevezes == z)
                                {
                                    v.Versenyek.Add(verseny);
                                }
                            }
                        }

                        //vteszt = brigad.FirstElement.ElementValue;
                        //bteszt = brigad;
                        //Console.WriteLine("V: " + v.UniqueID);
                    }

                    handler.VersenyBrigadAdd(brigad); // A brigádot hozzáadjuk a listához.

                    //Console.WriteLine(x + " : " + brigad.FirstElement.Key);
                }

                //handler.Print();
                //Console.WriteLine("print megvót");
                //handler.VersenyzoTorolFromBrigad(bteszt, vteszt);
            }
            catch (Exception ex)
            {
                throw new FileLoadException("Hiba a brigádok file olvasásakor! " + ex);
            }
            //handler.Print();
            //handler.VersenyBrigadSort();
            //handler.Print();

            Help();
            bool Run = true;

            while (Run)
            {
                try
                {
                    string s = Console.ReadLine();
                    int    i;
                    bool   b = int.TryParse(s, out i);
                    while (!b)
                    {
                        Console.WriteLine("Hibás Opció! Listázom a lehetőségeket.");
                        Help();
                        s = Console.ReadLine();
                        b = int.TryParse(s, out i);
                    }

                    switch (i)
                    {
                    case 1:
                        handler.VersenyBrigadSort();
                        Console.WriteLine("Brigádok rendezve!");
                        break;

                    case 2:
                        Console.WriteLine("Listázás.");
                        var brigadelement = handler.FirstElement;
                        while (brigadelement != null)
                        {
                            Console.WriteLine("Brigád: " + brigadelement.ElementValue.Name + " -- első kulcsa: " + brigadelement.Key);
                            var versenyzoelement = brigadelement.ElementValue.FirstElement;
                            while (versenyzoelement != null)
                            {
                                var versenyzo = versenyzoelement.ElementValue;
                                Console.WriteLine(versenyzo.Nev + " " + versenyzo.VersenyzoAzonosito + " " + versenyzo.Lakhely);

                                if (versenyzoelement.LastElement)
                                {
                                    break;
                                }
                                versenyzoelement = versenyzoelement.NextElement;
                            }

                            Console.WriteLine();
                            brigadelement = brigadelement.NextElement;
                        }
                        break;

                    case 3:
                        Console.WriteLine("Megpróbálkozunk a versenyző versenyszámainak optimalizálásával.");
                        Console.WriteLine();

                        foreach (var x in AvailableRacesNORML)
                        {
                            Console.Write(x.Megnevezes + "\t");
                        }

                        Console.WriteLine();
                        try
                        {
                            handler.VersenyBrigadBeosztasKiir(AvailableRaces);
                        }
                        catch (BTSException ex)
                        {
                            Console.WriteLine("Hiba: " + ex.Message);
                        }
                        Console.WriteLine();
                        break;

                    case 4:
                        Console.WriteLine("Írjál be egy azonosítót.");
                        string id = Console.ReadLine();

                        Versenyzo v = handler.AlertRemoval(id);
                        if (v != null)
                        {
                            if (NParticipates != null)
                            {
                                NParticipates(v);
                            }
                            handler.VersenyzoTorol(v);
                            Console.WriteLine("Törlés megtörtént!");
                        }
                        else
                        {
                            Console.WriteLine("Nem található!");
                        }
                        break;

                    case 5:
                        Console.WriteLine("Írjál be egy brigád nevet.");
                        string name = Console.ReadLine();

                        bool b3 = handler.VersenyBrigadDelete(name);
                        if (b3)
                        {
                            Console.WriteLine("Törlés megtörtént!");
                        }
                        else
                        {
                            Console.WriteLine("Nem található!");
                        }
                        break;

                    case 6:
                        Run = false;
                        break;
                    }
                    Console.WriteLine("Folytatáshoz nyomj meg egy billenytű gombot.");
                    Console.ReadKey();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Hibás bevitel, vagy valami kritikus hiba történt! " + ex);
                }
            }

            //Console.ReadKey();
        }