Libga - Fast Java Binary Genetic Algorithm Library

Introduction
Libga is a fast binary genetic algorithm library written in Java. Library optimizes single objective functions using classical genetic operations such as crossing-over, mutation and selection. Crossing-over type is optional, user can select one of one point crossover, two points cross over and uniform cross over options for different situations. Only tournament selection was included which has seen the best performance by some authors. (Have look Deb's book, Multi-Objective Optimization using Evolutionary Algorithms, Kalyanmoy Deb). The Chromosome class extends java.util.Bitset and Population class extends java.util.Arraylist classes. Algorithm is really fast, so one can use it in real valued problems using 31 bit encodings.


In libga, all of the optimization problems are maximization, so if the problem is a minimization problem, negative values of fitness functions can be used.
Examples
Minimizing the f(x)=x^2 function.

package libgatest;

import ga.binary.Chromosome;
import ga.binary.Population;
import ga.binary.FitnessFunction;
import ga.exceptions.FitnessFunctionIsNotSetException;



public class Main implements FitnessFunction {


    public Main(){
        int popSize=100;
        int bitsPerGene=31;
        int variablesCount=1;
        int totalBitlen=variablesCount*bitsPerGene;

        Population pop=new Population(popSize, bitsPerGene, totalBitlen);
        pop.setFitnessFunc(this);
        pop.setMaxDoubleForGenes(5);
        pop.setMinDoubleForGenes(-5);
        pop.randomize();
        try{
            pop.startOptimization(100);
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("Best Chromosome is: "+pop.get(0));
        System.out.println("Best X value is: "+pop.get(0).getAsDoubleArray(pop.getBitsPerGenes(), pop.getMinDoubleForGenes(), pop.getMaxDoubleForGenes())[0]);

    }

    public static void main(String[] args) {
        new Main();
    }

    public double f(Population pop, Chromosome c) {
        double[] x=c.getAsDoubleArray(pop.getBitsPerGenes(), pop.getMinDoubleForGenes(), pop.getMaxDoubleForGenes());
        return(-Math.pow(x[0],2));
    }

}

The result is:
Best Chromosome is: (-5.421011E-18)0111111111111111111111111111111
Best X value is: -2.3283064365386963E-9
which is nearly zero.
Finding spatial median of multivariate data
Spatial median is a point in multi-dimensional space which has got the minimum sum of euclidean distances between all other points in the data. In this example, genetic algorithm finds the centroid of the 2-dimensional data with number of observations 100.

package libgatest;

import ga.binary.Chromosome;
import ga.binary.Population;
import ga.binary.FitnessFunction;
import ga.exceptions.FitnessFunctionIsNotSetException;



public class Main implements FitnessFunction {


    double[][] data;

    public Main(){
        int popSize=100;
        int bitsPerGene=31;
        int variablesCount=2;
        int totalBitlen=variablesCount*bitsPerGene;

        data=new double[100][2];
        for (int i=0;i<data.length;i++){
            for (int j=0;j<data[0].length;j++){
                data[i][j]=Math.random();
            }
        }

        Population pop=new Population(popSize, bitsPerGene, totalBitlen);
        pop.setFitnessFunc(this);
        pop.setMaxDoubleForGenes(1);
        pop.setMinDoubleForGenes(0);
        pop.randomize();
        try{
            pop.startOptimization(100);
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("Data is :");
        for (int i=0;i<data.length;i++){
            for (int j=0;j<data[i].length;j++){
                System.out.print(data[i][j]+" ");
            }
            System.out.println();
        }

        System.out.println("Spatial Median is: ");
        Chromosome best=pop.get(0);
        double[] median=best.getAsDoubleArray(pop.getBitsPerGenes(), pop.getMinDoubleForGenes(), pop.getMaxDoubleForGenes());
        for (int i=0;i<median.length;i++) System.out.print(median[i]+" ");
        System.out.println();
    }

    public static void main(String[] args) {
        new Main();
    }

    public double euclidean(double[] vector1, double[] vector2){
        double result=0.0;
        for (int i=0;i
The result is:
Data is :
0.7495941905889336 0.7943100378610828 
0.029536023239428166 0.4914114122894575 
.
.
.
0.49364043171964456 0.23379817886883925 
0.28407285968691454 0.12628941223311607 
Spatial Median is: 
0.47179030881812345 0.4745982896883964 
which is nearly [0.5 0.5]' because the data was sampled from the independent uniform distributions with parameters 0 and 1.

Download
FileDescriptionLink
Libga.rarNetbeans project, source, jars and javadocsDownload
Libga-jarAndJavaDoc.rarjars and javadocsDownload
JavadocsJavadocsSee Javadocs


If you like this solution or you have got any questions, you can send e-mail using mhsatman [at] yahoo.com.

Back to home



View My Stats