package aima.gui.fx.applications.agent;
import java.util.Arrays;
import java.util.List;
import aima.core.agent.impl.AbstractAgent;
import aima.core.environment.vacuum.FullyObservableVacuumEnvironmentPerceptToStateFunction;
import aima.core.environment.vacuum.ModelBasedReflexVacuumAgent;
import aima.core.environment.vacuum.NondeterministicVacuumAgent;
import aima.core.environment.vacuum.NondeterministicVacuumEnvironment;
import aima.core.environment.vacuum.ReflexVacuumAgent;
import aima.core.environment.vacuum.SimpleReflexVacuumAgent;
import aima.core.environment.vacuum.TableDrivenVacuumAgent;
import aima.core.environment.vacuum.VacuumEnvironment;
import aima.core.environment.vacuum.VacuumWorldActions;
import aima.core.environment.vacuum.VacuumWorldGoalTest;
import aima.core.environment.vacuum.VacuumWorldResults;
import aima.core.search.framework.problem.DefaultStepCostFunction;
import aima.core.search.nondeterministic.NondeterministicProblem;
import aima.core.util.CancelableThread;
import aima.gui.fx.framework.IntegrableApplication;
import aima.gui.fx.framework.Parameter;
import aima.gui.fx.framework.SimulationPaneBuilder;
import aima.gui.fx.framework.SimulationPaneCtrl;
import aima.gui.fx.views.SimpleEnvironmentViewCtrl;
import aima.gui.fx.views.VacuumEnvironmentViewCtrl;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
/**
* Integrable application which demonstrates how different kinds of vacuum
* cleaner agents behave in a two square environment.
*
* @author Ruediger Lunde
*/
public class VacuumAgentApp extends IntegrableApplication {
public static void main(String[] args) {
launch(args);
}
public final static String PARAM_ENV = "environment";
public final static String PARAM_AGENT = "agent";
private SimulationPaneCtrl simPaneCtrl;
private SimpleEnvironmentViewCtrl envViewCtrl;
protected VacuumEnvironment env = null;
protected AbstractAgent agent = null;
public VacuumAgentApp() {
}
@Override
public String getTitle() {
return "Vacuum Agent App";
}
/**
* Defines state view, parameters, and call-back functions and calls the
* simulation pane builder to create layout and controller objects.
*/
@Override
public Pane createRootPane() {
BorderPane root = new BorderPane();
StackPane envView = new StackPane();
envViewCtrl = new VacuumEnvironmentViewCtrl(envView);
List<Parameter> params = createParameters();
SimulationPaneBuilder builder = new SimulationPaneBuilder();
builder.defineParameters(params);
builder.defineStateView(envView);
builder.defineInitMethod(this::initialize);
builder.defineSimMethod(this::simulate);
simPaneCtrl = builder.getResultFor(root);
return root;
}
protected List<Parameter> createParameters() {
Parameter p1 = new Parameter(PARAM_ENV, "A/B Deterministic Environment", "A/B Non-Deterministic Environment");
Parameter p2 = new Parameter(PARAM_AGENT, "TableDrivenVacuumAgent", "ReflexVacuumAgent",
"SimpleReflexVacuumAgent", "ModelBasedReflexVacuumAgent", "NondeterministicVacuumAgent");
return Arrays.asList(p1, p2);
}
/**
* Is called after each parameter selection change.
*/
@Override
public void initialize() {
switch (simPaneCtrl.getParamValueIndex(PARAM_ENV)) {
case 0:
env = new VacuumEnvironment();
break;
case 1:
env = new NondeterministicVacuumEnvironment();
break;
}
agent = null;
switch (simPaneCtrl.getParamValueIndex(PARAM_AGENT)) {
case 0:
agent = new TableDrivenVacuumAgent();
break;
case 1:
agent = new ReflexVacuumAgent();
break;
case 2:
agent = new SimpleReflexVacuumAgent();
break;
case 3:
agent = new ModelBasedReflexVacuumAgent();
break;
case 4:
agent = createNondeterministicVacuumAgent();
break;
}
if (env != null && agent != null) {
envViewCtrl.initialize(env);
env.addEnvironmentView(envViewCtrl);
env.addAgent(agent);
if (agent instanceof NondeterministicVacuumAgent) {
// Set the problem now for this kind of agent
((NondeterministicVacuumAgent) agent).setProblem(createNondeterministicProblem());
}
}
}
/**
* Starts the experiment.
*/
public void simulate() {
while (!env.isDone() && !CancelableThread.currIsCanceled()) {
env.step();
simPaneCtrl.setStatus("Performance=" + env.getPerformanceMeasure(agent));
simPaneCtrl.waitAfterStep();
}
envViewCtrl.notify("Performance=" + env.getPerformanceMeasure(agent));
}
@Override
public void cleanup() {
simPaneCtrl.cancelSimulation();
}
// helper methods...
private NondeterministicVacuumAgent createNondeterministicVacuumAgent() {
return new NondeterministicVacuumAgent(
new FullyObservableVacuumEnvironmentPerceptToStateFunction());
}
private NondeterministicProblem createNondeterministicProblem() {
return new NondeterministicProblem(env.getCurrentState(), new VacuumWorldActions(),
new VacuumWorldResults(agent), new VacuumWorldGoalTest(agent), new DefaultStepCostFunction());
}
}