Пример #1
0
        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);
        }
Пример #2
0
        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);
        }