HolegCrossover.java 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package algorithms.geneticAlgorithm.holegGA.Components;
  2. import java.util.ArrayList;
  3. import classes.AbstractCpsObject;
  4. import classes.CpsNode;
  5. import algorithms.geneticAlgorithm.Components.GACrossoverStrategy;
  6. public class HolegCrossover extends GACrossoverStrategy<HolegIndividual> {
  7. @Override
  8. public ArrayList<HolegIndividual> crossOver(ArrayList<HolegIndividual> parents) {
  9. HolegIndividual parent1 = parents.get(0);
  10. HolegIndividual parent2 = parents.get(1);
  11. ArrayList<HolegIndividual> children = new ArrayList<HolegIndividual>();
  12. children.add(createChild(parent1, parent2));
  13. children.add(createChild(parent2, parent1));
  14. return children;
  15. }
  16. private HolegIndividual createChild(HolegIndividual parent1, HolegIndividual parent2) {
  17. HolegIndividual child = new HolegIndividual(parent1.getOriginObjects());
  18. ArrayList<HolegIndividual> parents = new ArrayList<HolegIndividual>();
  19. parents.add(parent1);
  20. parents.add(parent2);
  21. child.setParents(parents);
  22. ArrayList<Integer> parent1NonOrgIndexes = parent1.getNonOriginIndexes();
  23. int splitIdx = (int) Math.ceil((double)parent1NonOrgIndexes.size()/2);
  24. child.addLogEntry("Object Split: " + splitIdx);
  25. child.addLogEntry("none Org Indexes par1: " + parent1NonOrgIndexes.size());
  26. //HolonObjects
  27. for(int i = 0; i < splitIdx; i++){
  28. int index = parent1NonOrgIndexes.get(i);
  29. child.addObjectWithIdx(parent1.indexToObjectMap.get(index).makeCopy(), index);
  30. }
  31. int restAmount = parent1NonOrgIndexes.size() - splitIdx;
  32. ArrayList<Integer> parent2NonOrgIndexes = parent2.getNonOriginIndexes();
  33. for(int j = 0; j < restAmount; j++){
  34. int index = parent2NonOrgIndexes.size() - 1; //greift auf letztes element zu
  35. index -= j; //greift bei jedem durchlauf auf ein weiter vorderes element zu
  36. if(index >= 0){
  37. int objIdx = parent2NonOrgIndexes.get(index);
  38. child.addObjectWithIdx(parent2.indexToObjectMap.get(objIdx).makeCopy(), objIdx);
  39. }else{
  40. break;
  41. }
  42. }
  43. //HolonEdges
  44. splitIdx = (int) Math.ceil((double)parent1.getEdges().size()/2);
  45. child.addLogEntry("Edge Split: " + splitIdx);
  46. for(int k = 0; k < splitIdx; k++){
  47. int posA = parent1.getEdges().get(k).aPos;
  48. int posB = parent1.getEdges().get(k).bPos;
  49. child.addEdge(posA, posB);
  50. /*
  51. AbstractCpsObject objA;
  52. AbstractCpsObject objB;
  53. if(posA < child.holonObjects.size()){
  54. objA = child.holonObjects.get(posA);
  55. if(objA == null){
  56. objA = new CpsNode("Node");
  57. child.holonObjects.set(posA, objA);
  58. }
  59. }else{
  60. objA = new CpsNode("Node");
  61. child.holonObjects.add(objA);
  62. }
  63. if(posB < child.holonObjects.size()){
  64. objB = child.holonObjects.get(posB);
  65. if(objB == null){
  66. objB = new CpsNode("Node");
  67. child.holonObjects.set(posB, objB);
  68. }
  69. }else{
  70. objB = new CpsNode("Node");
  71. child.holonObjects.add(objB);
  72. }
  73. child.holonEdges.add(new GAEdge(posA, posB, objA, objB));
  74. */
  75. }
  76. restAmount = parent1.getEdges().size() - splitIdx;
  77. for(int l = 0; l < restAmount; l++){
  78. int idx = parent2.getEdges().size() - 1;
  79. idx -= l;
  80. if(idx >= 0){
  81. int posA = parent2.getEdges().get(idx).aPos;
  82. int posB = parent2.getEdges().get(idx).bPos;
  83. child.addEdge(posA, posB);
  84. /*
  85. AbstractCpsObject objA;
  86. AbstractCpsObject objB;
  87. if(posA < child.holonObjects.size()){
  88. objA = child.holonObjects.get(posA);
  89. }else{
  90. objA = new CpsNode("Node");
  91. child.holonObjects.add(objA); /// muss unbedingt geändert werden damit edges synchron sind
  92. }
  93. if(posB < child.holonObjects.size()){
  94. objB = child.holonObjects.get(posB);
  95. }else{
  96. objB = new CpsNode("Node");
  97. child.holonObjects.add(objB);
  98. }
  99. child.holonEdges.add(new GAEdge(posA, posB, objA, objB));
  100. */
  101. }
  102. }
  103. return child;
  104. }
  105. }