HolegFactory.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package algorithms.geneticAlgorithm.holegGA.Components;
  2. import java.lang.reflect.Array;
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.util.ArrayList;
  6. import java.util.Collections;
  7. import java.util.Random;
  8. import classes.AbstractCpsObject;
  9. import classes.CpsEdge;
  10. import classes.CpsNode;
  11. import classes.HolonBattery;
  12. import classes.HolonObject;
  13. import classes.HolonSwitch;
  14. import classes.HolonWildCard;
  15. import algorithms.geneticAlgorithm.Components.GAIndividualFactory;
  16. import algorithms.geneticAlgorithm.holegGA.GAEdge;
  17. public class HolegFactory implements GAIndividualFactory<HolegIndividual> {
  18. ArrayList<AbstractCpsObject> objectSpace;
  19. public ArrayList<AbstractCpsObject> originalObjects;
  20. public ArrayList<CpsEdge> originalEdges;
  21. public int maxObjects;
  22. public int maxConnections;
  23. Random rng;
  24. public boolean editEdges;
  25. public HolegFactory(ArrayList<AbstractCpsObject> objects, int maxObjects, int maxConnections){
  26. objectSpace = objects;
  27. this.maxObjects = maxObjects;
  28. this.maxConnections = maxConnections;
  29. rng = new Random();
  30. originalObjects = new ArrayList<AbstractCpsObject>();
  31. originalEdges = new ArrayList<CpsEdge>();
  32. editEdges = false;
  33. }
  34. @Override
  35. public HolegIndividual createRandomIndividual() {
  36. HolegIndividual hI = new HolegIndividual(originalObjects, originalEdges);
  37. /*
  38. if(maxObjects > 0){
  39. createObjects(hI);
  40. }
  41. */
  42. setWildCards(hI);
  43. if(editEdges){
  44. editEdges(hI);
  45. }
  46. if(maxConnections > 0){
  47. createEdges(hI);
  48. }
  49. return hI;
  50. }
  51. private void setWildCards(HolegIndividual hI) {
  52. int setAmount = rng.nextInt(hI.getWildcardIndexes().size() + 1);
  53. ArrayList<Integer> list = new ArrayList<Integer>();
  54. list.addAll(hI.getWildcardIndexes());
  55. Collections.shuffle(list);
  56. int spaceIdx = 0;
  57. if(objectSpace.size() > 0){
  58. for(int i = 0; i < setAmount; i++){
  59. AbstractCpsObject wildCard = hI.indexToObjectMap.get(list.get(i));
  60. spaceIdx = rng.nextInt(objectSpace.size());
  61. AbstractCpsObject newObj = objectSpace.get(spaceIdx).makeCopy();
  62. newObj.setPosition(wildCard.getPosition());
  63. newObj.setId(wildCard.getId());
  64. hI.addObjectWithIdx(newObj, newObj.getId());
  65. }
  66. }
  67. }
  68. private void editEdges(HolegIndividual hI) {
  69. if(hI.getOriginalEdges().size() > 0 && hI.getIndexes().size() > 2){
  70. int editAmount = rng.nextInt(hI.getOriginalEdges().size());
  71. for(int i = 0; i < editAmount; i++){
  72. int edgeIdx = rng.nextInt(hI.getOriginalEdges().size());
  73. GAEdge toChange = hI.getOriginalEdges().get(edgeIdx);
  74. HolegMutation.changeSingleEdge(hI, toChange, true);
  75. }
  76. }
  77. }
  78. public void createObjects(HolegIndividual hI){
  79. int objCount = rng.nextInt(maxObjects) + 1;
  80. for(int i = 0; i < objCount; i++){
  81. AbstractCpsObject newObj = null;
  82. if(!editEdges){
  83. AbstractCpsObject absObj = objectSpace.get(rng.nextInt(objectSpace.size()));
  84. if(absObj instanceof HolonObject){
  85. newObj = new HolonObject(absObj);
  86. }else if(absObj instanceof HolonSwitch){
  87. newObj = new HolonSwitch(absObj);
  88. }else if(absObj instanceof HolonBattery){
  89. newObj = new HolonBattery(absObj);
  90. }else if(absObj instanceof HolonWildCard){
  91. newObj = new HolonWildCard(absObj);
  92. }else if(absObj == null){
  93. newObj = new CpsNode("Node");
  94. }
  95. }else{
  96. newObj = new CpsNode("Node");
  97. }
  98. //hI.holonObjects.add(newObj);
  99. hI.addObject(newObj);
  100. }
  101. }
  102. public void createEdges(HolegIndividual hI){
  103. if(hI.getIndexes().size() > 1){
  104. int edgeCount = rng.nextInt(maxConnections + 1);
  105. ArrayList<Integer> list = new ArrayList<Integer>();
  106. for (int i = 0; i < hI.getIndexes().size(); i++) {
  107. list.add(hI.getIndexes().get(i));
  108. }
  109. if(edgeCount >= hI.getAllEdges().size()){
  110. edgeCount -= hI.getAllEdges().size();
  111. }else{
  112. edgeCount = 0;
  113. }
  114. for(int i = 0; i < edgeCount; i++){
  115. Collections.shuffle(list);
  116. int aPos = list.get(0);
  117. int bPos = list.get(1);
  118. hI.addEdge(aPos, bPos);
  119. }
  120. }
  121. }
  122. }