All Downloads are FREE. Search and download functionalities are using the official Maven repository.

aima.core.environment.vacuum.VacuumWorldResults Maven / Gradle / Ivy

Go to download

AIMA-Java Core Algorithms from the book Artificial Intelligence a Modern Approach 3rd Ed.

The newest version!
package aima.core.environment.vacuum;

import java.util.LinkedHashSet;
import java.util.Set;

import aima.core.agent.Action;
import aima.core.agent.Agent;
import aima.core.search.nondeterministic.ResultsFunction;

/**
 * Returns possible results
 * 
 * @author Andrew Brown
 */
public class VacuumWorldResults implements ResultsFunction {

	private Agent agent;

	/**
	 * Constructor
	 * 
	 * @param agent
	 */
	public VacuumWorldResults(Agent agent) {
		this.agent = agent;
	}

	/**
	 * Returns a list of possible results for a given state and action
	 * 
	 * @param state
	 * @param action
	 * @return a list of possible results for a given state and action.
	 */
	@Override
	public Set results(Object state, Action action) {
		// setup
		VacuumEnvironmentState vacEnvState = (VacuumEnvironmentState) state;
		// Ensure order is consistent across platforms.
		Set results = new LinkedHashSet();
		String currentLocation = vacEnvState.getAgentLocation(agent);
		String adjacentLocation = (currentLocation
				.equals(VacuumEnvironment.LOCATION_A)) ? VacuumEnvironment.LOCATION_B
				: VacuumEnvironment.LOCATION_A;
		// case: move right
		if (VacuumEnvironment.ACTION_MOVE_RIGHT == action) {
			VacuumEnvironmentState s = new VacuumEnvironmentState();
			s.setLocationState(currentLocation,
					vacEnvState.getLocationState(currentLocation));
			s.setLocationState(adjacentLocation,
					vacEnvState.getLocationState(adjacentLocation));
			s.setAgentLocation(this.agent, VacuumEnvironment.LOCATION_B);
			results.add(s);
		} // case: move left
		else if (VacuumEnvironment.ACTION_MOVE_LEFT == action) {
			VacuumEnvironmentState s = new VacuumEnvironmentState();
			s.setLocationState(currentLocation,
					vacEnvState.getLocationState(currentLocation));
			s.setLocationState(adjacentLocation,
					vacEnvState.getLocationState(adjacentLocation));
			s.setAgentLocation(this.agent, VacuumEnvironment.LOCATION_A);
			results.add(s);
		} // case: suck
		else if (VacuumEnvironment.ACTION_SUCK == action) {
			// case: square is dirty
			if (VacuumEnvironment.LocationState.Dirty == vacEnvState
					.getLocationState(vacEnvState.getAgentLocation(this.agent))) {
				// always clean current
				VacuumEnvironmentState s1 = new VacuumEnvironmentState();
				s1.setLocationState(currentLocation,
						VacuumEnvironment.LocationState.Clean);
				s1.setLocationState(adjacentLocation,
						vacEnvState.getLocationState(adjacentLocation));
				s1.setAgentLocation(this.agent, currentLocation);
				results.add(s1);
				// sometimes clean adjacent as well
				VacuumEnvironmentState s2 = new VacuumEnvironmentState();
				s2.setLocationState(currentLocation,
						VacuumEnvironment.LocationState.Clean);
				s2.setLocationState(adjacentLocation,
						VacuumEnvironment.LocationState.Clean);
				s2.setAgentLocation(this.agent, currentLocation);
				results.add(s2);
			} // case: square is clean
			else {
				// sometimes do nothing
				VacuumEnvironmentState s1 = new VacuumEnvironmentState();
				s1.setLocationState(currentLocation,
						vacEnvState.getLocationState(currentLocation));
				s1.setLocationState(adjacentLocation,
						vacEnvState.getLocationState(adjacentLocation));
				s1.setAgentLocation(this.agent, currentLocation);
				results.add(s1);
				// sometimes deposit dirt
				VacuumEnvironmentState s2 = new VacuumEnvironmentState();
				s2.setLocationState(currentLocation,
						VacuumEnvironment.LocationState.Dirty);
				s2.setLocationState(adjacentLocation,
						vacEnvState.getLocationState(adjacentLocation));
				s2.setAgentLocation(this.agent, currentLocation);
				results.add(s2);
			}
		} else if (action.isNoOp()) {
			// do nothing
		}
		return results;
	}
}