123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- 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(), null);
- ArrayList<HolegIndividual> parents = new ArrayList<HolegIndividual>();
- parents.add(parent1);
- parents.add(parent2);
- child.setParents(parents);
-
- ArrayList<Integer> parent1WildCardIndexes = parent1.wildCardIndexes;
- int splitIdx = (int) Math.ceil((double)parent1WildCardIndexes.size()/2);
-
- for(int i = 0; i < splitIdx; i++){
- int index = parent1WildCardIndexes.get(i);
-
- AbstractCpsObject wildObj = parent1.indexToObjectMap.get(index);
- AbstractCpsObject newWildObj = wildObj.makeCopy();
- newWildObj.setId(wildObj.getId());
- newWildObj.setPosition(wildObj.getPosition());
- child.addObject(newWildObj);
- }
- int restAmount = parent1WildCardIndexes.size() - splitIdx;
-
- ArrayList<Integer> parent2WildCardIndexes = parent2.wildCardIndexes;
- for(int j = 0; j < restAmount; j++){
- int index = parent2WildCardIndexes.size() - 1; //greift auf letztes element zu
- index -= j; //greift bei jedem durchlauf auf ein weiter vorderes element zu
- if(index >= 0){
- int objIdx = parent2WildCardIndexes.get(index);
-
- AbstractCpsObject wildObj = parent2.indexToObjectMap.get(objIdx);
- AbstractCpsObject newWildObj = wildObj.makeCopy();
- newWildObj.setId(wildObj.getId());
- newWildObj.setPosition(wildObj.getPosition());
- child.addObject(newWildObj);
- }else{
- break;
- }
- }
-
- child.wildCardIndexes = parent1.wildCardIndexes;
-
- //OriginEdges
- splitIdx = (int) Math.ceil((double)parent1.getOriginalEdges().size()/2);
- for(int i = 0; i < splitIdx; i++){
- child.addOriginalEdge(parent1.getOriginalEdges().get(i));
- }
-
- restAmount = parent1.getOriginalEdges().size() - splitIdx;
- for(int j = 0; j < restAmount; j++){
- int idx = parent2.getOriginalEdges().size() - 1;
- idx -= j;
- if(idx >= 0){
- child.addOriginalEdge(parent2.getOriginalEdges().get(idx));
- }
- }
-
- //HolonEdges
- splitIdx = (int) Math.ceil((double)parent1.getAdditionalEdges().size()/2);
- for(int k = 0; k < splitIdx; k++){
- int posA = parent1.getAdditionalEdges().get(k).aPos;
- int posB = parent1.getAdditionalEdges().get(k).bPos;
-
- child.addEdge(posA, posB);
- }
-
- restAmount = parent1.getAdditionalEdges().size() - splitIdx;
- for(int l = 0; l < restAmount; l++){
- int idx = parent2.getAdditionalEdges().size() - 1;
- idx -= l;
-
- if(idx >= 0){
- int posA = parent2.getAdditionalEdges().get(idx).aPos;
- int posB = parent2.getAdditionalEdges().get(idx).bPos;
-
- child.addEdge(posA, posB);
- }
- }
- return child;
- }
- }
|