package aima.test.core.unit.search.online;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import aima.core.agent.Action;
import aima.core.agent.Agent;
import aima.core.agent.EnvironmentState;
import aima.core.agent.EnvironmentView;
import aima.core.environment.map.ExtendableMap;
import aima.core.environment.map.MapEnvironment;
import aima.core.environment.map.MapFunctionFactory;
import aima.core.environment.map.MapStepCostFunction;
import aima.core.search.framework.DefaultGoalTest;
import aima.core.search.framework.HeuristicFunction;
import aima.core.search.online.LRTAStarAgent;
import aima.core.search.online.OnlineSearchProblem;
public class LRTAStarAgentTest {
ExtendableMap aMap;
StringBuffer envChanges;
HeuristicFunction hf;
@Before
public void setUp() {
aMap = new ExtendableMap();
aMap.addBidirectionalLink("A", "B", 4.0);
aMap.addBidirectionalLink("B", "C", 4.0);
aMap.addBidirectionalLink("C", "D", 4.0);
aMap.addBidirectionalLink("D", "E", 4.0);
aMap.addBidirectionalLink("E", "F", 4.0);
hf = new HeuristicFunction() {
public double h(Object state) {
return 1;
}
};
envChanges = new StringBuffer();
}
@Test
public void testAlreadyAtGoal() {
MapEnvironment me = new MapEnvironment(aMap);
LRTAStarAgent agent = new LRTAStarAgent(new OnlineSearchProblem(
MapFunctionFactory.getActionsFunction(aMap),
new DefaultGoalTest("A"), new MapStepCostFunction(aMap)),
MapFunctionFactory.getPerceptToStateFunction(), hf);
me.addAgent(agent, "A");
me.addEnvironmentView(new TestEnvironmentView());
me.stepUntilDone();
Assert.assertEquals("Action[name==NoOp]->", envChanges.toString());
}
@Test
public void testNormalSearch() {
MapEnvironment me = new MapEnvironment(aMap);
LRTAStarAgent agent = new LRTAStarAgent(new OnlineSearchProblem(
MapFunctionFactory.getActionsFunction(aMap),
new DefaultGoalTest("F"), new MapStepCostFunction(aMap)),
MapFunctionFactory.getPerceptToStateFunction(), hf);
me.addAgent(agent, "A");
me.addEnvironmentView(new TestEnvironmentView());
me.stepUntilDone();
Assert.assertEquals(
"Action[name==moveTo, location==B]->Action[name==moveTo, location==A]->Action[name==moveTo, location==B]->Action[name==moveTo, location==C]->Action[name==moveTo, location==B]->Action[name==moveTo, location==C]->Action[name==moveTo, location==D]->Action[name==moveTo, location==C]->Action[name==moveTo, location==D]->Action[name==moveTo, location==E]->Action[name==moveTo, location==D]->Action[name==moveTo, location==E]->Action[name==moveTo, location==F]->Action[name==NoOp]->",
envChanges.toString());
}
@Test
public void testNoPath() {
MapEnvironment me = new MapEnvironment(aMap);
LRTAStarAgent agent = new LRTAStarAgent(new OnlineSearchProblem(
MapFunctionFactory.getActionsFunction(aMap),
new DefaultGoalTest("G"), new MapStepCostFunction(aMap)),
MapFunctionFactory.getPerceptToStateFunction(), hf);
me.addAgent(agent, "A");
me.addEnvironmentView(new TestEnvironmentView());
// Note: Will search forever if no path is possible,
// Therefore restrict the number of steps to something
// reasonablbe, against which to test.
me.step(14);
Assert.assertEquals(
"Action[name==moveTo, location==B]->Action[name==moveTo, location==A]->Action[name==moveTo, location==B]->Action[name==moveTo, location==C]->Action[name==moveTo, location==B]->Action[name==moveTo, location==C]->Action[name==moveTo, location==D]->Action[name==moveTo, location==C]->Action[name==moveTo, location==D]->Action[name==moveTo, location==E]->Action[name==moveTo, location==D]->Action[name==moveTo, location==E]->Action[name==moveTo, location==F]->Action[name==moveTo, location==E]->",
envChanges.toString());
}
private class TestEnvironmentView implements EnvironmentView {
public void notify(String msg) {
envChanges.append(msg).append("->");
}
public void agentAdded(Agent agent, EnvironmentState state) {
// Nothing.
}
public void agentActed(Agent agent, Action action,
EnvironmentState state) {
envChanges.append(action).append("->");
}
}
}