HolegIndividual.java 4.6 KB

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