HolegCrossover.java 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package algorithms.geneticAlgorithm.holegGA;
  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();
  18. int splitIdx = (int) Math.ceil(parent1.holonObjects.size()/2);
  19. //HolonObjects
  20. for(int i = 0; i < splitIdx; i++){
  21. child.holonObjects.add(parent1.holonObjects.get(i).makeCopy());
  22. }
  23. int restAmount = parent1.holonObjects.size() - splitIdx;
  24. for(int j = 0; j < restAmount; j++){
  25. int idx = parent2.holonObjects.size() - 1; //greift auf letztes element zu
  26. idx -= j; //greift bei jedem durchlauf auf ein weiter vorderes element zu
  27. if(idx >= 0){
  28. child.holonObjects.add(parent2.holonObjects.get(idx).makeCopy());
  29. }else{
  30. break;
  31. }
  32. }
  33. //HolonEdges
  34. splitIdx = (int)Math.ceil(parent1.holonEdges.size()/2);
  35. for(int k = 0; k < splitIdx; k++){
  36. int posA = parent1.holonEdges.get(k).aPos;
  37. int posB = parent1.holonEdges.get(k).bPos;
  38. AbstractCpsObject objA;
  39. AbstractCpsObject objB;
  40. if(posA < child.holonObjects.size()){
  41. objA = child.holonObjects.get(posA);
  42. if(objA == null){
  43. objA = new CpsNode("Node");
  44. child.holonObjects.set(posA, objA);
  45. }
  46. }else{
  47. objA = new CpsNode("Node");
  48. child.holonObjects.add(objA);
  49. }
  50. if(posB < child.holonObjects.size()){
  51. objB = child.holonObjects.get(posB);
  52. if(objB == null){
  53. objB = new CpsNode("Node");
  54. child.holonObjects.set(posB, objB);
  55. }
  56. }else{
  57. objB = new CpsNode("Node");
  58. child.holonObjects.add(objB);
  59. }
  60. child.holonEdges.add(new GAEdge(posA, posB, objA, objB));
  61. }
  62. restAmount = parent1.holonEdges.size() - splitIdx;
  63. for(int l = 0; l < restAmount; l++){
  64. int idx = parent2.holonEdges.size() - 1;
  65. idx -= l;
  66. if(idx >= 0){
  67. int posA = parent2.holonEdges.get(idx).aPos;
  68. int posB = parent2.holonEdges.get(idx).bPos;
  69. AbstractCpsObject objA;
  70. AbstractCpsObject objB;
  71. if(posA < child.holonObjects.size()){
  72. objA = child.holonObjects.get(posA);
  73. }else{
  74. objA = new CpsNode("Node");
  75. child.holonObjects.add(objA); /// muss unbedingt geändert werden damit edges synchron sind
  76. }
  77. if(posB < child.holonObjects.size()){
  78. objB = child.holonObjects.get(posB);
  79. }else{
  80. objB = new CpsNode("Node");
  81. child.holonObjects.add(objB);
  82. }
  83. child.holonEdges.add(new GAEdge(posA, posB, objA, objB));
  84. }
  85. }
  86. return child;
  87. }
  88. }