import AIMath; public class Executor implements Runnable { protected GenerationsContainer gc; protected GenerationsGenerator gGen; protected boolean isFirst; public Executor(GenerationsGenerator gg) { System.out.println("Executor initialized"); gGen=gg; reset(); } public void reset() { System.out.println("Executor has been reset"); gc=new GenerationsContainer(); isFirst=true; } public GenerationsGenerator getGenerationsGenerator() { return gGen; } protected Generation getNextGeneration() { if (isFirst) { //System.out.println("Generating initial generation"); isFirst=false; return gGen.getInitialGeneration(); } else { //System.out.println("Generating offspring"); try { Generation last=gc.getLastGeneration(); return gGen.getNextGeneration(last); } catch (EmptyException e) { System.out.println("Coding error in Executor.getNextGeneration()"); } } //System.out.println("Problem code reached bad point in Executor.getNextGeneration()"); return null; //should not reach here } public void run() { //System.out.println("Reached run()"); Generation currGen; int fitnesses[]; for(;;) { currGen=getNextGeneration(); gc.addGeneration(currGen); //unused debug code //System.out.println("********************************************"); //System.out.println("Generation #"+gc.getLastGenerationNumber()); //fitnesses=currGen.getFitnessArray(); //System.out.println("Average fitness="+AIMath.average(fitnesses)); //System.out.println("Maximum fitness="+AIMath.maximum(fitnesses)); } } public GenerationsContainer getGenerationsContainer() { return gc; } }