コード例 #1
0
ファイル: WalkSAT.cs プロジェクト: hackerlank/trunk-chatbot
        public Model FindModelFor(String logicalSentence, int numberOfFlips,
                                  double probabilityOfRandomWalk)
        {
            this.myModel = new Model();
            var s              = (Sentence) new PEParser().Parse(logicalSentence);
            var transformer    = new CNFTransformer();
            var clauseGatherer = new CNFClauseGatherer();
            var sc             = new SymbolCollector();

            var symbols = sc.GetSymbolsIn(s).ToList();
            var r       = new Random();

            foreach (var sym in symbols)
            {
                this.myModel = this.myModel.Extend(sym, Util.RandomBoolean());
            }

            IList <Sentence> clauses = clauseGatherer.GetClausesFrom(transformer.Transform(s)).ToList();

            //IList<Sentence> ClauseSet = new Converter<Sentence>().ListToSet(clauses);
            lastClauses     = clauses;
            lastClausesFlip = new List <Int64>(clauses.Count + 1);
            for (int i = 0; i < clauses.Count; i++)
            {
                lastClausesFlip.Add(0);
            }

            for (int i = 0; i < numberOfFlips; i++)
            {
                List <int> unsatList = new List <int>();
                int        numSat    = this.GetNumberOfClausesSatisfiedIn(new Converter <Sentence>().ListToSet(clauses), myModel, unsatList);
                if (numSat == clauses.Count)
                {
                    trials = i;
                    return(myModel);
                }
                int probe = FindAnRandomUnsatisfiedClause(clauses, myModel, unsatList);
                //Sentence clause = clauses[random.Next(clauses.Count)];
                Sentence clause = clauses[probe];
                lastClausesFlip[probe]++;

                IList <Symbol> symbolsInClause = sc.GetSymbolsIn(clause).ToList();

                if (random.NextDouble() >= probabilityOfRandomWalk)
                {
                    Symbol randomSymbol = symbolsInClause[random.Next(symbolsInClause.Count)];
                    myModel = myModel.Flip(randomSymbol);
                }
                else
                {
                    Symbol symbolToFlip = this.GetSymbolWhoseFlipMaximisesSatisfiedClauses(
                        new Converter <Sentence>().ListToSet(clauses),
                        symbolsInClause, myModel);
                    myModel = myModel.Flip(symbolToFlip);
                }
            }
            trials = numberOfFlips;
            return(null);
        }
コード例 #2
0
        public bool DPLLSatisfiable(Sentence s, Model m)
        {
            ISet <Sentence> clauses = new CNFClauseGatherer().GetClausesFrom(new CNFTransformer().Transform(s));
            IList <Symbol>  symbols = SymbolConverter.SetToList(new SymbolCollector().GetSymbolsIn(s));

            // System.out.println(" numberOfSymbols = " + symbols.Count);
            return(Dpll(clauses, symbols, m));
        }
コード例 #3
0
ファイル: DPLL.cs プロジェクト: claudiu04/AIMA.Net
        public bool dpllSatisfiable(Sentence s, Model m)
        {
            List <Sentence> clauses = new CNFClauseGatherer()
                                      .getClausesFrom(new CNFTransformer().transform(s));
            List <Symbol> symbols = new SymbolCollector()
                                    .getSymbolsIn(s);

            // System.Console.WriteLine(" numberOfSymbols = " + symbols.Count);
            return(dpll(clauses, symbols, m));
        }
コード例 #4
0
        public void testDPLLFilteringNonTrueClausesGivesNullWhenAllClausesAreKnown()
        {
            Model model = new Model();

            model = model.extend(new Symbol("A"), true).extend(new Symbol("B"),
                                                               true).extend(new Symbol("C"), true);
            Sentence sentence = (Sentence)parser
                                .parse("((A AND B) AND (B AND C))");
            List <Sentence> clauseList = new CNFClauseGatherer()
                                         .getClausesFrom(new CNFTransformer()
                                                         .transform(sentence));
            List <Sentence> clausesWithNonTrueValues = dpll
                                                       .clausesWithNonTrueValues(clauseList, model);

            Assert.AreEqual(0, clausesWithNonTrueValues.Count);
        }
コード例 #5
0
        public Model findModelFor(String logicalSentence, int numberOfFlips,
                                  double probabilityOfRandomWalk)
        {
            myModel = new Model();
            Sentence          s              = (Sentence) new PEParser().parse(logicalSentence);
            CNFTransformer    transformer    = new CNFTransformer();
            CNFClauseGatherer clauseGatherer = new CNFClauseGatherer();
            SymbolCollector   sc             = new SymbolCollector();

            List <Symbol> symbols = sc.getSymbolsIn(s);
            Random        r       = new Random();

            for (int i = 0; i < symbols.Count; i++)
            {
                Symbol sym = (Symbol)symbols[i];
                myModel = myModel.extend(sym, Util.randombool());
            }
            List <Sentence> clauses = clauseGatherer.getClausesFrom(transformer
                                                                    .transform(s));

            for (int i = 0; i < numberOfFlips; i++)
            {
                if (getNumberOfClausesSatisfiedIn(clauses, myModel) == clauses.Count)
                {
                    return(myModel);
                }
                Sentence clause = clauses[random.Next(clauses.Count)];

                List <Symbol> symbolsInClause = sc
                                                .getSymbolsIn(clause);
                if (random.NextDouble() >= probabilityOfRandomWalk)
                {
                    Symbol randomSymbol = symbolsInClause[random
                                                          .Next(symbolsInClause.Count)];
                    myModel = myModel.flip(randomSymbol);
                }
                else
                {
                    Symbol symbolToFlip = getSymbolWhoseFlipMaximisesSatisfiedClauses(
                        clauses,
                        symbolsInClause, myModel);
                    myModel = myModel.flip(symbolToFlip);
                }
            }
            return(null);
        }
コード例 #6
0
        public void testDPLLFindsPurePositiveSymbolsWhenTheyExist()
        {
            Model model = new Model();

            model = model.extend(new Symbol("A"), true).extend(new Symbol("B"),
                                                               true);
            Sentence sentence = (Sentence)parser
                                .parse("((A AND B) AND (B AND C))");
            List <Sentence> clauseList = new CNFClauseGatherer()
                                         .getClausesFrom(new CNFTransformer()
                                                         .transform(sentence));
            List <Symbol> symbolList = new SymbolCollector().getSymbolsIn(sentence);

            DPLL.SymbolValuePair sv = dpll.findPureSymbolValuePair(clauseList,
                                                                   model, symbolList);
            Assert.IsNotNull(sv);
            Assert.AreEqual(new Symbol("C"), sv.symbol);
            Assert.AreEqual(true, sv.value);
        }
コード例 #7
0
        public void testDPLLFiltersClausesTheStatusOfWhichAreKnown()
        {
            Model model = new Model();

            model = model.extend(new Symbol("A"), true).extend(new Symbol("B"),
                                                               true);
            Sentence sentence = (Sentence)parser
                                .parse("((A AND B) AND (B AND C))");
            List <Sentence> clauseList = new CNFClauseGatherer()
                                         .getClausesFrom(new CNFTransformer()
                                                         .transform(sentence));
            List <Sentence> clausesWithNonTrueValues = dpll
                                                       .clausesWithNonTrueValues(clauseList, model);

            Assert.AreEqual(1, clausesWithNonTrueValues.Count);
            Sentence nonTrueClause = (Sentence)parser.parse("(B AND C)");

            clausesWithNonTrueValues.Contains(nonTrueClause);
        }
コード例 #8
0
ファイル: PLResolution.cs プロジェクト: claudiu04/AIMA.Net
        public bool plResolution(KnowledgeBase kb, Sentence alpha)
        {
            Sentence kBAndNotAlpha = new BinarySentence("AND", kb.asSentence(),
                                                        new UnarySentence(alpha));
            List <Sentence> clauses = new CNFClauseGatherer()
                                      .getClausesFrom(new CNFTransformer().transform(kBAndNotAlpha));

            clauses = filterOutClausesWithTwoComplementaryLiterals(clauses);
            List <Sentence> newClauses = new List <Sentence>();

            while (true)
            {
                List <List <Sentence> > pairs = getCombinationPairs(clauses);

                for (int i = 0; i < pairs.Count; i++)
                {
                    List <Sentence> pair = pairs[i];
                    // System.Console.WriteLine("pair number" + i+" of "+pairs.Count);
                    List <Sentence> resolvents = plResolve(pair[0], pair[1]);
                    resolvents = filterOutClausesWithTwoComplementaryLiterals(resolvents);

                    if (resolvents.Contains(new Symbol("EMPTY_CLAUSE")))
                    {
                        return(true);
                    }
                    newClauses = SetOps.union(newClauses, resolvents);
                    // System.Console.WriteLine("clauseslist size = " +clauses.Count);
                }
                if (SetOps.intersection(newClauses, clauses).Count == newClauses
                    .Count)
                {// subset test
                    return(false);
                }
                clauses = SetOps.union(newClauses, clauses);
                clauses = filterOutClausesWithTwoComplementaryLiterals(clauses);
            }
        }
コード例 #9
0
        public bool PlResolution(KnowledgeBase kb, Sentence alpha)
        {
            Sentence kBAndNotAlpha = new BinarySentence("AND", kb.AsSentence(),
                                                        new UnarySentence(alpha));
            IList <Sentence> clauses = new CNFClauseGatherer()
                                       .GetClausesFrom(new CNFTransformer().Transform(kBAndNotAlpha)).ToList();

            clauses = this.FilterOutClausesWithTwoComplementaryLiterals(clauses);
            var newClauses = new List <Sentence>();

            while (true)
            {
                IList <IList <Sentence> > pairs = this.GetCombinationPairs(clauses.ToList());

                for (int i = 0; i < pairs.Count; i++)
                {
                    IList <Sentence> pair = pairs[i];
                    // System.out.println("pair number" + i+" of "+pairs.Count);
                    IList <Sentence> resolvents = this.PLResolve(pair[0], pair[1]);
                    resolvents = this.FilterOutClausesWithTwoComplementaryLiterals(resolvents);

                    if (resolvents.Contains(new Symbol("EMPTY_CLAUSE")))
                    {
                        return(true);
                    }
                    newClauses = newClauses.Union(resolvents).ToList();
                    // System.out.println("clauseslist size = " +clauses.Count);
                }
                if (newClauses.Intersect(clauses).Count() == newClauses.Count)
                {// subset test
                    return(false);
                }
                clauses = newClauses.Union(clauses).ToList();
                clauses = this.FilterOutClausesWithTwoComplementaryLiterals(clauses);
            }
        }
コード例 #10
0
 public void setUp()
 {
     parser   = new PEParser();
     gatherer = new CNFClauseGatherer();
 }