HolegCrossover.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. //HolonObjects
  25. for(int i = 0; i < splitIdx; i++){
  26. int index = parent1NonOrgIndexes.get(i);
  27. child.addObjectWithIdx(parent1.indexToObjectMap.get(index).makeCopy(), index);
  28. }
  29. int restAmount = parent1NonOrgIndexes.size() - splitIdx;
  30. ArrayList<Integer> parent2NonOrgIndexes = parent2.getNonOriginIndexes();
  31. for(int j = 0; j < restAmount; j++){
  32. int index = parent2NonOrgIndexes.size() - 1; //greift auf letztes element zu
  33. index -= j; //greift bei jedem durchlauf auf ein weiter vorderes element zu
  34. if(index >= 0){
  35. int objIdx = parent2NonOrgIndexes.get(index);
  36. child.addObjectWithIdx(parent2.indexToObjectMap.get(objIdx).makeCopy(), objIdx);
  37. }else{
  38. break;
  39. }
  40. }
  41. //HolonEdges
  42. splitIdx = (int) Math.ceil((double)parent1.getEdges().size()/2);
  43. for(int k = 0; k < splitIdx; k++){
  44. int posA = parent1.getEdges().get(k).aPos;
  45. int posB = parent1.getEdges().get(k).bPos;
  46. child.addEdge(posA, posB);
  47. /*
  48. AbstractCpsObject objA;
  49. AbstractCpsObject objB;
  50. if(posA < child.holonObjects.size()){
  51. objA = child.holonObjects.get(posA);
  52. if(objA == null){
  53. objA = new CpsNode("Node");
  54. child.holonObjects.set(posA, objA);
  55. }
  56. }else{
  57. objA = new CpsNode("Node");
  58. child.holonObjects.add(objA);
  59. }
  60. if(posB < child.holonObjects.size()){
  61. objB = child.holonObjects.get(posB);
  62. if(objB == null){
  63. objB = new CpsNode("Node");
  64. child.holonObjects.set(posB, objB);
  65. }
  66. }else{
  67. objB = new CpsNode("Node");
  68. child.holonObjects.add(objB);
  69. }
  70. child.holonEdges.add(new GAEdge(posA, posB, objA, objB));
  71. */
  72. }
  73. restAmount = parent1.getEdges().size() - splitIdx;
  74. for(int l = 0; l < restAmount; l++){
  75. int idx = parent2.getEdges().size() - 1;
  76. idx -= l;
  77. if(idx >= 0){
  78. int posA = parent2.getEdges().get(idx).aPos;
  79. int posB = parent2.getEdges().get(idx).bPos;
  80. child.addEdge(posA, posB);
  81. /*
  82. AbstractCpsObject objA;
  83. AbstractCpsObject objB;
  84. if(posA < child.holonObjects.size()){
  85. objA = child.holonObjects.get(posA);
  86. }else{
  87. objA = new CpsNode("Node");
  88. child.holonObjects.add(objA); /// muss unbedingt geändert werden damit edges synchron sind
  89. }
  90. if(posB < child.holonObjects.size()){
  91. objB = child.holonObjects.get(posB);
  92. }else{
  93. objB = new CpsNode("Node");
  94. child.holonObjects.add(objB);
  95. }
  96. child.holonEdges.add(new GAEdge(posA, posB, objA, objB));
  97. */
  98. }
  99. }
  100. return child;
  101. }
  102. }