package rescuecore2.standard.score;
import rescuecore2.score.AbstractScoreFunction;
import rescuecore2.worldmodel.WorldModel;
import rescuecore2.worldmodel.Entity;
import rescuecore2.Timestep;
import rescuecore2.standard.entities.StandardWorldModel;
import rescuecore2.standard.entities.Human;
import rescuecore2.standard.entities.FireBrigade;
import rescuecore2.standard.entities.PoliceForce;
import rescuecore2.standard.entities.AmbulanceTeam;
import rescuecore2.standard.misc.AgentPath;
/**
A score function that measures the distance travelled by all agents.
*/
public class DistanceTravelledScoreFunction extends AbstractScoreFunction {
/**
Construct a DistanceTravelledScoreFunction.
*/
public DistanceTravelledScoreFunction() {
super("Distance travelled");
}
@Override
public double score(WorldModel<? extends Entity> world, Timestep timestep) {
StandardWorldModel model = StandardWorldModel.createStandardWorldModel(world);
// Find out how far each agent moved
double sum = 0;
for (Entity next : model) {
if (next instanceof FireBrigade
|| next instanceof PoliceForce
|| next instanceof AmbulanceTeam) {
Human h = (Human)next;
AgentPath path = AgentPath.computePath(h, model);
if (path != null) {
sum += path.getLength();
}
}
}
System.out.println("Total distance travelled: " + sum);
return sum;
}
}