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; }
public void testAimaExample() { Sentence aimaEg = (Sentence)parser.parse("( B11 <=> (P12 OR P21))"); CNFTransformer transformer = new CNFTransformer(); Sentence transformed = transformer.transform(aimaEg); List<Sentence> clauses = gatherer.getClausesFrom(transformed); Sentence clause1 = (Sentence)parser.parse("( B11 OR ( NOT P12 ) )"); Sentence clause2 = (Sentence)parser.parse("( B11 OR ( NOT P21 ) )"); Sentence clause3 = (Sentence)parser .parse("( ( NOT B11 ) OR ( P12 OR P21 ) )"); Assert.AreEqual(3, clauses.Count); Assert.IsTrue(clauses.Contains(clause1)); Assert.IsTrue(clauses.Contains(clause2)); Assert.IsTrue(clauses.Contains(clause3)); }