View Javadoc
1   package org.woehlke.simulation.evolution.dom;
2   
3   import java.util.Random;
4   import java.util.ArrayList;
5   import java.util.Iterator;
6   
7   /**
8    * (C) 2006 - 2008 Thomas Woehlke
9    * http://www.thomas-woehlke.de
10   * @author Thomas Woehlke
11   * Date: 04.02.2006
12   * Time: 19:55:23
13   */
14  public class SimGenCore implements ISimGenCore {
15      private ArrayList<Integer> dna;
16      private int maxValue = 16;
17      private int maxInitialValue = 8;
18      private Random random;
19  
20      public SimGenCore(Random random) {
21          dna = new ArrayList<Integer>();
22          //this.random=new Random();
23          //this.random.setSeed(random.nextLong());
24          this.random = random;
25          birth();
26      }
27  
28      public SimGenCore(Random random, int maxValue, int maxInitialValue) {
29          dna = new ArrayList<Integer>();
30          //this.random=new Random();
31          //this.random.setSeed(random.nextLong());
32          this.random = random;
33          this.maxValue = maxValue;
34          this.maxInitialValue = maxInitialValue;
35          birth();
36      }
37  
38      private SimGenCore(Random random, ArrayList<Integer> rna) {
39          //this.random=new Random();
40          //this.random.setSeed(random.nextLong());
41          this.random = random;
42          dna = new ArrayList<Integer>();
43          dna.addAll(rna);
44      }
45  
46      private void birth() {
47          for (int i = 0; i < ESimGenDna.values().length; i++) {
48              int gen = random.nextInt() % maxInitialValue;
49              //System.out.println("Gen:"+gen);
50              dna.add(gen);
51          }
52      }
53  
54      public ISimGenCore mitosisFactory() {
55          ArrayList<Integer> rna = new ArrayList<Integer>();
56          Iterator<Integer> it = dna.iterator();
57          while (it.hasNext()) {
58              rna.add(it.next());
59          }
60          SimGenCore child = new SimGenCore(random, rna);
61          int baseIndex = random.nextInt() % ESimGenDna.values().length;
62          if (baseIndex < 0) {
63              baseIndex *= -1;
64          }
65          ESimGenDna base[] = ESimGenDna.values();
66          this.decrease(base[baseIndex]);
67          child.increase(base[baseIndex]);
68          return child;
69      }
70  
71      private void increase(ESimGenDna base) {
72          int value = dna.get(base.ordinal());
73          if (value == maxValue) {
74              for (int i = 0; i < dna.size(); i++) {
75                  Integer val = dna.get(i);
76                  val--;
77                  dna.set(i, val);
78              }
79          }
80          Integer val = dna.get(base.ordinal());
81          val++;
82          dna.set(base.ordinal(), val);
83      }
84  
85      private void decrease(ESimGenDna base) {
86          int value = dna.get(base.ordinal());
87          if (value == -maxValue) {
88              for (int i = 0; i < dna.size(); i++) {
89                  Integer val = dna.get(i);
90                  val++;
91                  dna.set(i, val);
92              }
93          }
94          dna.set(base.ordinal(), 0);
95      }
96  
97      public ESimGenDna getRandomOrientation() {
98          ESimGenDna orientation = ESimGenDna.FORWARD;
99          int dnaLength = ESimGenDna.values().length;
100         double sumDna = 0.0;
101         for (int i = 0; i < dnaLength; i++) {
102             double val = dna.get(i).longValue() ^ 2;
103             if (val < 0) {
104                 val *= -1;
105             }
106             sumDna += val;
107         }
108         double sum = 0.0;
109         double[] rna = new double[dnaLength];
110         for (int i = 0; i < dnaLength; i++) {
111             double val = dna.get(i).longValue() ^ 2;
112             if (val < 0) {
113                 val *= -1;
114             }
115             sum += val / sumDna;
116             rna[i] = sum;
117             //System.out.print("rna:"+rna[i]);
118         }
119         //System.out.println();
120         if (sumDna != 0) {
121             double val = new Double(random.nextInt(maxValue) ^ 2);
122             if (val < 0) {
123                 val *= -1;
124             }
125             double sumRandom = val / new Double(maxValue ^ 2);
126             //System.out.println("sumRandom "+sumRandom);
127             if (sumRandom < 0) {
128                 sumRandom *= -1;
129             }
130             int newInt = 0;
131             for (int i = 0; i < dnaLength; i++) {
132                 if (sumRandom > rna[i]) {
133                     //System.out.print(i+":");
134                     newInt = i;
135                 }
136             }
137             orientation = ESimGenDna.values()[newInt];
138         }
139         //System.out.println(orientation+" "+sumDna);
140         return orientation;
141     }
142 
143     public int getMaxInitialValue() {
144         return maxInitialValue;
145     }
146 
147     public void setMaxInitialValue(int maxInitialValue) {
148         this.maxInitialValue = maxInitialValue;
149     }
150 
151     public int getMaxValue() {
152         return maxValue;
153     }
154 
155     public void setMaxValue(int maxValue) {
156         this.maxValue = maxValue;
157     }
158 }