Contoh Genetic Programming Sederhana
Saya mencoba untuk konversi dari contoh (menggunakan c++):
http://generation5.org/content/2003/gahelloworld.asp
ke dalam bahasa Java. Tapi hasilnya hampir selalu tidak selesai solusinya, artinya sampai batas maksimum iterasinya, solusi tidak terselesaikan. Mungkin ada rekan-rekan yang dapat membantu saya dalam hal ini? Saya masih belum dapat salahnya di mana.
Kode programnya seperti di bawah ini :
import java.util.Collections;
import java.util.Vector;
import java.util.Random;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author budsus
*/
public class GAHelloWorld {
private static final int GA_POPSIZE = 2048;
private static final int GA_MAXITER = 16384;
private static final float GA_ELITRATE = 0.10f;
private static final float GA_MUTATIONRATE = 0.25f;
//private static final int RAND_MAX = 2147483647;
private static final int RAND_MAX = 2147483647;
private static float GA_MUTATION = RAND_MAX * GA_MUTATIONRATE;
private static final String GA_TARGET = "Hello World";
private Vector population = new Vector();
private Vector buffer = new Vector();
private Random randomGenerator;
public GAHelloWorld() {
randomGenerator = new Random();
}
public void init() {
int tsize = GA_TARGET.length();
for (int i = 0; i < GA_POPSIZE; i++) {
GAStruct citizen = new GAStruct();
citizen.setFitness(0);
citizen.setStr("");
buffer.addElement(citizen);
StringBuffer strTmp = new StringBuffer();
for (int j = 0; j < tsize; j++) {
strTmp.append((char)(randomGenerator.nextInt(RAND_MAX) % (90) + 32));
}
citizen.setStr(strTmp.toString());
population.addElement(citizen);
}
}
public void calc_fitness() {
String target = GA_TARGET;
int tsize = target.length();
int fitness;
for (int i = 0; i < GA_POPSIZE; i++) {
fitness = 0;
String str = population.elementAt(i).getStr();
for (int j = 0; j < tsize; j++) {
int popStr = (int)str.charAt(j);
int popTarget = (int)target.charAt(j);
fitness += Math.abs(popStr - popTarget);
}
population.elementAt(i).setFitness(fitness);
}
}
public void sort_by_fitness() {
Collections.sort(population);
}
public void print_by_best() {
System.out.print("Worstest: " + population.lastElement() + ", ");
System.out.println("Best: " + population.elementAt(0));
}
public GAStruct getPop(int i) {
return population.elementAt(i);
}
private void elitism(int esize) {
for (int i = 0; i < esize; i++) {
GAStruct gtmp = new GAStruct();
gtmp.setStr(population.elementAt(i).getStr());
gtmp.setFitness(population.elementAt(i).getFitness());
buffer.setElementAt(gtmp, i);
}
}
private void mutate(GAStruct g) {
int tsize = GA_TARGET.length();
int ipos = randomGenerator.nextInt(RAND_MAX) % (tsize);
int delta = randomGenerator.nextInt(RAND_MAX) % (tsize) + 32;
char[] str = g.getStr().toCharArray();
str[ipos] = (char)((str[ipos] + delta) % 122);
}
public void mate() {
int esize = (int)Math.floor(GA_POPSIZE * GA_ELITRATE);
int tsize = GA_TARGET.length(), spos, i1, i2;
elitism(esize);
// Mate the rest
for (int i = esize; i < GA_POPSIZE; i++) {
i1 = randomGenerator.nextInt(RAND_MAX) % (int)(GA_POPSIZE / 2);
i2 = randomGenerator.nextInt(RAND_MAX) % (int)(GA_POPSIZE / 2);
spos = randomGenerator.nextInt(RAND_MAX) % tsize;
String str1 = population.elementAt(i1).getStr().substring(0, spos);
String str2 = population.elementAt(i2).getStr().substring(spos);
buffer.elementAt(i).setStr( str1 + str2 );
if (randomGenerator.nextInt(RAND_MAX) <= (int)GA_MUTATION) {
mutate(buffer.elementAt(i));
}
}
}
public void swap() {
Vector tmp = new Vector();
tmp = population;
population = buffer;
buffer = tmp;
}
public static void main(String[] args) {
GAHelloWorld ga = new GAHelloWorld();
ga.init();
for (int i = 0; i < GA_MAXITER; i++) {
ga.calc_fitness();
ga.sort_by_fitness();
ga.print_by_best();
if (ga.getPop(0).getFitness() == 0) {
break;
}
ga.mate();
ga.swap();
}
ga = null;
}
}
class GAStruct implements Comparable {
private String str;
private int fitness;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public int getFitness() {
return fitness;
}
public void setFitness(int fitness) {
this.fitness = fitness;
}
public int compareTo(GAStruct ga) {
return getFitness() - ga.getFitness();
}
public String toString() {
return getStr() + " (" + getFitness() + ")";
}
}
http://generation5.org/content/2003/gahelloworld.asp
ke dalam bahasa Java. Tapi hasilnya hampir selalu tidak selesai solusinya, artinya sampai batas maksimum iterasinya, solusi tidak terselesaikan. Mungkin ada rekan-rekan yang dapat membantu saya dalam hal ini? Saya masih belum dapat salahnya di mana.
Kode programnya seperti di bawah ini :
import java.util.Collections;
import java.util.Vector;
import java.util.Random;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author budsus
*/
public class GAHelloWorld {
private static final int GA_POPSIZE = 2048;
private static final int GA_MAXITER = 16384;
private static final float GA_ELITRATE = 0.10f;
private static final float GA_MUTATIONRATE = 0.25f;
//private static final int RAND_MAX = 2147483647;
private static final int RAND_MAX = 2147483647;
private static float GA_MUTATION = RAND_MAX * GA_MUTATIONRATE;
private static final String GA_TARGET = "Hello World";
private Vector
private Vector
private Random randomGenerator;
public GAHelloWorld() {
randomGenerator = new Random();
}
public void init() {
int tsize = GA_TARGET.length();
for (int i = 0; i < GA_POPSIZE; i++) {
GAStruct citizen = new GAStruct();
citizen.setFitness(0);
citizen.setStr("");
buffer.addElement(citizen);
StringBuffer strTmp = new StringBuffer();
for (int j = 0; j < tsize; j++) {
strTmp.append((char)(randomGenerator.nextInt(RAND_MAX) % (90) + 32));
}
citizen.setStr(strTmp.toString());
population.addElement(citizen);
}
}
public void calc_fitness() {
String target = GA_TARGET;
int tsize = target.length();
int fitness;
for (int i = 0; i < GA_POPSIZE; i++) {
fitness = 0;
String str = population.elementAt(i).getStr();
for (int j = 0; j < tsize; j++) {
int popStr = (int)str.charAt(j);
int popTarget = (int)target.charAt(j);
fitness += Math.abs(popStr - popTarget);
}
population.elementAt(i).setFitness(fitness);
}
}
public void sort_by_fitness() {
Collections.sort(population);
}
public void print_by_best() {
System.out.print("Worstest: " + population.lastElement() + ", ");
System.out.println("Best: " + population.elementAt(0));
}
public GAStruct getPop(int i) {
return population.elementAt(i);
}
private void elitism(int esize) {
for (int i = 0; i < esize; i++) {
GAStruct gtmp = new GAStruct();
gtmp.setStr(population.elementAt(i).getStr());
gtmp.setFitness(population.elementAt(i).getFitness());
buffer.setElementAt(gtmp, i);
}
}
private void mutate(GAStruct g) {
int tsize = GA_TARGET.length();
int ipos = randomGenerator.nextInt(RAND_MAX) % (tsize);
int delta = randomGenerator.nextInt(RAND_MAX) % (tsize) + 32;
char[] str = g.getStr().toCharArray();
str[ipos] = (char)((str[ipos] + delta) % 122);
}
public void mate() {
int esize = (int)Math.floor(GA_POPSIZE * GA_ELITRATE);
int tsize = GA_TARGET.length(), spos, i1, i2;
elitism(esize);
// Mate the rest
for (int i = esize; i < GA_POPSIZE; i++) {
i1 = randomGenerator.nextInt(RAND_MAX) % (int)(GA_POPSIZE / 2);
i2 = randomGenerator.nextInt(RAND_MAX) % (int)(GA_POPSIZE / 2);
spos = randomGenerator.nextInt(RAND_MAX) % tsize;
String str1 = population.elementAt(i1).getStr().substring(0, spos);
String str2 = population.elementAt(i2).getStr().substring(spos);
buffer.elementAt(i).setStr( str1 + str2 );
if (randomGenerator.nextInt(RAND_MAX) <= (int)GA_MUTATION) {
mutate(buffer.elementAt(i));
}
}
}
public void swap() {
Vector
tmp = population;
population = buffer;
buffer = tmp;
}
public static void main(String[] args) {
GAHelloWorld ga = new GAHelloWorld();
ga.init();
for (int i = 0; i < GA_MAXITER; i++) {
ga.calc_fitness();
ga.sort_by_fitness();
ga.print_by_best();
if (ga.getPop(0).getFitness() == 0) {
break;
}
ga.mate();
ga.swap();
}
ga = null;
}
}
class GAStruct implements Comparable
private String str;
private int fitness;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public int getFitness() {
return fitness;
}
public void setFitness(int fitness) {
this.fitness = fitness;
}
public int compareTo(GAStruct ga) {
return getFitness() - ga.getFitness();
}
public String toString() {
return getStr() + " (" + getFitness() + ")";
}
}
Next item »