123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- package algorithms.geneticAlgorithm.holegGA.Components;
- import java.util.ArrayList;
- import classes.AbstractCpsObject;
- import classes.CpsNode;
- import algorithms.geneticAlgorithm.Components.GACrossoverStrategy;
- public class HolegCrossover extends GACrossoverStrategy<HolegIndividual> {
- @Override
- public ArrayList<HolegIndividual> crossOver(ArrayList<HolegIndividual> parents) {
- HolegIndividual parent1 = parents.get(0);
- HolegIndividual parent2 = parents.get(1);
- ArrayList<HolegIndividual> children = new ArrayList<HolegIndividual>();
- children.add(createChild(parent1, parent2));
- children.add(createChild(parent2, parent1));
- return children;
- }
- private HolegIndividual createChild(HolegIndividual parent1, HolegIndividual parent2) {
- HolegIndividual child = new HolegIndividual(parent1.getOriginObjects());
- ArrayList<HolegIndividual> parents = new ArrayList<HolegIndividual>();
- parents.add(parent1);
- parents.add(parent2);
- child.setParents(parents);
-
- ArrayList<Integer> parent1NonOrgIndexes = parent1.getNonOriginIndexes();
- int splitIdx = (int) Math.ceil((double)parent1NonOrgIndexes.size()/2);
-
- //HolonObjects
- for(int i = 0; i < splitIdx; i++){
- int index = parent1NonOrgIndexes.get(i);
-
- child.addObjectWithIdx(parent1.indexToObjectMap.get(index).makeCopy(), index);
- }
- int restAmount = parent1NonOrgIndexes.size() - splitIdx;
-
- ArrayList<Integer> parent2NonOrgIndexes = parent2.getNonOriginIndexes();
- for(int j = 0; j < restAmount; j++){
- int index = parent2NonOrgIndexes.size() - 1; //greift auf letztes element zu
- index -= j; //greift bei jedem durchlauf auf ein weiter vorderes element zu
- if(index >= 0){
- int objIdx = parent2NonOrgIndexes.get(index);
- child.addObjectWithIdx(parent2.indexToObjectMap.get(objIdx).makeCopy(), objIdx);
- }else{
- break;
- }
- }
-
- //HolonEdges
- splitIdx = (int) Math.ceil((double)parent1.getEdges().size()/2);
- for(int k = 0; k < splitIdx; k++){
- int posA = parent1.getEdges().get(k).aPos;
- int posB = parent1.getEdges().get(k).bPos;
-
- child.addEdge(posA, posB);
-
- /*
- 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.getEdges().size() - splitIdx;
- for(int l = 0; l < restAmount; l++){
- int idx = parent2.getEdges().size() - 1;
- idx -= l;
-
- if(idx >= 0){
- int posA = parent2.getEdges().get(idx).aPos;
- int posB = parent2.getEdges().get(idx).bPos;
-
- child.addEdge(posA, posB);
-
- /*
- 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;
- }
- }
|