/// <summary> /// Nacita plochu zo vstupu /// </summary> /// <param name="settings"></param> /// <param name="x">X-ova zaciatocna poizica</param> /// <param name="y">Y-ova zaciatocna pozicia</param> /// <returns> /// Plocha, na kt. sa hladaju poklady</returns> private static Plocha LoadPlocha(Settings settings, out int x, out int y) { WritePlochaHelp(); var stream = File.OpenText(settings.Plocha); var plocha = Plocha.CreatePlocha(stream); if (plocha == null) { throw new NullReferenceException(); } // ReSharper disable once PossibleNullReferenceException var parts = stream.ReadLine().Split(new[] { ' ' }, 2, StringSplitOptions.RemoveEmptyEntries); x = int.Parse(parts[0]); y = int.Parse(parts[1]); return(plocha); }
/// <summary> /// Neuspesne najdenie cesty /// </summary> /// <param name="plocha">Plocha, na kt. sa hladal poklad</param> /// <param name="settings">Nastavenia algoritmu</param> /// <param name="x">X-ova suradnica zaciatku</param> /// <param name="y">Y-ova suradnica zaciatku</param> /// <param name="generacia">Cislo generacie, v kt. sa to zastavilo</param> private static void PrintStopped(Plocha plocha, Settings settings, int x, int y, int generacia) { var sorted = _aktualnaGeneracia.OrderByDescending(j => j.Fitness).ToArray(); var jedinec = sorted[0]; var path = jedinec.DoStuff(plocha, settings, x, y); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(); if (_timer) { Console.WriteLine("TimedOut"); } Console.WriteLine($"Nenasiel som ciel po {generacia} generaciach."); PercentColor(jedinec.Poklady, plocha.PocetPokladov); Console.WriteLine($"Poklady: {jedinec.Poklady} | Kroky: {path.Length - jedinec.Poklady} | Cesta: {path}"); Console.ForegroundColor = ConsoleColor.White; SaveStats(settings); }
/// <summary> /// Spusti parallerny vypocet fitness /// </summary> /// <param name="plocha">Plocha, na kt. sa hladaju poklady</param> /// <param name="settings"></param> /// <param name="x">X-ova zaciatocna suradnica</param> /// <param name="y">Y-ova zaciatocna suradnica</param> /// <param name="final">Jedinec, kt. sa podarilo najst cestu + cesta</param> /// <returns>Vysledok Parallel loop-u</returns> private static ParallelLoopResult CalculateFitness(Plocha plocha, Settings settings, int x, int y, out Tuple <Jedinec, string> final) { Tuple <Jedinec, string> tempFinal = null; var writeLocker = new object(); var locker = new object(); // (7) var result = Parallel.ForEach(_aktualnaGeneracia, (jedinec, state) => { // (7.1) if (!_work) { state.Stop(); } // (7.2) var path = jedinec.DoStuff(plocha, settings, x, y); if (settings.Output == OutputType.All) { PercentColor(jedinec.Poklady, plocha.PocetPokladov); lock (writeLocker) { Console.WriteLine($"{jedinec.Fitness: 000;-000} {path}"); } } // (7.3) if (jedinec.Poklady != plocha.PocetPokladov || state.IsStopped) { return; } state.Stop(); lock (locker) { tempFinal = new Tuple <Jedinec, string>(jedinec, path); } }); final = tempFinal; return(result); }
private static bool AddStep(Plocha plocha, ref int x, ref int y, int val, StringBuilder path) { char step; switch (val) { case 0b00: step = 'H'; --y; break; case 0b01: step = 'D'; ++y; break; case 0b10: step = 'P'; ++x; break; case 0b11: step = 'L'; --x; break; default: throw new Exception(); } if (x < 0 || x >= plocha.Width || y < 0 || y >= plocha.Height) { return(true); } path.Append(step); return(false); }
/// <summary> /// Nacitaj nastavenia a plochu /// </summary> /// <param name="plocha">Plocha, na kt. sa hladaju poklady</param> /// <param name="x">X-ova zaciatocna poizica</param> /// <param name="y">Y-ova zaciatocna pozicia</param> /// <param name="settings">Nacitane nastavenia</param> /// <returns>Ci sa podarilo uspesne nacitat nastavenia</returns> private static bool Init(out Plocha plocha, out int x, out int y, out Settings settings) { try { if (!Setup(out settings)) { x = -1; y = -1; plocha = null; return(false); } plocha = LoadPlocha(settings, out x, out y); return(true); } catch { x = -1; y = -1; settings = null; plocha = null; return(false); } }
internal string DoStuff(Plocha plocha, Settings settings, int x, int y) { Fitness = 0; Poklady = 0; var working = (byte[])_bunky.Clone(); var poklady = (bool[, ])plocha.Poklad.Clone(); var path = new StringBuilder(); for (int i = 0, index = 0; i < MaxInstrukcii; i++) { if (index >= 64) { index = 0; } var value = working[index]; var ins = GetInstruction(value); switch (ins) { case Increment: unchecked { ++working[GetAddress(value)]; } break; case Decrement: unchecked { --working[GetAddress(value)]; } break; case Jump: index = GetAddress(value); continue; case Print: if (AddStep(plocha, ref x, ref y, working[GetAddress(value)] & 0b11, path)) { Fitness -= settings.Fitness.VyjdenieMimoMriezky; return(path.ToString()); } Fitness -= settings.Fitness.Krok; if (poklady[x, y]) { path.Append('$'); Fitness += settings.Fitness.Poklad; if (++Poklady == plocha.PocetPokladov) { return(path.ToString()); } poklady[x, y] = false; } break; default: throw new Exception("Unknown instruction"); } ++index; } return(path.ToString()); }
/// <summary> /// Spracuj vstup z klavesnice /// </summary> /// <param name="settings">Nastavenia, kt. sa mozu aktualizovat</param> /// <param name="x">X-ova zaciatocna poizica</param> /// <param name="y">Y-ova zaciatocna pozicia</param> /// <param name="plocha">Plocha, na kt. sa hladaju poklady</param> /// <returns>Ci sa stlacil ESC</returns> private static bool SpracujVstup(ref Settings settings, ref int x, ref int y, ref Plocha plocha) { for (;;) { Console.WriteLine(); Console.WriteLine("ESC/K - pre ukoncenie programu"); Console.WriteLine("S - pre znovu nacitanie nastaveni"); Console.WriteLine("P - pre znovu nacitanie pokladov"); Console.WriteLine("Hocico ine pre spustenie noveho hladania"); Console.WriteLine(); try { var key = Console.ReadKey(true); // ReSharper disable once SwitchStatementMissingSomeCases switch (key.Key) { case ConsoleKey.K: case ConsoleKey.Escape: return(true); case ConsoleKey.S: if (!Setup(out settings)) { return(true); } continue; case ConsoleKey.P: plocha = LoadPlocha(settings, out x, out y); continue; default: return(false); } } catch { return(true); } } }