/************************************************************************************* Janne Koljonen Vaasan yliopisto Soft Computing Geneettinen algoritmi **************************************************************************************/ public class GeneettinenAlgoritmi { private int[][] population; // population[] : yksilöt, population[][] kromosomit private FitnessFunction fitnessf; // Käytettävä hyvyysfunktio (rajapinta) private int[] bits; // Bittien lukumäärä kussakin kromosomissa private double elitism=0.5; // 0-1, kuinka suuri osa populaatiosta kuuluu eliittiin private double uniformcrossoverprob=0.5; // 0-1, todennäköisyys, että tehdään uniform crossover private double onepointcrossoverprob=0.5; // 0-1, todennäköisyys, että tehdään 1-pisteen crossover private double randomprob=0.0; // Todennäköisyys, ettei tehdä risteytystä eikä mutaatiota vaan arvotaan uusi yksilö private double mutationrate=0.01; // Kunkin bitin mutaation todennäköisyys private int generation; // Current generation private int maxgenerations=100; // oletuksena 100 private int stopfitness=0; // Tavoitehyvyys, oletuksena 0 private boolean minimize=true; /* TRUE=minimoidaan, FALSE=maksimoidaan. Minimointi oletuksena */ private boolean noclones=false; /** Tuhotaanko kloonit. Oletus EI. **/ private int solutions=0; /* Ratkaisujen määrä */ private int stopsolutions; /* Montako ratkaisua haetaan */ // Harjoitus 3. Tehtävä 3. Pääohjelma public static void main(String[] args) { System.out.println("SAT"); int[][] bm=new int[11][16]; // Boolen funktio int[][] bm2=new int[11][16]; // Boolen funktio for(int i2=0;i20) { solutionss[0]=ga.population[0][1]; isol++; } for(;i=0.5 ) { apu+=x; } x<<=1; } return apu; } /** Asettaa noClonesin **/ public void setNoClones(boolean noclo) { noclones=noclo; } /** Asettaa noClonesin **/ public void setStopsolutions(int stopsol) { stopsolutions=stopsol; } /** Simuloi, kunnes generations sukupolvea, vaikka stopfitness saavutettu. Useamman ratkaisun etsimiseen **/ public void simulateMultiSolutions(int tulostus, int generations) { maxgenerations=generations; //printNumOfSolutions(); generation=1; if(tulostus==0) { while(generation<=maxgenerations && solutionsstopfitness) { nextGeneration(); } } else if(tulostus==1) { while(generation<=maxgenerations && population[0][0]>stopfitness) { nextGeneration(); printBest(); } } else { while(generation<=maxgenerations && population[0][0]>stopfitness) { nextGeneration(); printPopulation(); } } System.out.println("Simulation over!"); printBest(); } /** Arpoo risteytykseen vanhemmat **/ public void nextGeneration() { int x1=0; int x2=0; for(int ind=(int)(elitism*population.length);ind=0.5) // TRUE => bitti 1. vanhemmasta { population[xnew][chrom]|=population[x1][chrom]&x; } else // Toisesta vanhemmasta { population[xnew][chrom]|=population[x2][chrom]&x; } x<<=1; } } } public void onepointcrossover(int x1,int x2,int xnew) { // Lasketaan bittien määrä int bitit=0; for(int i=0; i bitti 1. vanhemmasta { population[xnew][chrom]|=population[x1][chrom]&x; } else // Toisesta vanhemmasta { population[xnew][chrom]|=population[x2][chrom]&x; } tempbitti++; x<<=1; } } } public void twopointcrossover(int x1,int x2,int xnew) { // Lasketaan bittien määrä int bitit=0; for(int i=0; i bitti 1. vanhemmasta { population[xnew][chrom]|=population[x1][chrom]&x; } else if(tempbitti>=crosspoint1 && tempbitti>=crosspoint2) // TRUE => bitti 1. vanhemmasta { population[xnew][chrom]|=population[x1][chrom]&x; } else // Toisesta vanhemmasta { population[xnew][chrom]|=population[x2][chrom]&x; } tempbitti++; x<<=1; } } } public void randomtrial(int xnew) { population[xnew][0]=0; for(int chrom=1; chrom=0.5) // TRUE => bitti=1 { population[xnew][chrom]|=x; } //else: bitti=0 x<<=1; } } } /* Mutaatio biteittäin */ public void mutation(int xnew) { for(int chrom=1; chrom mutaatio { population[xnew][chrom]^=x; } } //else: ei mutaatiota x<<=1; } } /** Järjestää yksilöt paremmuusjärjestykseen **/ public void sort() { this.fitnesses(); if(minimize) { if(noclones) { for(int i1=1;i1