Gene.java
1 package genetics; 2 3 /** 4 * Defines a gene. Genes have a name, a minimum possible value, and a maximum possible value 5 */ 6 public class Gene { 7 8 private String name; 9 private double min; 10 private double max; 11 12 /** 13 * Defines a gene with name 'name' and max value 'max' and min value 'min' 14 */ 15 public Gene(String name, double min, double max){ 16 this.name = name; 17 this.min = min; 18 this.max = max; 19 } 20 21 public String getName(){ 22 return name; 23 } 24 25 /** 26 * @return Generates a random allele for this gene within the proper range 27 */ 28 double generateAllele(){ 29 double range = max - min; 30 return truncate(min + (Math.random() * range)); 31 } 32 33 /** 34 * Mutates the given value according to the min and max of this gene 35 * Mutated value = old value +/- up to 10% of gene range 36 */ 37 double mutate(double value){ 38 double change = Math.random() * ((max - min) / 7); 39 int sign = Math.random() >= 0.5 ? 1 : -1; 40 value += sign * change; 41 return truncate(clamp(value)); 42 } 43 44 private double clamp(double value){ 45 return Math.max(min, Math.min(max, value)); 46 } 47 48 private double truncate(double value){ 49 return Math.floor(value * 1000) / 1000; 50 } 51 }