123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- package algorithms.geneticAlgorithm.holegGA;
- import java.util.ArrayList;
- import classes.AbstractCpsObject;
- import classes.Category;
- import classes.CpsEdge;
- import classes.Position;
- import ui.controller.Control;
- import ui.model.Model;
- import algorithms.geneticAlgorithm.Components.GAResultListener;
- import algorithms.geneticAlgorithm.holegGA.Components.HolegCrossover;
- import algorithms.geneticAlgorithm.holegGA.Components.HolegFactory;
- import algorithms.geneticAlgorithm.holegGA.Components.HolegIndividual;
- public class GenAlgoHandler {
-
- ArrayList<GAResultListener<HolegIndividual>> listeners = new ArrayList<GAResultListener<HolegIndividual>>();
- HolegFactory factory;
- Control controller;
- Model model;
- int genCount;
- boolean onlyNodes;
-
- public GenAlgoHandler(Control controller, Model model){
- this.controller = controller;
- this.model = model;
- genCount = 1;
- ArrayList<AbstractCpsObject> objSpace = new ArrayList<AbstractCpsObject>();
- for(Category cat : model.getCategories()){
- for(AbstractCpsObject obj : cat.getObjects()){
- objSpace.add(obj);
- }
- }
- ArrayList<AbstractCpsObject> origin = model.getObjectsOnCanvas();
- factory = new HolegFactory(objSpace, 5, 5);
- factory.originObjects = origin;
- onlyNodes = false;
- }
-
- public void createGeneration(int objAmount, int edgeAmount){
- factory.maxObjects = objAmount;
- factory.maxConnections = edgeAmount;
- factory.onlyNodes = onlyNodes;
- ArrayList<HolegIndividual> population = new ArrayList<HolegIndividual>();
- for(int i = 1; i <= 2; i++){
- population.add(factory.createRandomIndividual());
- }
- addPopulationListeners(genCount, population);
- genCount++;
-
- ArrayList<HolegIndividual> children = new ArrayList<HolegIndividual>();
- HolegCrossover hC = new HolegCrossover();
- //for(int j = 1; j <= 2; j++){
- children.addAll(hC.crossOver(population));
- //}
- addPopulationListeners(genCount, children);
- genCount++;
- }
-
- public void drawIndividual(HolegIndividual hI){
- if(hI.drawn){
- //draws Individual with the positions in the objects
- drawIndividualWithPos(hI);
- }else{
- //draws Individual as a default grid
- drawIndividualWithoutPos(hI);
- hI.drawn = true;
- }
- }
-
- public void drawIndividualWithPos(HolegIndividual hI){
- model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
- model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
-
- for(int i = 0; i < hI.getIndexes().size(); i++){
- controller.addObjectCanvas(hI.getObjectAt(i));
- }
-
- for(CpsEdge e : hI.getEdges()){
- controller.addEdgeOnCanvas(e);
- }
- }
-
- public void drawIndividualWithoutPos(HolegIndividual hI){
- model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
- model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
-
- int originBound = (int) Math.ceil(Math.sqrt(hI.originIndexes.size()));
- int row = -1;
-
- int x = 50;
- int y = 50;
- int dist = 100;
- boolean isX = true;
-
- int allBound = (int) Math.ceil(Math.sqrt(hI.indexes.size()));
-
- ArrayList<ArrayList<Integer>> objectField = new ArrayList<ArrayList<Integer>>();
- for(int i = 0; i < hI.originIndexes.size(); i++){
- if(i % originBound == 0){
- row++;
- objectField.add(new ArrayList<Integer>());
- }
- objectField.get(row).add(hI.originIndexes.get(i));
- }
-
- row = 0;
- for(int j = hI.originIndexes.size(); j < hI.indexes.size(); j++){
- boolean inserted = false;
- while(!inserted){
- if(objectField.size() <= row){
- objectField.add(new ArrayList<Integer>());
- objectField.get(row).add(hI.indexes.get(j));
- inserted = true;
- }else{
- if(objectField.get(row).size() < allBound){
- objectField.get(row).add(hI.indexes.get(j));
- inserted = true;
- }else{
- row++;
- }
- }
- }
- }
-
- for(int k = 0; k < objectField.size(); k++){
- for(int l = 0; l < objectField.get(k).size(); l++){
- AbstractCpsObject toDraw = hI.getObjectWithIndex(objectField.get(k).get(l));
- toDraw.setPosition(new Position(x + (l*dist), y +(k*dist)));
- controller.addObjectCanvas(toDraw);
- }
- }
-
- for(CpsEdge e : hI.getEdges()){
- controller.addEdgeOnCanvas(e);
- }
- }
-
- public void addListener(GAResultListener<HolegIndividual> listener){
- listeners.add(listener);
- }
-
- public void addPopulationListeners(int generation, ArrayList<HolegIndividual> population){
- for(GAResultListener<HolegIndividual> listener : listeners){
- listener.populationCreated(generation, population);
- }
- }
-
-
- }
|