예제 #1
0
        public void Lemma11Test(CspInstance instance)
        {
            foreach (var v in instance.Variables)
            {
                foreach (var c in v.AvalibleColors)
                {
                    if ((c.Restrictions.Count >= 3 && v.AvalibleColors.Count == 4) ||
                        (c.Restrictions.Count >= 4 && v.AvalibleColors.Count == 3)) // Lemma11 applies
                    {
#if DEBUG
                        if (c.Restrictions.Select(r => r.Variable).Distinct().Count() != c.Restrictions.Select(r => r.Variable).Count())
                        {
                            Assert.Throws <ArgumentException>(() => CSPLemmas.Lemma11(instance, v, c));
                        }
                        else
                        {
                            var res = CSPLemmas.Lemma11(instance, v, c);
                            Assert.Equal(2, res.Count);
                            Assert.Contains(res, inst => inst.Result.Any(p => p.Variable == v && p.Color == c));
                        }
#endif
                    }
                    else
                    {
                        var res = CSPLemmas.Lemma11(instance, v, c);
                        Assert.Single(res);
                    }
                }
            }
        }
예제 #2
0
        int[] Rec(CspInstance instance)
        {
            foreach (var restriction in instance.Restrictions)
            {
                if (restriction.Pair1 == restriction.Pair2)
                {
                    instance.RemoveColor(restriction.Pair1);
                }
            }

            foreach (var v in instance.Variables)
            {
                if (v.AvalibleColors.Count == 0)
                {
                    return(null);
                }
            }

            bool applied;

            foreach (var v in instance.Variables)
            {
                CSPLemmas.Lemma2(instance, v, out applied);
                if (applied)
                {
                    return(Rec(instance));
                }
            }
            foreach (var v in instance.Variables)
            {
                CSPLemmas.Lemma3(instance, v, out applied);
                if (applied)
                {
                    return(Rec(instance));
                }
            }
            foreach (var v in instance.Variables)
            {
                CSPLemmas.Lemma4(instance, v, out applied);
                if (applied)
                {
                    return(Rec(instance));
                }
            }
            foreach (var v in instance.Variables)
            {
                CSPLemmas.Lemma5(instance, v, out applied);
                if (applied)
                {
                    return(Rec(instance));
                }
            }
            foreach (var v in instance.Variables)
            {
                CSPLemmas.Lemma6(instance, v, out applied);
                if (applied)
                {
                    return(Rec(instance));
                }
            }

            List <CspInstance> instances;

            //lemma 8
            foreach (var variable in instance.Variables)
            {
                foreach (var color in variable.AvalibleColors)
                {
                    instances = CSPLemmas.Lemma8(instance, variable, color, out applied);
                    if (applied)
                    {
                        foreach (var retInstance in instances)
                        {
                            var result = Rec(retInstance);
                            if (result != null)
                            {
                                return(result);
                            }
                        }
                        return(null);
                    }
                }
            }

            //lemma 9
            foreach (var variable in instance.Variables)
            {
                foreach (var color in variable.AvalibleColors)
                {
                    instances = CSPLemmas.Lemma9(instance, variable, color, out applied);
                    if (applied)
                    {
                        foreach (var retInstance in instances)
                        {
                            var result = Rec(retInstance);
                            if (result != null)
                            {
                                return(result);
                            }
                        }
                        return(null);
                    }
                }
            }

            //lemma 10
            foreach (var variable in instance.Variables)
            {
                foreach (var color in variable.AvalibleColors)
                {
                    var neighbors = color.Restrictions.Select(r => r.Variable).Distinct();
                    foreach (var neighbor in neighbors)
                    {
                        var restrictionToNeighbor = color.Restrictions.Where(r => r.Variable == neighbor);
                        if (restrictionToNeighbor.Count() >= 2)
                        {
                            instances = CSPLemmas.Lemma10(instance, variable, color, restrictionToNeighbor.First().Variable);
                            if (instances.Count > 1)
                            {
                                foreach (var retInstance in instances)
                                {
                                    var result = Rec(retInstance);
                                    if (result != null)
                                    {
                                        return(result);
                                    }
                                }
                                return(null);
                            }
                        }
                    }
                }
            }

            //lemma 11
            foreach (var variable in instance.Variables)
            {
                foreach (var color in variable.AvalibleColors)
                {
                    instances = CSPLemmas.Lemma11(instance, variable, color);
                    if (instances.Count > 1)
                    {
                        foreach (var retInstance in instances)
                        {
                            var result = Rec(retInstance);
                            if (result != null)
                            {
                                return(result);
                            }
                        }
                        return(null);
                    }
                }
            }


            //lemma 12
            foreach (var variable in instance.Variables)
            {
                foreach (var color in variable.AvalibleColors)
                {
                    instances = CSPLemmas.Lemma12(instance, variable, color);
                    if (instances.Count > 1)
                    {
                        foreach (var retInstance in instances)
                        {
                            var result = Rec(retInstance);
                            if (result != null)
                            {
                                return(result);
                            }
                        }
                        return(null);
                    }
                }
            }


            //lemma 13
            foreach (var variable in instance.Variables)
            {
                foreach (var color in variable.AvalibleColors)
                {
                    instances = CSPLemmas.Lemma13(instance, variable, color);
                    if (instances.Count > 1)
                    {
                        foreach (var retInstance in instances)
                        {
                            var result = Rec(retInstance);
                            if (result != null)
                            {
                                return(result);
                            }
                        }
                        return(null);
                    }
                }
            }

            //lemma 15
            instances = CSPLemmas.Lemma15(instance, out applied);
            if (applied)
            {
                foreach (var retInstance in instances)
                {
                    var result = Rec(retInstance);
                    if (result != null)
                    {
                        return(result);
                    }
                }
                return(null);
            }

            //lemma 17
            instances = CSPLemmas.Lemma17(instance, out applied);
            if (applied)
            {
                foreach (var retInstance in instances)
                {
                    var result = Rec(retInstance);
                    if (result != null)
                    {
                        return(result);
                    }
                }
                return(null);
            }

            //lemma 18
            instances = CSPLemmas.Lemma18(instance, out applied);
            if (applied)
            {
                foreach (var retInstance in instances)
                {
                    var result = Rec(retInstance);
                    if (result != null)
                    {
                        return(result);
                    }
                }
                return(null);
            }

            //lemma 19
            var isColoring = CSPLemmas.Lemma19(instance);

            if (isColoring)
            {
                return(instance.GetResult());
            }
            else
            {
                return(null);
            }
        }