package rescuecore2.standard.score;
import rescuecore2.score.AbstractScoreFunction;
import rescuecore2.config.Config;
import rescuecore2.worldmodel.WorldModel;
import rescuecore2.worldmodel.Entity;
import rescuecore2.worldmodel.EntityID;
import rescuecore2.worldmodel.ChangeSet;
import rescuecore2.Timestep;
import java.util.Set;
import java.util.HashSet;
import rescuecore2.standard.entities.Civilian;
import rescuecore2.standard.entities.FireBrigade;
import rescuecore2.standard.entities.AmbulanceTeam;
import rescuecore2.standard.entities.PoliceForce;
/**
Score function that measures how quickly civilians are discovered by agents.
*/
public class DiscoveryScoreFunction extends AbstractScoreFunction {
private Set<EntityID> found;
/**
Construct a DiscoveryScoreFunction.
*/
public DiscoveryScoreFunction() {
super("Civilian discovery time");
}
@Override
public void initialise(WorldModel<? extends Entity> world, Config config) {
found = new HashSet<EntityID>();
}
@Override
public double score(WorldModel<? extends Entity> world, Timestep timestep) {
double sum = 0;
// Look for agents that observed a civilian
for (EntityID next : timestep.getAgentsWithUpdates()) {
Entity agent = world.getEntity(next);
// Only platoon agents can discover civilians
if (!isPlatoonAgent(agent)) {
continue;
}
ChangeSet perception = timestep.getAgentPerception(next);
for (EntityID observedID : perception.getChangedEntities()) {
// Is it already seen?
if (found.contains(observedID)) {
continue;
}
Entity e = world.getEntity(observedID);
if (e instanceof Civilian && !perception.getChangedProperties(observedID).isEmpty()) {
// Seen a new civilian with at least one updated property.
found.add(observedID);
sum += timestep.getTime();
}
}
}
return sum;
}
private boolean isPlatoonAgent(Entity e) {
return e instanceof FireBrigade
|| e instanceof PoliceForce
|| e instanceof AmbulanceTeam;
}
}