示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);
        }
示例#4
0
        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);
        }
示例#5
0
        /// <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);
            }
        }
示例#6
0
        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());
        }
示例#7
0
        /// <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);
                }
            }
        }