distance = currentDistance;
}
}
}
if(nearestWolfAgent!=null){
Vector2D ownPosition = env.getAgentPosition(agent.id());
Vector2D targetPosition = env.getAgentPosition(nearestWolfAgent.id());
Vector2D direction = new Vector2D(-ownPosition.x+targetPosition.x,-ownPosition.y+targetPosition.y);
double angle = new Vector2D (0,-1).angle(direction)*180/Math.PI;
if (targetPosition.x<ownPosition.x){
result = 180-angle;
}
else{
result = 180+angle;
}
}
return result;
}
});
k.setEvolvable(true);
this.addSensor(k=new GenericSensor<Double, AbstractEnvironment2D<AbstractAgent2D<?>>, AbstractAgent2D<?>>() {
/**
*
*/
private static final long serialVersionUID = -5161883061160341340L;
@Override
public String id() {
return "sensing-sheep-distance";
}
@Override
public Double sense(AbstractEnvironment2D<AbstractAgent2D<?>> env, AbstractAgent2D<?> agent) {
Double result=MAX_DISTANCE;
double currentDistance;
for (AbstractAgent<?> agentX: env.getAgents() ){
if (agentX.id()>=10 && agentX.id()%2==0 && agentX.id()!=agent.id()){ //isSheep
currentDistance = env.getAgentPosition(agent.id()).distance(env.getAgentPosition(agentX.id()));
if (currentDistance < result) {
result = currentDistance;
}
}
}
return result;
}
});
k.setEvolvable(true);
this.addSensor(k=new GenericSensor<Double, AbstractEnvironment2D<AbstractAgent2D<?>>, AbstractAgent2D<?>>() {
/**
*
*/
private static final long serialVersionUID = -9131848570152436642L;
@Override
public String id() {
return "sensing-sheep-direction";
}
@Override
public Double sense(AbstractEnvironment2D<AbstractAgent2D<?>> env, AbstractAgent2D<?> agent) {
Double result= MAX_ANGLE;
AbstractAgent<?> nearestSheepAgent = null;
double distance = MAX_DISTANCE;
double currentDistance;
for (AbstractAgent<?> agentX: env.getAgents() ){
if (agentX.id()>=10 && agentX.id()%2==0 && agentX.id()!=agent.id()){ //isSheep
currentDistance = env.getAgentPosition(agent.id()).distance(env.getAgentPosition(agentX.id()));
if (currentDistance < distance) {
nearestSheepAgent = agentX;
distance = currentDistance;
}
}
}
if (nearestSheepAgent!=null){
Vector2D ownPosition = env.getAgentPosition(agent.id());
Vector2D targetPosition = env.getAgentPosition(nearestSheepAgent.id());
Vector2D direction = new Vector2D(-ownPosition.x+targetPosition.x,-ownPosition.y+targetPosition.y);
double angle = new Vector2D (0,-1).angle(direction)*180/Math.PI;
if (targetPosition.x<ownPosition.x){
result = 180-angle;
}
else{
result = 180+angle;
}
}
return result;
}
});
k.setEvolvable(true);
this.addActuator(new GenericActuator<CoEvolutionEnv, AbstractAgent2D<?>>() {
/**
*
*/
private static final long serialVersionUID = -7306285426125720370L;
@Override
public void actuate(CoEvolutionEnv env, AbstractAgent2D<?> agent) {
if(env.differentialDriveForward(agent.id())){
//no collision
} else{
env.unfallSimulation(env.getAgent(agent.id()),360);
}
}
@Override
public String id() {
return "drive";
}
});
this.shape = new Polygon2D();
this.shape.add(new Vector2D(-.5, -.5));
this.shape.add(new Vector2D(-.5, .5));
this.shape.add(new Vector2D(.5, .5));
this.shape.add(new Vector2D(.5, -.5));
}