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