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; }
/// <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; } }
/// <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); }
/// <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."); }
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(); }