package algorithms.geneticAlgorithm.holegGA; import java.util.ArrayList; import classes.AbstractCpsObject; import classes.CpsNode; import algorithms.geneticAlgorithm.Components.GACrossoverStrategy; public class HolegCrossover extends GACrossoverStrategy { @Override public ArrayList crossOver(ArrayList parents) { HolegIndividual parent1 = parents.get(0); HolegIndividual parent2 = parents.get(1); ArrayList children = new ArrayList(); children.add(createChild(parent1, parent2)); children.add(createChild(parent2, parent1)); return children; } private HolegIndividual createChild(HolegIndividual parent1, HolegIndividual parent2) { HolegIndividual child = new HolegIndividual(); int splitIdx = (int) Math.ceil(parent1.holonObjects.size()/2); //HolonObjects for(int i = 0; i < splitIdx; i++){ child.holonObjects.add(parent1.holonObjects.get(i).makeCopy()); } int restAmount = parent1.holonObjects.size() - splitIdx; for(int j = 0; j < restAmount; j++){ int idx = parent2.holonObjects.size() - 1; //greift auf letztes element zu idx -= j; //greift bei jedem durchlauf auf ein weiter vorderes element zu if(idx >= 0){ child.holonObjects.add(parent2.holonObjects.get(idx).makeCopy()); }else{ break; } } //HolonEdges splitIdx = (int)Math.ceil(parent1.holonEdges.size()/2); for(int k = 0; k < splitIdx; k++){ int posA = parent1.holonEdges.get(k).aPos; int posB = parent1.holonEdges.get(k).bPos; AbstractCpsObject objA; AbstractCpsObject objB; if(posA < child.holonObjects.size()){ objA = child.holonObjects.get(posA); if(objA == null){ objA = new CpsNode("Node"); child.holonObjects.set(posA, objA); } }else{ objA = new CpsNode("Node"); child.holonObjects.add(objA); } if(posB < child.holonObjects.size()){ objB = child.holonObjects.get(posB); if(objB == null){ objB = new CpsNode("Node"); child.holonObjects.set(posB, objB); } }else{ objB = new CpsNode("Node"); child.holonObjects.add(objB); } child.holonEdges.add(new GAEdge(posA, posB, objA, objB)); } restAmount = parent1.holonEdges.size() - splitIdx; for(int l = 0; l < restAmount; l++){ int idx = parent2.holonEdges.size() - 1; idx -= l; if(idx >= 0){ int posA = parent2.holonEdges.get(idx).aPos; int posB = parent2.holonEdges.get(idx).bPos; AbstractCpsObject objA; AbstractCpsObject objB; if(posA < child.holonObjects.size()){ objA = child.holonObjects.get(posA); }else{ objA = new CpsNode("Node"); child.holonObjects.add(objA); /// muss unbedingt geändert werden damit edges synchron sind } if(posB < child.holonObjects.size()){ objB = child.holonObjects.get(posB); }else{ objB = new CpsNode("Node"); child.holonObjects.add(objB); } child.holonEdges.add(new GAEdge(posA, posB, objA, objB)); } } return child; } }