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)); }
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); }