HolegCrossover.java 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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(), null);
  18. ArrayList<HolegIndividual> parents = new ArrayList<HolegIndividual>();
  19. parents.add(parent1);
  20. parents.add(parent2);
  21. child.setParents(parents);
  22. ArrayList<Integer> parent1WildCardIndexes = parent1.wildCardIndexes;
  23. int splitIdx = (int) Math.ceil((double)parent1WildCardIndexes.size()/2);
  24. for(int i = 0; i < splitIdx; i++){
  25. int index = parent1WildCardIndexes.get(i);
  26. AbstractCpsObject wildObj = parent1.indexToObjectMap.get(index);
  27. AbstractCpsObject newWildObj = wildObj.makeCopy();
  28. newWildObj.setId(wildObj.getId());
  29. newWildObj.setPosition(wildObj.getPosition());
  30. child.addObject(newWildObj);
  31. }
  32. int restAmount = parent1WildCardIndexes.size() - splitIdx;
  33. ArrayList<Integer> parent2WildCardIndexes = parent2.wildCardIndexes;
  34. for(int j = 0; j < restAmount; j++){
  35. int index = parent2WildCardIndexes.size() - 1; //greift auf letztes element zu
  36. index -= j; //greift bei jedem durchlauf auf ein weiter vorderes element zu
  37. if(index >= 0){
  38. int objIdx = parent2WildCardIndexes.get(index);
  39. AbstractCpsObject wildObj = parent2.indexToObjectMap.get(objIdx);
  40. AbstractCpsObject newWildObj = wildObj.makeCopy();
  41. newWildObj.setId(wildObj.getId());
  42. newWildObj.setPosition(wildObj.getPosition());
  43. child.addObject(newWildObj);
  44. }else{
  45. break;
  46. }
  47. }
  48. child.wildCardIndexes = parent1.wildCardIndexes;
  49. //OriginEdges
  50. splitIdx = (int) Math.ceil((double)parent1.getOriginalEdges().size()/2);
  51. for(int i = 0; i < splitIdx; i++){
  52. child.addOriginalEdge(parent1.getOriginalEdges().get(i));
  53. }
  54. restAmount = parent1.getOriginalEdges().size() - splitIdx;
  55. for(int j = 0; j < restAmount; j++){
  56. int idx = parent2.getOriginalEdges().size() - 1;
  57. idx -= j;
  58. if(idx >= 0){
  59. child.addOriginalEdge(parent2.getOriginalEdges().get(idx));
  60. }
  61. }
  62. //HolonEdges
  63. splitIdx = (int) Math.ceil((double)parent1.getAdditionalEdges().size()/2);
  64. for(int k = 0; k < splitIdx; k++){
  65. int posA = parent1.getAdditionalEdges().get(k).aPos;
  66. int posB = parent1.getAdditionalEdges().get(k).bPos;
  67. child.addEdge(posA, posB);
  68. }
  69. restAmount = parent1.getAdditionalEdges().size() - splitIdx;
  70. for(int l = 0; l < restAmount; l++){
  71. int idx = parent2.getAdditionalEdges().size() - 1;
  72. idx -= l;
  73. if(idx >= 0){
  74. int posA = parent2.getAdditionalEdges().get(idx).aPos;
  75. int posB = parent2.getAdditionalEdges().get(idx).bPos;
  76. child.addEdge(posA, posB);
  77. }
  78. }
  79. return child;
  80. }
  81. }