HolegIndividual.java 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package algorithms.geneticAlgorithm.holegGA.Components;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.Set;
  5. import classes.AbstractCpsObject;
  6. import classes.CpsNode;
  7. import algorithms.geneticAlgorithm.Components.GAIndividual;
  8. import algorithms.geneticAlgorithm.holegGA.GAEdge;
  9. public class HolegIndividual extends GAIndividual {
  10. private ArrayList<GAEdge> holonEdges;
  11. public ArrayList<Integer> indexes;
  12. public ArrayList<Integer> originIndexes;
  13. public ArrayList<HolegIndividual> parents;
  14. public HashMap<Integer, AbstractCpsObject> indexToObjectMap;
  15. private HashMap<AbstractCpsObject, Integer> objectToIndexMap;
  16. public boolean drawn;
  17. public String id;
  18. public String log;
  19. public int gen;
  20. public int pos;
  21. private int lastIndex;
  22. public HolegIndividual(ArrayList<AbstractCpsObject> originObjects){
  23. holonEdges = new ArrayList<GAEdge>();
  24. indexes = new ArrayList<Integer>();
  25. originIndexes = new ArrayList<Integer>();
  26. parents = new ArrayList<HolegIndividual>();
  27. indexToObjectMap = new HashMap<Integer, AbstractCpsObject>();
  28. objectToIndexMap = new HashMap<AbstractCpsObject, Integer>();
  29. lastIndex = 0;
  30. log = "Individual Log";
  31. drawn = false;
  32. for(AbstractCpsObject abs : originObjects){
  33. AbstractCpsObject newObj = abs.makeCopy();
  34. newObj.setPosition(abs.getPosition());
  35. addObject(newObj);
  36. originIndexes.add(objectToIndexMap.get(newObj));
  37. }
  38. }
  39. public HolegIndividual(HolegIndividual indi){
  40. holonEdges = new ArrayList<GAEdge>();
  41. holonEdges.addAll(indi.getEdges());
  42. indexes = new ArrayList<Integer>();
  43. indexes.addAll(indi.getIndexes());
  44. originIndexes = new ArrayList<Integer>();
  45. originIndexes.addAll(indi.originIndexes);
  46. parents = new ArrayList<HolegIndividual>();
  47. indexToObjectMap = new HashMap<Integer, AbstractCpsObject>();
  48. objectToIndexMap = new HashMap<AbstractCpsObject, Integer>();
  49. Set<Integer> keys = indi.indexToObjectMap.keySet();
  50. for(Integer i : keys){
  51. indexToObjectMap.put(i, indi.indexToObjectMap.get(i));
  52. objectToIndexMap.put(indi.indexToObjectMap.get(i), i);
  53. }
  54. lastIndex = indi.lastIndex;
  55. log = "Individual Log";
  56. drawn = false;
  57. }
  58. public ArrayList<HolegIndividual> getParents(){
  59. return parents;
  60. }
  61. public void setParents(ArrayList<HolegIndividual> parents){
  62. this.parents = parents;
  63. for(int i = 0; i < parents.size(); i++){
  64. addLogEntry("Parent" + i + ": " + parents.get(i).getId());
  65. }
  66. }
  67. public void setId(int Gen, int pos){
  68. if(Gen > 0){
  69. id = "Generation_" + Gen + " Rank_" + pos;
  70. }else{
  71. id = "Generation_Original";
  72. }
  73. }
  74. public String getId(){
  75. return id;
  76. }
  77. public ArrayList<AbstractCpsObject> getObjects(){
  78. ArrayList<AbstractCpsObject> objects = new ArrayList<AbstractCpsObject>();
  79. for(Integer i : indexes){
  80. objects.add(indexToObjectMap.get(i));
  81. }
  82. return objects;
  83. }
  84. public ArrayList<AbstractCpsObject> getOriginObjects(){
  85. ArrayList<AbstractCpsObject> originObjects = new ArrayList<AbstractCpsObject>();
  86. for(Integer i : originIndexes){
  87. originObjects.add(indexToObjectMap.get(i));
  88. }
  89. return originObjects;
  90. }
  91. public AbstractCpsObject getObjectWithIndex(int index){
  92. return indexToObjectMap.get(index);
  93. }
  94. public AbstractCpsObject getObjectAt(int position){
  95. return indexToObjectMap.get(indexes.get(position));
  96. }
  97. public ArrayList<Integer> getIndexes(){
  98. return indexes;
  99. }
  100. public ArrayList<Integer> getNonOriginIndexes(){
  101. if(indexes.size() > originIndexes.size()){
  102. return new ArrayList<Integer>(indexes.subList(originIndexes.size(), indexes.size()));
  103. }else{
  104. return new ArrayList<Integer>();
  105. }
  106. }
  107. public ArrayList<GAEdge> getEdges(){
  108. return holonEdges;
  109. }
  110. public void addObject(AbstractCpsObject obj){
  111. addObjectWithIdx(obj, lastIndex);
  112. lastIndex++;
  113. }
  114. public void addObjectWithIdx(AbstractCpsObject obj, int index){
  115. if(!indexToObjectMap.containsKey(index)){
  116. addIndex(index);
  117. indexToObjectMap.put(index, obj);
  118. objectToIndexMap.put(obj, index);
  119. }else{
  120. objectToIndexMap.remove(indexToObjectMap.get(index));
  121. indexToObjectMap.put(index, obj);
  122. objectToIndexMap.put(obj, index);
  123. }
  124. //indexToObjectMap.put(index, obj);
  125. }
  126. public void removeObject(int index){
  127. indexToObjectMap.remove(index);
  128. indexes.remove((Object)index);
  129. }
  130. public void addIndex(int index){
  131. for(int i = 0; i < indexes.size(); i++){
  132. if(index < indexes.get(i)){
  133. indexes.add(i, index);
  134. return;
  135. }
  136. }
  137. indexes.add(index);
  138. return;
  139. }
  140. /*
  141. * posA and posB are the indexes of the Endpoints A and B in the list of Objects
  142. */
  143. public void addEdge(int indexA, int indexB){
  144. if(!edgeExists(indexA, indexB)){
  145. if(!indexToObjectMap.containsKey(indexA)){
  146. CpsNode newObjA = new CpsNode("Node");
  147. addObjectWithIdx(newObjA, indexA);
  148. }
  149. if(!indexToObjectMap.containsKey(indexB)){
  150. CpsNode newObjB = new CpsNode("Node");
  151. addObjectWithIdx(newObjB, indexB);
  152. }
  153. holonEdges.add(new GAEdge(indexA, indexB, indexToObjectMap.get(indexA), indexToObjectMap.get(indexB)));
  154. }else{
  155. addLogEntry("double Edge: " + indexToObjectMap.get(indexA).getId() + " to "
  156. + indexToObjectMap.get(indexB).getId());
  157. }
  158. }
  159. public boolean edgeExists(int indexA, int indexB){
  160. for(GAEdge e : holonEdges){
  161. if((e.aPos == indexA && e.bPos == indexB) || (e.bPos == indexA && e.aPos == indexB)){
  162. return true;
  163. }
  164. }
  165. return false;
  166. }
  167. public void addLogEntry(String entry){
  168. log += "\n" + entry;
  169. }
  170. public int getAvailableIndex(){
  171. for(int i = 0; i <= indexes.size(); i++){
  172. if(!indexes.contains(i)){
  173. return i;
  174. }
  175. }
  176. return -1;
  177. }
  178. }