private static int CountLostValues(CSP <Var, Val> csp, Assignment <Var, Val> assignment, Var var, Val value) { var result = 0; var assign = new Assignment <Var, Val>(); assign.Add(var, value); foreach (var constraint in csp.GetConstraints(var)) { if (constraint.GetScope().Count() == 2) { Var neighbor = csp.GetNeighbor(var, constraint); if (!assignment.Contains(neighbor)) { foreach (var val in csp.GetDomain(neighbor)) { assign.Add(neighbor, val); if (!constraint.IsSatisfiedWith(assign)) { ++result; } } } } } return(result); }
public IEnumerable <Val> Apply(CSP <Var, Val> csp, Assignment <Var, Val> assignment, Var var) { var pairs = new List <KeyValuePair <Val, int> >(); foreach (Val value in csp.GetDomain(var)) { var num = CountLostValues(csp, assignment, var, value); pairs.Add(new KeyValuePair <Val, int>(value, num)); } return(pairs.OrderBy(p => p.Value).Select(p => p.Key)); }
public virtual IEnumerable <Var> Apply(CSP <Var, Val> csp, IEnumerable <Var> vars) { var result = new List <Var>(); var minValues = int.MaxValue; foreach (var var in vars) { var values = csp.GetDomain(var).Count(); if (values < minValues) { result.Clear(); minValues = values; } if (values == minValues) { result.Add(var); } } return(result); }
private IEnumerable <Val> OrderDomainValues(CSP <Var, Val> csp, Assignment <Var, Val> assignment, Var var) { return((ValueOrderingStrategy != null) ? ValueOrderingStrategy.Apply(csp, assignment, var) : csp.GetDomain(var)); }