Ejemplo n.º 1
0
        private string CreateInfoString(bool forProcessing = false)
        {
            StackTrace stackTrace = new StackTrace();
            var        sb         = new StringBuilder();

            if (!forProcessing)
            {
                sb.AppendLine($"{stackTrace.GetFrame(2).GetMethod().Name}");
                var varSelHeuName = _variableSelectionHeuristics.GetType().Name;
                sb.AppendLine($"{varSelHeuName.Remove(varSelHeuName.Length - 2)}");
                var valSelHeuName = ValueSelectionHeuristics.GetType().Name;
                sb.AppendLine($"{valSelHeuName.Remove(valSelHeuName.Length - 2)}");
                sb.AppendLine("-------------------------------------------------");
                sb.AppendLine($"visited nodes to first solution: {(_hasSolution ? _visitedNodesToFirst.ToString() : "")}");
                sb.AppendLine($"backtracks to first solution: {_backtracksNumberToFirstSolution}");
                sb.AppendLine($"all visited nodes: {_visitedNodes}");
                sb.AppendLine($"all backtracks: {_backtracksNumber}");
                sb.AppendLine($"found solution: {_hasSolution}");
                sb.AppendLine($"solutions number: {_foundSolutionsNumber}");
                sb.AppendLine($"time to first solution: {(_hasSolution ? _timeToFirst.Elapsed.ToString() : " ")}");
                sb.AppendLine($"time to complete: {_timeToComplete.Elapsed}\n");
            }
            else
            {
                sb.Append($"{ (_hasSolution ? _visitedNodesToFirst.ToString() : "")}");
                sb.Append($", {_backtracksNumberToFirstSolution}");
                sb.Append($", {_visitedNodes}");
                sb.Append($", {_backtracksNumber}");
                sb.Append($", {_hasSolution}");
                sb.Append($", {_foundSolutionsNumber}");
                sb.Append($", {(_hasSolution ? _timeToFirst.ElapsedMilliseconds.ToString() : " ")}");
                sb.Append($", {_timeToComplete.ElapsedMilliseconds}");
            }
            return(sb.ToString());
        }
Ejemplo n.º 2
0
        public override void BacktrackingAlgorithm(bool printSolutions = false)
        {
            base.BacktrackingAlgorithm(printSolutions);

            var varHeu = _variableSelectionHeuristics.GetType().Name;
            var valHeu = ValueSelectionHeuristics.GetType().Name;

            var fileName = $"{_sudoku.Id.ToString()}_solutions_bt_{varHeu}_{valHeu}";

            if (FileSaveDirectory != null)
            {
                fileName = $@"{FileSaveDirectory}\{fileName}";
            }
            base.SaveSolutionsInfoToFile(fileName);
            foreach (var sol in _foundSolutions)
            {
                SaveSolutionToFile(fileName, sol);
            }
        }
Ejemplo n.º 3
0
        public virtual void BacktrackingAlgorithm(bool printSolutions = false)
        {
            int alreadySet = 0;

            _timeToFirst    = new Stopwatch();
            _timeToComplete = new Stopwatch();
            _foundSolutions = new List <S[]>();
            S    current   = null;
            bool backtrack = false;

            _timeToFirst.Start();
            _timeToComplete.Start();
            List <Tuple <int, T> > nodes = new List <Tuple <int, T> >();

            bool[][] domainsState = new bool[VariablesWithConstraints.Length][];
            for (int i = 0; i < VariablesWithConstraints.Length; i++)
            {
                domainsState[i] = new bool[VariablesWithConstraints[i].Item2.Size];
            }
            Domain <T> currentVariableDomain = null;

            bool[] currentVariableDomainState = null;

            while (true)
            {
                if (current == null)
                {
                    current = _variableSelectionHeuristics.StartVariable();
                }
                else
                {
                    if (backtrack)
                    {
                        if (_variableSelectionHeuristics.HasPrev())
                        {
                            current   = _variableSelectionHeuristics.Prev();
                            backtrack = false;
                        }
                        else
                        {
                            _timeToComplete.Stop();
                            break;
                        }
                    }
                    else
                    {
                        if (_variableSelectionHeuristics.HasNext())
                        {
                            current = _variableSelectionHeuristics.Next();
                        }
                        else
                        {
                            _hasSolution = true;


                            if (_foundSolutionsNumber == 0)
                            {
                                _timeToFirst.Stop();
                                _visitedNodesToFirst             = _visitedNodes;
                                _backtracksNumberToFirstSolution = _backtracksNumber;
                            }

                            _foundSolutionsNumber++;
                            _foundSolutions.Add(SaveSolution());

                            if (currentVariableDomain != null && !ValueSelectionHeuristics.HasNext())
                            {
                                if (currentVariableDomainState != null)
                                {
                                    ArrayExtensions.Fill(ref currentVariableDomainState, false);
                                }
                                current.Value = currentVariableDomain.Default;
                                current       = _variableSelectionHeuristics.Prev();
                                _backtracksNumber++;
                            }
                        }
                    }
                }



                currentVariableDomain      = VariablesWithConstraints[current.Index].Item2;
                currentVariableDomainState = domainsState[current.Index];

                // Send current domain to heuristics
                ValueSelectionHeuristics.RegisterDomain(current, currentVariableDomain, ref currentVariableDomainState);

                bool constraintsSatisfied = false;
                if (!ValueSelectionHeuristics.HasNext())
                {
                    ArrayExtensions.Fill(ref currentVariableDomainState, false);
                    current.Value = currentVariableDomain.Default;
                    backtrack     = true;
                    _backtracksNumber++;
                }
                else
                {
                    while (ValueSelectionHeuristics.HasNext())
                    {
                        var currentDomainValue = ValueSelectionHeuristics.Next();
                        current.Value = currentDomainValue;
                        _visitedNodes++;

                        if (CheckConstraints(current))
                        {
                            constraintsSatisfied = true;
                            break;
                        }
                        _backtracksNumber++;
                    }
                    if (!constraintsSatisfied)
                    {
                        ArrayExtensions.Fill(ref currentVariableDomainState, false);
                        current.Value = currentVariableDomain.Default;
                        backtrack     = true;
                        _backtracksNumber++;
                    }
                }

                //if (_iteration % 100000 == 0)
                //    Console.Out.WriteAsync($"{alreadySet} ");

                //if (alreadySet != AlredySetVariables())
                //{
                //    alreadySet = AlredySetVariables();

                //}
                //_iteration++;

                //PrintCurrentVariablesState();
            }


            if (printSolutions)
            {
                PrintSolutionsInfo();
            }
        }
Ejemplo n.º 4
0
        public virtual void BacktrackingAlgorithmForwardCheck(bool printSolutions = false)
        {
            int alreadySet = 0;

            _timeToFirst    = new Stopwatch();
            _timeToComplete = new Stopwatch();
            _foundSolutions = new List <S[]>();
            S    current   = null;
            bool backtrack = false;

            _timeToFirst.Start();
            _timeToComplete.Start();


            var domainsStateStack = new Stack <bool[][]>();

            bool[][] domainsState = new bool[VariablesWithConstraints.Length][];
            for (int i = 0; i < VariablesWithConstraints.Length; i++)
            {
                domainsState[i] = new bool[VariablesWithConstraints[i].Item2.Size];
            }

            domainsStateStack.Push(domainsState);
            bool[][]   currentDomainsState   = domainsStateStack.Peek();
            Domain <T> currentVariableDomain = null;

            while (true)
            {
                if (current == null)
                {
                    current = _variableSelectionHeuristics.StartVariable();
                }
                else
                {
                    if (backtrack)
                    {
                        if (_variableSelectionHeuristics.HasPrev())
                        {
                            current   = _variableSelectionHeuristics.Prev();
                            backtrack = false;
                            domainsStateStack.Pop();
                            currentDomainsState = domainsStateStack.Peek();
                        }
                        else
                        {
                            _timeToComplete.Stop();
                            break;
                        }
                    }
                    else
                    {
                        if (_variableSelectionHeuristics.HasNext())
                        {
                            current = _variableSelectionHeuristics.Next();
                        }
                        else
                        {
                            _hasSolution = true;

                            if (_foundSolutionsNumber == 0)
                            {
                                _visitedNodesToFirst = _visitedNodes;
                                _timeToFirst.Stop();
                                _backtracksNumberToFirstSolution = _backtracksNumber;
                            }

                            _foundSolutionsNumber++;
                            _foundSolutions.Add(SaveSolution());
                            domainsStateStack.Pop();
                            domainsStateStack.Pop();
                            currentDomainsState   = domainsStateStack.Peek();
                            currentVariableDomain = VariablesWithConstraints[current.Index].Item2;
                            current.Value         = currentVariableDomain.Default;
                            current = _variableSelectionHeuristics.Prev();
                            _backtracksNumber++;
                        }
                    }
                }


                currentVariableDomain = VariablesWithConstraints[current.Index].Item2;
                ValueSelectionHeuristics.RegisterDomain(current, currentVariableDomain, ref currentDomainsState[current.Index]);


                bool constraintsSatisfied = false;
                if (!ValueSelectionHeuristics.HasNext())
                {
                    current.Value = currentVariableDomain.Default;
                    backtrack     = true;

                    _backtracksNumber++;
                }
                else
                {
                    while (ValueSelectionHeuristics.HasNext())
                    {
                        var currentDomainValue = ValueSelectionHeuristics.Next();
                        current.Value = currentDomainValue;
                        _visitedNodes++;


                        bool[][] temp     = new bool[currentDomainsState.Length][];
                        int      tempSize = temp.Length;
                        for (int i = 0; i < tempSize; i++)
                        {
                            if (_variableSelectionHeuristics.IsBefore(VariablesWithConstraints[i].Item1, current))
                            {
                                temp[i] = currentDomainsState[i];
                            }
                            else
                            {
                                int newSize = currentDomainsState[i].Length;
                                var tempArr = new bool[newSize];
                                temp[i] = new bool[newSize];
                                for (int j = 0; j < newSize; j++)
                                {
                                    temp[i][j] = currentDomainsState[i][j];
                                }
                            }
                        }
                        domainsStateStack.Push(temp);

                        currentDomainsState = domainsStateStack.Peek();


                        if (!FilterOutDomains(current, ref currentDomainsState, _variableSelectionHeuristics))
                        {
                            constraintsSatisfied = true;
                            break;
                        }

                        domainsStateStack.Pop();
                        currentDomainsState = domainsStateStack.Peek();
                        _backtracksNumber++;
                    }
                    if (!constraintsSatisfied)
                    {
                        current.Value = currentVariableDomain.Default;
                        backtrack     = true;
                    }
                }
            }


            if (printSolutions)
            {
                PrintSolutionsInfo();
            }
        }