import java.util.Random; public class EPIndividual implements Comparable{ public int num_obj_vars; // number of object variables public float[] obj_var; // object variables array public float[] variance; // variances array public float fitness; // fitness of this individual private static Random randg = new Random(); // Random Generator public EPIndividual(int size,float[] min_range,float[] max_range){ // Creates a random individual // i'th obj_var must be in range min_range[i] to max_range[i] num_obj_vars = size; obj_var = new float[num_obj_vars]; variance = new float[num_obj_vars]; for(int i=0; i < num_obj_vars; i++){ obj_var[i] = randg.nextFloat() * (max_range[i] - min_range[i]) + min_range[i]; // obj_var[i] = Math.min(max_range[i],Math.max(min_range[i],(float)randg.nextFloat())); variance[i] = randg.nextFloat(); } evalFitness(); // evaluate fitness of this new individual } public EPIndividual(float[] obj_var,float[] variance){ // Create an individual that its obj_var is exactly a copy of d[] // It is assumed min_range[i] <= obj_var[i] <= max_range[i] num_obj_vars = obj_var.length; this.obj_var = new float[num_obj_vars]; this.variance = new float[num_obj_vars]; for(int i=0; i < num_obj_vars; i++){ this.obj_var[i] = obj_var[i]; this.variance[i] = variance[i]; } evalFitness(); // evaluate fitness of this new individual } public EPIndividual mutate(float[] min_range,float[] max_range){ float[] new_obj_var = new float[num_obj_vars]; float[] new_variance = new float[num_obj_vars]; for(int i=0; i < num_obj_vars; i++){ new_obj_var[i] = obj_var[i] + variance[i]*(float)randg.nextGaussian(); new_obj_var[i] = Math.max(Math.min(max_range[i],new_obj_var[i]),min_range[i]); new_variance[i] = variance[i] + (float)((Math.sqrt(variance[i]))*randg.nextGaussian()); if( new_variance[i] < 0 ) new_variance[i] = randg.nextFloat() * .1f; } return new EPIndividual(new_obj_var,new_variance); } private void evalFitness(){ // De Jong's F1: // fitness = 1.0f / (1.0f + obj_var[0]*obj_var[0] + obj_var[1]*obj_var[1] + obj_var[2]*obj_var[2] ); // De Jong's F2: // fitness = 1.0f / (1.0f + 100.0f*(obj_var[0]*obj_var[0]-obj_var[1])*(obj_var[0]*obj_var[0]-obj_var[1]) + (1.0f - obj_var[0])*(1.0f - obj_var[0]) ); // Schaffer F6: // float tmp0 = obj_var[0]*obj_var[0] + obj_var[1]*obj_var[1]; // float tmp1 = (float) Math.sin(Math.sqrt(tmp0)); // float tmp2 = 1.0f + .001f*tmp0; // fitness = 1.0f / (1.0f + .5f + (tmp1*tmp1 -.5f) / (tmp2*tmp2)); // Ackey F1 (5 Dimentional): // float tmp0 = obj_var[0]*obj_var[0] + obj_var[1]*obj_var[1] + obj_var[2]*obj_var[2] + obj_var[3]*obj_var[3] + obj_var[4]*obj_var[4]; // float tmp1 = (float)(Math.cos(2*Math.PI*obj_var[0]) + Math.cos(2*Math.PI*obj_var[1]) + Math.cos(2*Math.PI*obj_var[2]) + Math.cos(2*Math.PI*obj_var[3]) + Math.cos(2*Math.PI*obj_var[4]) ); // fitness = 1.0f / (1.0f + 20.0f + (float)(Math.exp(1) - 20*Math.exp(-.2*Math.sqrt(tmp0/5.0f)) - Math.exp(tmp1/5.0f))); // Rastrigin F1 (10 Dimentional) float sum = 100; for(int i=0; i < num_obj_vars; i++) sum = sum + obj_var[i]*obj_var[i] - (float)(10.0*Math.cos(2*Math.PI*obj_var[i])); fitness = 1.0f / (1.0f + sum); } public int compareTo(Object o){ EPIndividual epi = (EPIndividual) o; int result; if( fitness > epi.fitness ) result = 1; else if( fitness == epi.fitness ) result = 0; else result = -1; return result; } public String toString(){ String s = "["; for(int i=0; i < num_obj_vars - 1; i++){ s+= obj_var[i]+", "; } s+=obj_var[num_obj_vars - 1] + "]"; s+=" fitness = "+fitness; s+=" function value = "+ (1.0f / fitness - 1.0); return s; } public static void main(String[] args) { float[] min = new float[]{-5.0f, -5.0f, -5.0f, -5.0f, -5.0f}; float[] max = new float[]{5.0f, 5.0f, 5.0f, 5.0f, 5.0f}; EPIndividual epi = new EPIndividual(5,min,max); EPIndividual epi2 = new EPIndividual(5,min,max); System.out.println(epi); System.out.println(epi.mutate(min,max)); } }