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); }
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); }
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); }
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); }