examples.gp.monalisa.gui.EvolutionRunnable.java Source code

Java tutorial

Introduction

Here is the source code for examples.gp.monalisa.gui.EvolutionRunnable.java

Source

/*
 * This file is part of JGAP.
 *
 * JGAP offers a dual license model containing the LGPL as well as the MPL.
 *
 * For licensing information please see the file license.txt included with JGAP
 * or have a look at the top of class org.jgap.Chromosome which representatively
 * includes the JGAP license policy applicable for any file delivered with JGAP.
 */
package examples.gp.monalisa.gui;

import java.awt.*;
import java.awt.image.*;
import org.apache.log4j.*;
import org.jfree.chart.*;
import org.jfree.data.xy.*;
import org.jgap.*;
import org.jgap.event.*;
import org.jgap.gp.*;
import org.jgap.gp.impl.*;
import org.jgap.util.*;
import examples.gp.monalisa.core.*;

/**
 * Class in charge of actually running the evolution process.
 *
 * @author Yann N. Dauphin
 * @since 3.4
 */
public class EvolutionRunnable implements Runnable {
    /** String containing the CVS revision. Read out via reflection!*/
    private final static String CVS_REVISION = "$Revision: 1.4 $";

    private transient static Logger LOGGER = Logger.getLogger(EvolutionRunnable.class);

    protected final GeneticDrawingView m_view;

    protected static boolean initView;

    public EvolutionRunnable(GeneticDrawingView a_view) {
        super();
        m_view = a_view;
    }

    public void run() {
        Configuration.reset();
        try {
            final DrawingGPConfiguration conf = new DrawingGPConfiguration(m_view.getTargetImage());
            JFreeChart chart = m_view.getChart();
            XYSeriesCollection sc = (XYSeriesCollection) chart.getXYPlot().getDataset();
            XYSeries series = sc.getSeries(0);
            series.clear();
            IEventManager eventManager = conf.getEventManager();
            eventManager.addEventListener(GeneticEvent.GPGENOTYPE_EVOLVED_EVENT, new GeneticEventListener() {
                /**
                 * Updates the chart in the main view.
                 *
                 * @param a_firedEvent the event
                 */
                public void geneticEventFired(GeneticEvent a_firedEvent) {
                    GPGenotype genotype = (GPGenotype) a_firedEvent.getSource();
                    int evno = genotype.getGPConfiguration().getGenerationNr();
                    if (evno % 25 == 0) {
                        double bestFitness = genotype.getFittestProgram().getFitnessValue();
                        JFreeChart chart = m_view.getChart();
                        XYSeriesCollection sc = (XYSeriesCollection) chart.getXYPlot().getDataset();
                        XYSeries series = sc.getSeries(0);
                        series.add(evno, bestFitness);
                    }
                }
            });
            eventManager.addEventListener(GeneticEvent.GPGENOTYPE_NEW_BEST_SOLUTION, new GeneticEventListener() {
                private transient Logger LOGGER2 = Logger.getLogger(EvolutionRunnable.class);
                private DrawingGPProgramRunner gpProgramRunner = new DrawingGPProgramRunner(conf);

                /**
                 * Display best solution in fittestChromosomeView's mainPanel.
                 *
                 * @param a_firedEvent the event
                 */
                public void geneticEventFired(GeneticEvent a_firedEvent) {
                    GPGenotype genotype = (GPGenotype) a_firedEvent.getSource();
                    IGPProgram best = genotype.getAllTimeBest();
                    ApplicationData data = (ApplicationData) best.getApplicationData();
                    LOGGER2.info("Num Points / Polygons: " + data.numPoints + " / " + data.numPolygons);

                    BufferedImage image = gpProgramRunner.run(best);
                    Graphics g = m_view.getFittestDrawingView().getMainPanel().getGraphics();
                    if (!initView) {
                        m_view.getFittestDrawingView().setSize(204, 200 + 30);
                        m_view.getFittestDrawingView().getMainPanel().setSize(200, 200);
                        initView = true;
                    }
                    g.drawImage(image, 0, 0, m_view.getFittestDrawingView());
                    if (m_view.isSaveToFile()) {
                        int fitness = (int) best.getFitnessValue();
                        String filename = "monalisa_" + NumberKit.niceNumber(fitness, 5, '_') + ".png";
                        java.io.File f = new java.io.File(filename);
                        try {
                            javax.imageio.ImageIO.write(image, "png", f);
                        } catch (java.io.IOException iex) {
                            iex.printStackTrace();
                        }
                    }
                }
            });
            GPProblem problem = new DrawingProblem(conf);
            GPGenotype gp = problem.create();
            gp.setVerboseOutput(true);
            while (m_view.isEvolutionActivated()) {
                gp.evolve();
                gp.calcFitness();
                if (gp.getGPConfiguration().getGenerationNr() % 25 == 0) {
                    String freeMB = SystemKit.niceMemory(SystemKit.getFreeMemoryMB());
                    LOGGER.info("Evolving gen. " + (gp.getGPConfiguration().getGenerationNr()) + ", mem free: "
                            + freeMB + " MB");
                }
            }
            // Create graphical tree from currently fittest image.
            // ---------------------------------------------------
            IGPProgram best = gp.getAllTimeBest();
            int fitness = (int) best.getFitnessValue();
            String filename = "monalisa_" + NumberKit.niceNumber(fitness, 5, '_') + ".png";
            problem.showTree(best, filename);
        } catch (InvalidConfigurationException e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
}