/ benchmark / genetics / Gene.java
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  }