private static MrvResult MinimumRemainingValues(Dictionary <Variable, List <Domain> > unassignedVariables, List <Constraint> constraints) { var mrv = new MrvResult { Variable = unassignedVariables.Keys.First(), LegalValues = unassignedVariables[unassignedVariables.Keys.First()] }; var min = unassignedVariables[unassignedVariables.Keys.First()].Count; var mrvVariables = new List <Variable>(); foreach (var unassignedVariable in unassignedVariables.Keys) { var legalValues = unassignedVariables[unassignedVariable]; if (legalValues.Count < min) { min = legalValues.Count; mrv.Variable = unassignedVariable; mrv.LegalValues = legalValues; mrvVariables = new List <Variable> { unassignedVariable }; } else if (legalValues.Count == min) { mrvVariables.Add(unassignedVariable); } } mrv.Variable = GetVariableWithMostConstraints(mrvVariables, constraints); mrv.LegalValues = unassignedVariables[mrv.Variable]; return(mrv); }
private static List <Domain> LeastConstrainingValueOrder(MrvResult next, Dictionary <Variable, List <Domain> > variables, List <Constraint> constraints, bool isPairwiseDisjunct) { Variable act = next.Variable; var neighbournodes = GetNeighbours(act, constraints).Where(x => x.Value == null).ToList(); var neighbours = new Dictionary <Variable, List <Domain> >(); var constrainingValues = new Dictionary <Variable, List <Domain> >(); foreach (var node in neighbournodes) { neighbours.Add(node, new List <Domain>(variables[node])); constrainingValues.Add(node, new List <Domain>()); } List <Domain> result = new List <Domain>(); var tmp = new List <Domain>(next.LegalValues); while (tmp.Count > 0) { Domain best = tmp.FirstOrDefault(); constrainingValues.Keys.ToList().ForEach(x => constrainingValues[x] = new List <Domain>()); foreach (var domain in tmp) { act.Value = domain; if (isPairwiseDisjunct) { neighbours.Keys.ToList().ForEach(x => neighbours[x].Remove(domain)); } var cnt = CountConstrainingValues(neighbours, constraints); if (IsBetter(cnt, constrainingValues)) { constrainingValues = cnt; best = domain; } if (isPairwiseDisjunct) { neighbours.Keys.ToList().ForEach(x => neighbours[x].Add(domain)); } } if (NeighboursHaveValuesLeft(act, constrainingValues, constraints, isPairwiseDisjunct)) { result.Add(best); } tmp.Remove(best); } act.Value = null; return(result); }