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 |