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
9
10
11
12
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
23
24 this.random = random;
25 birth();
26 }
27
28 public SimGenCore(Random random, int maxValue, int maxInitialValue) {
29 dna = new ArrayList<Integer>();
30
31
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
40
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
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
118 }
119
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
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
134 newInt = i;
135 }
136 }
137 orientation = ESimGenDna.values()[newInt];
138 }
139
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 }