public static void main(String[] args) throws Exception {
    if (args.length != 1) {
      System.out.println("Error: require exactly 1 argument.");
      System.out.println(GP_USAGE);
      System.exit(1);
    }
    configFile = args[0];

    /** Input data from config file. Fixed name here. */
    GPConfig.loadConfig(new BufferedReader(new FileReader(configFile)));

    myPop = GPConfig.getPopType().newInstance();

    int numGens = GPConfig.getNumGens();

    GPCreature curBest = null;
    myPop.computeFitnesses();
    for (int i = 0; i < numGens; i++) {

      myPop.evolveNextGeneration();
      myPop.computeFitnesses();

      curBest = myPop.getBestCreature();

      System.out.println("GENERATION NUMBER: " + i);
      System.out.println("BEST FITNESS     : " + String.format("%1$,.4f", curBest.getFitness()));
      System.out.println();
    }

    GPCreature best = myPop.getBestCreature();
    System.out.println("Best creature height=" + best.getTree().getHeight());

    /** Output best creature to dot file */
    String dot = best.getTree().toDot("Best function");
    FileWriter fw = null;
    fw = new FileWriter(GPConfig.getOutputDir() + "/best.dot");
    fw.write(dot);
    fw.close();

    /** Output header file */
    System.out.println("Writing header to " + GPConfig.getHeaderFile());
    fw = new FileWriter(GPConfig.getOutputDir() + "/" + GPConfig.getHeaderFile());
    fw.write(myPop.getHeader());
    fw.close();

    /** Output short info file */
    if (GPConfig.outputShort()) {
      System.out.println("Writing short info to " + GPConfig.getShortInfoFile());
      fw = new FileWriter(GPConfig.getOutputDir() + "/" + GPConfig.getShortInfoFile());
      List<String> shortInfo = myPop.getShortGenInfo();
      for (String row : shortInfo) fw.write(row + "\n");
      fw.close();
    }

    /** Output final info file */
    if (GPConfig.outputFinalGen()) {
      System.out.println("Writing final gen info to " + GPConfig.getFinalGenFile());
      fw = new FileWriter(GPConfig.getOutputDir() + "/" + GPConfig.getShortInfoFile());
      for (String row : myPop.getFinalGenInfo()) fw.write(row + "\n");
      fw.close();
    }
  }
 public ERCNode() {
   value = GPConfig.getRandGen().nextDouble() * 4.0 - 2.0;
 }