/// <summary> /// Implements the degree heuristic. /// </summary> /// <param name="vars"></param> /// <param name="assignment"></param> /// <param name="csp"></param> /// <returns></returns> private IList <Variable> applyDegreeHeuristic(IList <Variable> vars, Assignment assignment, CSProblem csp) { IList <Variable> result = new List <Variable>(); int maxDegree = int.MinValue; foreach (Variable var in vars) { int degree = 0; foreach (IConstraint constraint in csp.GetConstraints(var)) { Variable neighbor = csp.GetNeighbor(var, constraint); if (!assignment.HasAssignmentFor(neighbor) && csp.GetDomain(neighbor).Size() > 1) { ++degree; } } if (degree >= maxDegree) { if (degree > maxDegree) { result.Clear(); maxDegree = degree; } result.Add(var); } } return(result); }
private int CountLostValues(Variable var, object value, CSProblem csp) { int result = 0; Assignment assignment = new Assignment(); assignment.SetAssignment(var, value); foreach (IConstraint constraint in csp.GetConstraints(var)) { Variable neighbor = csp.GetNeighbor(var, constraint); foreach (object nValue in csp.GetDomain(neighbor)) { assignment.SetAssignment(neighbor, nValue); if (!constraint.IsSatisfiedWith(assignment)) { ++result; } } } return(result); }
protected void ReduceDomains(FIFOQueue <Variable> queue, CSProblem csp, DomainRestoreInfo info) { while (!(queue.Count == 0)) { Variable var = queue.Pop(); foreach (IConstraint constraint in csp.GetConstraints(var)) { if (constraint.GetScope().Count == 2) { Variable neighbor = csp.GetNeighbor(var, constraint); if (this.Revise(neighbor, var, constraint, csp, info)) { if (csp.GetDomain(neighbor).IsEmpty()) { info.SetEmptyDomainFound(true); return; } queue.Push(neighbor); } } } } }