Esempio n. 1
0
        private bool Revise(Variable xi, Variable xj, IConstraint constraint,
                            CSProblem csp, DomainRestoreInfo info)
        {
            bool revised    = false;
            var  assignment = new Assignment();

            foreach (object vValue in csp.GetDomain(xi))
            {
                assignment.SetAssignment(xi, vValue);
                bool vValueOk = false;
                foreach (var nValue in csp.GetDomain(xj))
                {
                    assignment.SetAssignment(xj, nValue);
                    if (constraint.IsSatisfiedWith(assignment))
                    {
                        vValueOk = true;
                        break;
                    }
                }
                if (!vValueOk)
                {
                    info.StoreDomainFor(xi, csp.GetDomain(xi));
                    csp.RemoveValueFromDomain(xi, vValue);
                    revised = true;
                }
            }
            return(revised);
        }
Esempio n. 2
0
        private bool Revise(Variable var, IConstraint constraint,
                            Assignment assignment, CSProblem csp, DomainRestoreInfo info)
        {
            bool revised = false;

            foreach (object value in csp.GetDomain(var))
            {
                assignment.SetAssignment(var, value);
                if (!constraint.IsSatisfiedWith(assignment))
                {
                    info.StoreDomainFor(var, csp.GetDomain(var));
                    csp.RemoveValueFromDomain(var, value);
                    revised = true;
                }
                assignment.RemoveAssignment(var);
            }
            return(revised);
        }
Esempio n. 3
0
        public DomainRestoreInfo ReduceDomains(Variable var, object value, CSProblem csp)
        {
            DomainRestoreInfo result = new DomainRestoreInfo();
            Domain            domain = csp.GetDomain(var);

            if (domain.Contains(value))
            {
                if (domain.Count() > 1)
                {
                    FIFOQueue <Variable> queue = new FIFOQueue <Variable>();
                    queue.Push(var);
                    result.StoreDomainFor(var, domain);
                    csp.SetDomain(var, new Domain(new object[] { value }));
                    this.ReduceDomains(queue, csp, result);
                }
            }
            else
            {
                result.SetEmptyDomainFound(true);
            }
            return(result.Compactify());
        }