package aima.test.core.unit.search.framework; import java.util.HashSet; import java.util.List; import java.util.Set; import org.junit.Assert; import org.junit.Test; import aima.core.agent.Action; import aima.core.environment.map.Map; import aima.core.environment.map.MapFunctionFactory; import aima.core.environment.map.MapStepCostFunction; import aima.core.environment.map.SimplifiedRoadMapOfPartOfRomania; import aima.core.search.framework.GraphSearch; import aima.core.search.framework.Problem; import aima.core.search.framework.Search; import aima.core.search.framework.SearchAgent; import aima.core.search.framework.SolutionChecker; import aima.core.search.uninformed.BreadthFirstSearch; public class SolutionCheckerTest { @Test public void testMultiGoalProblem() throws Exception { Map romaniaMap = new SimplifiedRoadMapOfPartOfRomania(); Problem problem = new Problem(SimplifiedRoadMapOfPartOfRomania.ARAD, MapFunctionFactory.getActionsFunction(romaniaMap), MapFunctionFactory.getResultFunction(), new DualMapGoalTest( SimplifiedRoadMapOfPartOfRomania.BUCHAREST, SimplifiedRoadMapOfPartOfRomania.HIRSOVA), new MapStepCostFunction(romaniaMap)); Search search = new BreadthFirstSearch(new GraphSearch()); SearchAgent agent = new SearchAgent(problem, search); Assert.assertEquals( "[Action[name==moveTo, location==Sibiu], Action[name==moveTo, location==Fagaras], Action[name==moveTo, location==Bucharest], Action[name==moveTo, location==Urziceni], Action[name==moveTo, location==Hirsova]]", agent.getActions().toString()); Assert.assertEquals(5, agent.getActions().size()); Assert.assertEquals("14", agent.getInstrumentation().getProperty("nodesExpanded")); Assert.assertEquals("1", agent.getInstrumentation().getProperty("queueSize")); Assert.assertEquals("5", agent.getInstrumentation().getProperty("maxQueueSize")); } class DualMapGoalTest implements SolutionChecker { public String goalState1 = null; public String goalState2 = null; private Set<String> goals = new HashSet<String>(); public DualMapGoalTest(String goalState1, String goalState2) { this.goalState1 = goalState1; this.goalState2 = goalState2; goals.add(goalState1); goals.add(goalState2); } public boolean isGoalState(Object state) { return goalState1.equals(state) || goalState2.equals(state); } public boolean isAcceptableSolution(List<Action> actions, Object goal) { goals.remove(goal); return goals.isEmpty(); } } }