package aima.core.environment.wumpusworld;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import aima.core.search.framework.evalfunc.HeuristicFunction;
/**
* Heuristic for calculating the Manhattan distance between two rooms within a Wumpus World cave.
*
* @author Federico Baron
* @author Alessandro Daniele
* @author Ciaran O'Reilly
*/
public class ManhattanHeuristicFunction implements HeuristicFunction {
List<Room> goals = new ArrayList<Room>();
public ManhattanHeuristicFunction(Set<Room> goals) {
this.goals.addAll(goals);
}
@Override
public double h(Object state) {
AgentPosition pos = (AgentPosition) state;
int nearestGoalDist = Integer.MAX_VALUE;
for (Room g : goals) {
int tmp = evaluateManhattanDistanceOf(pos.getX(), pos.getY(), g.getX(), g.getY());
if (tmp < nearestGoalDist) {
nearestGoalDist = tmp;
}
}
return nearestGoalDist;
}
//
// PRIVATE
//
private int evaluateManhattanDistanceOf(int x1, int y1, int x2, int y2) {
return Math.abs(x1-x2) + Math.abs(y1-y2);
}
}