Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        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);
                 }
             }
         }
     }
 }