예제 #1
0
파일: Clique.cs 프로젝트: IrinaLen/SAT
        private Tree OnlyOneColor(int i, int j)
        {
            int  c1 = 1; // 1 цвет
            var  e1 = nameId[new ColoredEdge(i, j, 1)];
            Tree t1 = new Tree(e1);

            for (int c2 = 2; c2 <= colorNum; c2++)
            {
                e1 = nameId[new ColoredEdge(i, j, c2)];

                t1.AddAnd(t1, c1 == c2 ? new Tree(e1) : new Tree(e1, true));
            }
            Tree result = t1;


            for (c1 = 2; c1 <= colorNum; c1++)
            {
                e1 = nameId[new ColoredEdge(i, j, 1)];
                t1 = new Tree(e1, true); //1!=2
                for (int c2 = 2; c2 <= colorNum; c2++)
                {
                    e1 = nameId[new ColoredEdge(i, j, c2)];

                    t1.AddAnd(t1, c1 == c2 ? new Tree(e1) : new Tree(e1, true));
                }

                result.AddOr(result, t1);
            }
            return(result);
        }
예제 #2
0
파일: Clique.cs 프로젝트: IrinaLen/SAT
        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));
        }