Example #1
0
        private bool Solve()
        {
            nameId = new Dictionary <ColoredEdge, int>(); // i, об color
            GenerateVariables();

            var cnf = new DPLL.CNF();

            //not one color in clique
            for (int c = 1; c <= colorNum; c++)
            {
                cnf.Add(GenerateCliqueNotOneColor(c));
            }

            Tree t = OnlyOneColor(1, 2);

            //only one color of edge
            for (int i = 1; i < n; i++)
            {
                for (int j = i + 1; j <= n; j++)
                {
                    if (i != 1 || j != 2)
                    {
                        t.AddAnd(t, OnlyOneColor(i, j));
                    }
                }
            }

            var ts = new DPLL.TseitinTransformer(t);

            cnf.Add(ts.Transform());

            vars = ts.GetVars;
            vars = new HashSet <int>(vars.Union(nameId.Values));

            var dpll = new DPLL.DPLL(vars);

            return(dpll.DPLLAlgo(cnf));
        }
Example #2
0
        private DPLL.CNF GenerateCliqueNotOneColor(int colorId)
        {
            DPLL.CNF res = new DPLL.CNF();

            for (int i = 1; i < n - 1; i++)
            {
                for (int j = i + 1; j < n; j++)
                {
                    for (int k = j + 1; k <= n; k++)
                    {
                        var e1 = new DPLL.Literal(nameId[new ColoredEdge(i, j, colorId)]);
                        var e2 = new DPLL.Literal(nameId[new ColoredEdge(i, k, colorId)]);
                        var e3 = new DPLL.Literal(nameId[new ColoredEdge(j, k, colorId)]);
                        if (colorNum < 3)
                        {
                            res.Add(new DPLL.Literal[] { e1, e2, e3 });
                        }
                        res.Add(new DPLL.Literal[] { e1.Inversed(), e2.Inversed(), e3.Inversed() });
                    }
                }
            }
            return(res);
        }