private void AddChild(int possibility, ICSPSolvable currentNode, CSPNode mostLimited)
        {
            ICSPSolvable nodeClone = currentNode.DeepClone();

            nodeClone.AssignNewDataAndUpdateDomains(mostLimited.xIndex, mostLimited.yIndex, possibility);

            CreateChildren(nodeClone);
        }
 private void CheckIfWonWhenNoElementsLeft(ICSPSolvable currentNode)
 {
     if (currentNode.IsSolved())
     {
         statisticsList.Add(new CsvStatistics(statisticsList.Count + 1, numberOfIterations, stopwatch.Elapsed.TotalSeconds, 0, 0));
         solutionsList.Add(currentNode);
         currentNode.PrintAllElements();
     }
 }
        private void AddChildenForEveryPossibility(List <int> allPossibilities, ICSPSolvable currentNode, CSPNode mostLimited)
        {
            for (int i = 0; i < allPossibilities.Count; i++)
            {
                ICSPSolvable CSPNodeClone = currentNode.DeepClone();
                CSPNodeClone.AssignNewData(mostLimited.xIndex, mostLimited.yIndex, allPossibilities[i]);

                CreateChildren(CSPNodeClone);
            }
        }
        private void AddChildenForEveryPossibility(List <int> allPossibilities, ICSPSolvable currentNode, CSPNode mostLimited)
        {
            for (int i = 0; i < allPossibilities.Count; i++)
            {
                ICSPSolvable nodeClone = currentNode.DeepClone();
                nodeClone.AssignNewDataAndUpdateDomains(mostLimited.xIndex, mostLimited.yIndex, allPossibilities[i]);

                if (!nodeClone.IsAnyOfDomainsEmpty())
                {
                    CreateChildren(nodeClone);
                }
            }
        }
        private void AddChild(int possibility, ICSPSolvable currentNode, CSPNode mostLimited)
        {
            ICSPSolvable nodeClone = currentNode.DeepClone();

            nodeClone.AssignNewDataAndUpdateDomains(mostLimited.xIndex, mostLimited.yIndex, possibility);

            if (!nodeClone.IsAnyOfDomainsEmpty())
            {
                CreateChildren(nodeClone);
            }
            else
            {
                numberOfIterations++;
            }
        }
        public CSPForwardChecking()
        {
            solutionsList  = new List <ICSPSolvable>();
            statisticsList = new List <CsvStatistics>();

            if (GAME_TYPE == GAME_TYPE_ENUM.FUTOSHIKI)
            {
                rootData = FutoshikiProblemSingleton.GetInstance().initialFutoshikiGraph.DeepClone();
            }
            else if (GAME_TYPE == GAME_TYPE_ENUM.SKYSCRAPPER)
            {
                rootData = SkyscraperProblemSingleton.GetInstance().initialSkyscrapperArray.DeepClone();
            }
            Solver();
        }
        private void CreateChildren(ICSPSolvable currentNode)
        {
            CSPNode mostLimited = currentNode.ChooseElementByHeuristics();

            if (mostLimited == null)
            {
                CheckIfWonWhenNoElementsLeft(currentNode);
            }
            else
            {
                List <int> allPossibilities = mostLimited.domain;

                ParallelOptions options = new ParallelOptions();
                options.MaxDegreeOfParallelism = 4;

                Parallel.ForEach(allPossibilities, options, (i) =>
                {
                    AddChild(i, currentNode, mostLimited);
                });
            }
        }