package io.vivarium.ga;
import com.google.common.base.Preconditions;
import io.vivarium.core.Creature;
import io.vivarium.core.CreatureBlueprint;
import io.vivarium.core.GridWorld;
import io.vivarium.core.GridWorldBlueprint;
import io.vivarium.core.processor.NeuralNetworkBlueprint;
import io.vivarium.serialization.SerializationEngine;
public class TimeToExtinctionFF extends SimulationBasedFitnessFunction
{
private int _initialPopulation;
private GridWorldBlueprint _worldBlueprint;
private double _simulationDuration;
public TimeToExtinctionFF(GridWorldBlueprint worldBlueprint, int initialPopulation, int simulationDuration)
{
this._worldBlueprint = worldBlueprint;
this._initialPopulation = initialPopulation;
this._simulationDuration = simulationDuration;
}
@Override
public double evaluate(Creature c)
{
// Build world
GridWorldBlueprint instanceBlueprint = new SerializationEngine().makeCopy(_worldBlueprint);
Preconditions.checkArgument(instanceBlueprint.getCreatureBlueprints().size() == 1);
CreatureBlueprint instanceCreatureBlueprint = instanceBlueprint.getCreatureBlueprints().get(0);
NeuralNetworkBlueprint processorBlueprint = (NeuralNetworkBlueprint) instanceCreatureBlueprint
.getProcessorBlueprints()[0];
processorBlueprint.setMutationRateExponent(Double.NEGATIVE_INFINITY);
Creature instanceCreature = new Creature(instanceCreatureBlueprint, c);
GridWorld w = new GridWorld(instanceBlueprint);
for (int i = 0; i < _initialPopulation; i++)
{
w.addImmigrant(new Creature(instanceCreature));
}
// Run simulation
for (int i = 0; i < _simulationDuration; i++)
{
int count = w.getCreatureCount();
if (count == 0)
{
return i / _simulationDuration;
}
w.tick();
}
return 1.0;
}
}