Ejemplo n.º 1
0
        protected void FindSolution(Step current)
        {
            if (CancellationPending)
            {
                return;
            }

            if (current.Number > _stepLimit)
            {
                current.Stop(StopReason.StepLimit);
                return;
            }

            current.Status = StepStatus.InProgress;
            current.Variants.Clear();

            var moves = current.GetPossibleMoves();

            if (moves.Count == 0)
            {
                current.Stop(StopReason.NoMoves);
                return;
            }

            foreach (var m in moves)
            {
                var step = ProcessMove(current, m);
                if (step.StopReason == StopReason.FieldFoundEarly)
                {
                    continue;
                }

                SetLevelForProgress(step);
                SetLevelField(step);

                current.Variants.Add(step);
            }

            if (CancellationPending)
            {
                return;
            }

            var toProcess = current.Variants.Where(e => e.Status == StepStatus.New).ToArray();


            foreach (var step in toProcess)
            {
                AddInProgress(step);
            }

            current.Stop(StopReason.Solved);
        }
Ejemplo n.º 2
0
        private void FindSolution(Step current)
        {
            if (this.CancellationPending)
            {
                return;
            }

            if (current.Number > StepLimit)
            {
                current.Stop(StopReason.StepLimit);
                return;
            }

            current.Status = StepStatus.InProgress;
            current.Variants.Clear();

            var moves = current.GetPossibleMoves();

            if (moves.Count == 0)
            {
                current.Stop(StopReason.NoMoves);
                return;
            }

            foreach (var m in moves)
            {
                var step = ProcessMove(current, m);
                if (step.StopReason == StopReason.FieldFoundEarly && MemoryOptimization)
                {
                    continue;
                }

                SetLevelForProgress(step);
                SetLevelField(step);
                current.Variants.Add(step);
            }



            var toProcess = current.Variants.Where(e => e.Status == StepStatus.New).ToArray();


            foreach (var step in toProcess)
            {
                Step s = step;
                AddInProgress(new async(() => FindSolution(s), _threadPool));
            }

            current.Stop(StopReason.Solved);
        }
Ejemplo n.º 3
0
        private Step ProcessMove(Step current, Movement m)
        {
            byte num;
            var  step = new Step(current, m, GetId());

            if (step.Progress == 0)
            {
                step.Stop(StopReason.Solution);
                return(step);
            }


            if (GetLevelForProgress(step.Progress, out num) && step.Number - num > _diffLimit)
            {
                step.Stop(StopReason.ProgressFoundEarly);
                return(step);
            }

            if (GetLevelForProgress(0, out num) && step.Number >= num)
            {
                step.Stop(StopReason.SolutionFoundEarly);
                return(step);
            }
            // поле найдено на том же или меньшем ходу
            if (GetLevelForField(step.Field, out num) && step.Number >= num)
            {
                step.Stop(StopReason.FieldFoundEarly);

                //var salt = Randomizer.GetInteger();
                //TypeSerializer<Step>.ToXmlFile(salt + ".xml", existsStep);
                //TypeSerializer<Step>.ToXmlFile(salt + "_.xml", step);
                return(step);
            }

            return(step);
        }
Ejemplo n.º 4
0
        private Step ProcessMove(Step current, Movement m)
        {
            int num;
            var after = (Field)current.Field.Clone();

            after.DoMove(m);


            var step = new Step
            {
                Id       = GetId(),
                Field    = after,
                Move     = m,
                Number   = current.Number + 1,
                Progress = after.GetProgress(),
                Previous = current
            };

            if (step.Progress == 0)
            {
                step.Stop(StopReason.Solution);
                return(step);
            }

            int existsStepNumber;

            if (GetLevelForProgress(step.Progress, out num))
            {
                if (step.Number - num > DiffLimit)
                {
                    step.Stop(StopReason.ProgressFoundEarly);
                    return(step);
                }
            }
            if (GetLevelForProgress(0, out num))
            {
                if (step.Number >= DiffLimit)
                {
                    step.Stop(StopReason.SolutionFoundEarly);
                    return(step);
                }
            }

            if (GetLevelForField(after, out existsStepNumber))
            {
                // поле найдено на том же или меньшем ходу
                if (step.Number >= existsStepNumber)
                {
                    step.Stop(StopReason.FieldFoundEarly);

                    //var salt = Randomizer.GetInteger();
                    //TypeSerializer<Step>.ToXmlFile(salt + ".xml", existsStep);
                    //TypeSerializer<Step>.ToXmlFile(salt + "_.xml", step);
                    return(step);
                }
            }



            return(step);
        }