package aima.gui.demo.search;
import java.math.BigDecimal;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import aima.core.agent.Action;
import aima.core.environment.nqueens.AttackingPairsHeuristic;
import aima.core.environment.nqueens.NQueensBoard;
import aima.core.environment.nqueens.NQueensBoard.Config;
import aima.core.environment.nqueens.NQueensFunctionFactory;
import aima.core.environment.nqueens.NQueensGenAlgoUtil;
import aima.core.environment.nqueens.NQueensGoalTest;
import aima.core.search.framework.SearchAgent;
import aima.core.search.framework.SearchForActions;
import aima.core.search.framework.problem.GoalTest;
import aima.core.search.framework.problem.Problem;
import aima.core.search.framework.qsearch.GraphSearch;
import aima.core.search.framework.qsearch.TreeSearch;
import aima.core.search.local.FitnessFunction;
import aima.core.search.local.GeneticAlgorithm;
import aima.core.search.local.HillClimbingSearch;
import aima.core.search.local.Individual;
import aima.core.search.local.Scheduler;
import aima.core.search.local.SimulatedAnnealingSearch;
import aima.core.search.uninformed.BreadthFirstSearch;
import aima.core.search.uninformed.DepthFirstSearch;
import aima.core.search.uninformed.DepthLimitedSearch;
import aima.core.search.uninformed.IterativeDeepeningSearch;
/**
* @author Ravi Mohan
*
*/
public class NQueensDemo {
private static final int boardSize = 8;
public static void main(String[] args) {
newNQueensDemo();
}
private static void newNQueensDemo() {
nQueensWithDepthFirstSearch();
nQueensWithBreadthFirstSearch();
nQueensWithRecursiveDLS();
nQueensWithIterativeDeepeningSearch();
nQueensSimulatedAnnealingSearch();
nQueensHillClimbingSearch();
nQueensGeneticAlgorithmSearch();
}
private static void nQueensWithRecursiveDLS() {
System.out.println("\nNQueensDemo recursive DLS -->");
try {
Problem problem = new Problem(new NQueensBoard(boardSize), NQueensFunctionFactory.getIActionsFunction(),
NQueensFunctionFactory.getResultFunction(), new NQueensGoalTest());
SearchForActions search = new DepthLimitedSearch(boardSize);
SearchAgent agent = new SearchAgent(problem, search);
printActions(agent.getActions());
printInstrumentation(agent.getInstrumentation());
} catch (Exception e) {
e.printStackTrace();
}
}
private static void nQueensWithBreadthFirstSearch() {
try {
System.out.println("\nNQueensDemo BFS -->");
Problem problem = new Problem(new NQueensBoard(boardSize), NQueensFunctionFactory.getIActionsFunction(),
NQueensFunctionFactory.getResultFunction(), new NQueensGoalTest());
SearchForActions search = new BreadthFirstSearch(new TreeSearch());
SearchAgent agent = new SearchAgent(problem, search);
printActions(agent.getActions());
printInstrumentation(agent.getInstrumentation());
} catch (Exception e) {
e.printStackTrace();
}
}
private static void nQueensWithDepthFirstSearch() {
System.out.println("\nNQueensDemo DFS -->");
try {
Problem problem = new Problem(new NQueensBoard(boardSize), NQueensFunctionFactory.getIActionsFunction(),
NQueensFunctionFactory.getResultFunction(), new NQueensGoalTest());
SearchForActions search = new DepthFirstSearch(new GraphSearch());
SearchAgent agent = new SearchAgent(problem, search);
printActions(agent.getActions());
printInstrumentation(agent.getInstrumentation());
} catch (Exception e) {
e.printStackTrace();
}
}
private static void nQueensWithIterativeDeepeningSearch() {
System.out.println("\nNQueensDemo Iterative DS -->");
try {
Problem problem = new Problem(new NQueensBoard(boardSize), NQueensFunctionFactory.getIActionsFunction(),
NQueensFunctionFactory.getResultFunction(), new NQueensGoalTest());
SearchForActions search = new IterativeDeepeningSearch();
SearchAgent agent = new SearchAgent(problem, search);
System.out.println();
printActions(agent.getActions());
printInstrumentation(agent.getInstrumentation());
} catch (Exception e) {
e.printStackTrace();
}
}
private static void nQueensSimulatedAnnealingSearch() {
System.out.println("\nNQueensDemo Simulated Annealing -->");
try {
Problem problem = new Problem(new NQueensBoard(boardSize, Config.QUEENS_IN_FIRST_ROW),
NQueensFunctionFactory.getCActionsFunction(), NQueensFunctionFactory.getResultFunction(),
new NQueensGoalTest());
SimulatedAnnealingSearch search = new SimulatedAnnealingSearch(new AttackingPairsHeuristic(),
new Scheduler(20, 0.045, 100));
SearchAgent agent = new SearchAgent(problem, search);
System.out.println();
printActions(agent.getActions());
System.out.println("Search Outcome=" + search.getOutcome());
System.out.println("Final State=\n" + search.getLastSearchState());
printInstrumentation(agent.getInstrumentation());
} catch (Exception e) {
e.printStackTrace();
}
}
private static void nQueensHillClimbingSearch() {
System.out.println("\nNQueensDemo HillClimbing -->");
try {
Problem problem = new Problem(new NQueensBoard(boardSize, Config.QUEENS_IN_FIRST_ROW),
NQueensFunctionFactory.getCActionsFunction(), NQueensFunctionFactory.getResultFunction(),
new NQueensGoalTest());
HillClimbingSearch search = new HillClimbingSearch(new AttackingPairsHeuristic());
SearchAgent agent = new SearchAgent(problem, search);
System.out.println();
printActions(agent.getActions());
System.out.println("Search Outcome=" + search.getOutcome());
System.out.println("Final State=\n" + search.getLastSearchState());
printInstrumentation(agent.getInstrumentation());
} catch (Exception e) {
e.printStackTrace();
}
}
private static void nQueensGeneticAlgorithmSearch() {
System.out.println("\nNQueensDemo GeneticAlgorithm -->");
try {
FitnessFunction<Integer> fitnessFunction = NQueensGenAlgoUtil.getFitnessFunction();
GoalTest goalTest = NQueensGenAlgoUtil.getGoalTest();
// Generate an initial population
Set<Individual<Integer>> population = new HashSet<>();
for (int i = 0; i < 50; i++) {
population.add(NQueensGenAlgoUtil.generateRandomIndividual(boardSize));
}
GeneticAlgorithm<Integer> ga = new GeneticAlgorithm<>(boardSize,
NQueensGenAlgoUtil.getFiniteAlphabetForBoardOfSize(boardSize), 0.15);
// Run for a set amount of time
Individual<Integer> bestIndividual = ga.geneticAlgorithm(population, fitnessFunction, goalTest, 1000L);
System.out.println("Max Time (1 second) Best Individual=\n"
+ NQueensGenAlgoUtil.getBoardForIndividual(bestIndividual));
System.out.println("Board Size = " + boardSize);
System.out.println("# Board Layouts = " + (new BigDecimal(boardSize)).pow(boardSize));
System.out.println("Fitness = " + fitnessFunction.apply(bestIndividual));
System.out.println("Is Goal = " + goalTest.isGoalState(bestIndividual));
System.out.println("Population Size = " + ga.getPopulationSize());
System.out.println("Itertions = " + ga.getIterations());
System.out.println("Took = " + ga.getTimeInMilliseconds() + "ms.");
// Run till goal is achieved
bestIndividual = ga.geneticAlgorithm(population, fitnessFunction, goalTest, 0L);
System.out.println("");
System.out
.println("Goal Test Best Individual=\n" + NQueensGenAlgoUtil.getBoardForIndividual(bestIndividual));
System.out.println("Board Size = " + boardSize);
System.out.println("# Board Layouts = " + (new BigDecimal(boardSize)).pow(boardSize));
System.out.println("Fitness = " + fitnessFunction.apply(bestIndividual));
System.out.println("Is Goal = " + goalTest.isGoalState(bestIndividual));
System.out.println("Population Size = " + ga.getPopulationSize());
System.out.println("Itertions = " + ga.getIterations());
System.out.println("Took = " + ga.getTimeInMilliseconds() + "ms.");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void printInstrumentation(Properties properties) {
for (Object o : properties.keySet()) {
String key = (String) o;
String property = properties.getProperty(key);
System.out.println(key + " : " + property);
}
}
private static void printActions(List<Action> actions) {
for (Action action : actions) {
System.out.println(action.toString());
}
}
}