/************************************************************************************* Janne Koljonen Vaasan yliopisto Soft Computing SAT_ongelman hyvyysfuntio. Funktio määritelty dynaamisesti. Geneettisen algoritmin hyvyysfunktio **************************************************************************************/ public class SAT implements FitnessFunction { private int variables; // Muuttujien määrä private int[][] boolfunction; // 1. indeksi=tulotermi, 2.=muuttujan arvo. // 0=komplementti, 1=tavallinen, 2=puuttuu public static void main(String[] args) { int[][] bf={ {1,2},{2,0} }; SAT s=new SAT(bf); for(int i=0;i<4;i++) { System.out.println("MUUTTUJAT:"); int[] b=s.asBitVector(i); for(int j=1;j>=0;j--) System.out.println(b[j]); System.out.println("TERMIT:"); for(int k=1;k>=0;k--) System.out.println(s.resolveTerm(b,k)); System.out.println("FITNESS="+s.fitness(new int[]{i})); } } public SAT() { } public SAT(int[][] boolfmatrix) { boolfunction=boolfmatrix; variables=boolfunction[0].length; } public void setBooleanFunction(int[][] boolfmatrix) { boolfunction=boolfmatrix; variables=boolfunction[0].length; } /** Muunnos bittivektoriksi **/ public int[] asBitVector(int bitvector) { int[] apu=new int[variables]; for(int i=0;i>>i; } return apu; } // Palauttaa tulotermin tuloksen. vars=muuttujien arvot, term=monesko tulotermi public int resolveTerm(int[] vars, int term) { int apu=0; for(int i=0;i tulotermi false. } } } return apu; } /** Seuraava metodi periytyy FitnessFunction-rajapinnasta. parametrina muuttujien arvot kokonaisluvuksi tulkittuna. Palauttaa boolen funktion totuusarvon**/ public int fitness(int[] boolvector) { if(boolvector[0]==Integer.MAX_VALUE) return Integer.MAX_VALUE; int trueterms=0; // Totta olevien termien määrä for(int i=0;i=2) return 0; // True, minimoidaan (Vaaditaan kahden termin olevan oikein, koska muuten annetulla funktiolla liikaa ratkaisuja) else return 1; } public void printBooleanVector(int boolvector) { int[] apu=this.asBitVector(boolvector); for(int i=apu.length-1;i>=0;i--) { System.out.print("x"+i+"="+apu[i]+", "); } System.out.println(); } }