HolegMutation.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package algorithms.geneticAlgorithm.holegGA.Components;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.Random;
  5. import classes.AbstractCpsObject;
  6. import classes.CpsEdge;
  7. import classes.CpsNode;
  8. import classes.HolonBattery;
  9. import classes.HolonObject;
  10. import classes.HolonSwitch;
  11. import algorithms.geneticAlgorithm.Components.GAMutationStrategy;
  12. import algorithms.geneticAlgorithm.holegGA.GAEdge;
  13. import algorithms.geneticAlgorithm.holegGA.ParameterArray;
  14. public class HolegMutation extends GAMutationStrategy<HolegIndividual>{
  15. public final int ADD_EDGE = 0;
  16. public final int REMOVE_EDGE = 1;
  17. public final int CHANGE_OBJECT = 0;
  18. public final int REMOVE_OBJECT = 1;
  19. ArrayList<AbstractCpsObject> objSpace;
  20. public boolean editEdges = false;
  21. public int maxConnections = 0;
  22. public double edgeMutationProb = 0;
  23. public HolegMutation(){
  24. super();
  25. }
  26. public HolegMutation(double prob){
  27. super(prob);
  28. }
  29. @Override
  30. public HolegIndividual mutateIndividual(HolegIndividual mutant) {
  31. for(Integer wildIdx : mutant.getWildcardIndexes()){
  32. if(rng.nextDouble() < mutationProb){
  33. switch(rng.nextInt(2)){
  34. case CHANGE_OBJECT :
  35. changeObject(mutant, wildIdx);
  36. break;
  37. case REMOVE_OBJECT :
  38. removeObject(mutant, wildIdx);
  39. break;
  40. }
  41. }
  42. }
  43. ArrayList<GAEdge> mutationEdges = new ArrayList<GAEdge>();
  44. int endIdx = 0;
  45. boolean isOriginal = false;
  46. if(editEdges){
  47. mutationEdges.addAll(mutant.getOriginalEdges());
  48. endIdx = mutationEdges.size(); //originalEdges müssen zuerst mutieren da sie sonst
  49. //verworfen werden falls additional Edge gleiche werte bekommt
  50. mutationEdges.addAll(mutant.getAdditionalEdges());
  51. }else{
  52. mutationEdges.addAll(mutant.getAdditionalEdges());
  53. }
  54. for(int i = 0; i < mutationEdges.size(); i++){
  55. if(rng.nextDouble() < edgeMutationProb){
  56. if(i < endIdx){
  57. changeSingleEdge(mutant, mutationEdges.get(i), true);
  58. }else{
  59. changeSingleEdge(mutant, mutationEdges.get(i), false);
  60. }
  61. }
  62. }
  63. if(rng.nextDouble() < edgeMutationProb){
  64. switch(rng.nextInt(2)){
  65. case ADD_EDGE:
  66. addEdge(mutant);
  67. break;
  68. case REMOVE_EDGE:
  69. removeEdge(mutant);
  70. break;
  71. }
  72. }
  73. return mutant;
  74. }
  75. public void removeObject(HolegIndividual mutant, int removeIdx) {
  76. ArrayList<CpsEdge> connections = new ArrayList<CpsEdge>();
  77. connections.addAll(mutant.getObjectWithIndex(removeIdx).getConnections());
  78. for(CpsEdge e : connections){
  79. e.getA().getConnections().remove(e);
  80. e.getB().getConnections().remove(e);
  81. }
  82. ArrayList<GAEdge> edgesToRemove = new ArrayList<GAEdge>();
  83. for(GAEdge gE : mutant.getAllEdges()){
  84. if(gE.aPos == removeIdx || gE.bPos == removeIdx){
  85. edgesToRemove.add(gE);
  86. }
  87. }
  88. mutant.getAllEdges().removeAll(edgesToRemove);
  89. mutant.addLogEntry("Object wit ID " + mutant.indexToObjectMap.get(removeIdx).getId() + " removed");
  90. mutant.removeObject(removeIdx);
  91. }
  92. public void changeObject(HolegIndividual mutant, int changeIdx) {
  93. if(objSpace.size() > 0){
  94. AbstractCpsObject newObj = null;
  95. AbstractCpsObject absObj = objSpace.get(rng.nextInt(objSpace.size()));
  96. newObj = absObj.makeCopy();
  97. AbstractCpsObject oldObject = mutant.getObjectWithIndex(changeIdx);
  98. for(CpsEdge e : oldObject.getConnections()){
  99. if(e.getA() == oldObject){
  100. e.setA(newObj);
  101. newObj.addConnection(e);
  102. }else if(e.getB() == oldObject){
  103. e.setB(newObj);
  104. newObj.addConnection(e);
  105. }
  106. }
  107. newObj.setId(oldObject.getId());
  108. newObj.setPosition(oldObject.getPosition());
  109. mutant.indexToObjectMap.put(changeIdx, newObj);
  110. mutant.addLogEntry("Object with Id " + newObj.getId() + " changed");
  111. }
  112. }
  113. public void removeEdge(HolegIndividual mutant) {
  114. ArrayList<GAEdge> edgesSpace = new ArrayList<GAEdge>();
  115. int spaceEndIdx = 0;
  116. if(editEdges){
  117. edgesSpace.addAll(mutant.getAdditionalEdges());
  118. spaceEndIdx = edgesSpace.size();
  119. edgesSpace.addAll(mutant.getOriginalEdges());
  120. }else{
  121. edgesSpace.addAll(mutant.getAdditionalEdges());
  122. spaceEndIdx = edgesSpace.size();
  123. }
  124. if(edgesSpace.size() > 0){
  125. int edgeIdx = rng.nextInt(edgesSpace.size());
  126. CpsEdge toRemove = edgesSpace.get(edgeIdx);
  127. toRemove.getA().getConnections().remove(toRemove);
  128. toRemove.getB().getConnections().remove(toRemove);
  129. if(edgeIdx < spaceEndIdx){
  130. mutant.getAdditionalEdges().remove(edgeIdx);
  131. }else{
  132. mutant.getOriginalEdges().remove(edgeIdx-spaceEndIdx);
  133. }
  134. mutant.addLogEntry("Edge (" + toRemove.getA().getId() + ","
  135. + toRemove.getB().getId() + ") removed");
  136. }
  137. }
  138. public void addEdge(HolegIndividual mutant) {
  139. if(mutant.getAllEdges().size() < maxConnections){
  140. if(mutant.getIndexes().size() > 1){
  141. ArrayList<Integer> list = new ArrayList<Integer>();
  142. list.addAll(mutant.getIndexes());
  143. Collections.shuffle(list);
  144. int aPos = list.get(0);
  145. int bPos = list.get(1);
  146. mutant.addEdge(aPos, bPos);
  147. mutant.addLogEntry("Edge (" + mutant.indexToObjectMap.get(aPos).getId() +
  148. "," + mutant.indexToObjectMap.get(bPos).getId() + ") added");
  149. }
  150. }
  151. }
  152. public void changeRandomEdge(HolegIndividual mutant) {
  153. ArrayList<GAEdge> edgeSpace;
  154. if(editEdges){
  155. edgeSpace = mutant.getAllEdges();
  156. }else{
  157. edgeSpace = mutant.getAdditionalEdges();
  158. }
  159. if(edgeSpace.size() > 0){
  160. int edgeIdx = rng.nextInt(edgeSpace.size());
  161. GAEdge toChange = edgeSpace.get(edgeIdx);
  162. boolean changeA = rng.nextBoolean();
  163. int randomIndex = rng.nextInt(mutant.getIndexes().size());
  164. randomIndex = mutant.getIndexes().get(randomIndex);
  165. if(changeA){
  166. toChange.getA().getConnections().remove(toChange);
  167. if(toChange.getB() != mutant.getObjectWithIndex(randomIndex)){
  168. toChange.setA(mutant.getObjectWithIndex(randomIndex));
  169. toChange.aPos = randomIndex;
  170. mutant.getObjectWithIndex(randomIndex).getConnections().add(toChange);
  171. }else{
  172. toChange.getB().getConnections().remove(toChange);
  173. mutant.getAdditionalEdges().remove(toChange);
  174. }
  175. }else{
  176. toChange.getB().getConnections().remove(toChange);
  177. if(toChange.getA() != mutant.getObjectWithIndex(randomIndex)){
  178. toChange.setB(mutant.getObjectWithIndex(randomIndex));
  179. toChange.bPos = randomIndex;
  180. mutant.getObjectWithIndex(randomIndex).getConnections().add(toChange);
  181. }else{
  182. toChange.getA().getConnections().remove(toChange);
  183. mutant.getAdditionalEdges().remove(toChange);
  184. }
  185. }
  186. }
  187. }
  188. public static void changeSingleEdge(HolegIndividual mutant, GAEdge toChange, boolean isOriginal){
  189. boolean changeA = rng.nextBoolean();
  190. int randomIndex = rng.nextInt(mutant.getIndexes().size());
  191. randomIndex = mutant.getIndexes().get(randomIndex);
  192. String logString = "Edge (" + toChange.aPos + "," + toChange.bPos +
  193. ") changed to ";
  194. if(mutant.getObjectWithIndex(randomIndex) != toChange.getA() &&
  195. mutant.getObjectWithIndex(randomIndex) != toChange.getB()){
  196. if(changeA && !mutant.edgeExists(randomIndex, toChange.bPos, mutant.getAllEdges())){
  197. toChange.getA().getConnections().remove(toChange);
  198. toChange.setA(mutant.getObjectWithIndex(randomIndex));
  199. toChange.aPos = randomIndex;
  200. mutant.getObjectWithIndex(randomIndex).getConnections().add(toChange);
  201. }else if(!mutant.edgeExists(randomIndex, toChange.aPos, mutant.getAllEdges())){
  202. toChange.getB().getConnections().remove(toChange);
  203. toChange.setB(mutant.getObjectWithIndex(randomIndex));
  204. toChange.bPos = randomIndex;
  205. mutant.getObjectWithIndex(randomIndex).getConnections().add(toChange);
  206. }
  207. }
  208. mutant.addLogEntry(logString + "(" + toChange.aPos + "," + toChange.bPos + ")");
  209. }
  210. public void setParameters(ParameterArray params){
  211. this.edgeMutationProb = (double)params.get(params.EDGE_MUTATION_PROB);
  212. this.setMutationProbability((double)params.get(params.WILDCARD_MUTATION_PROB));
  213. this.maxConnections = (int)params.get(params.MAX_EDGES);
  214. this.editEdges = (boolean)params.get(params.EDIT_EDGES);
  215. }
  216. public void setObjectSpace(ArrayList<AbstractCpsObject> space){
  217. objSpace = space;
  218. }
  219. public void setEdgeMutationProb(double prob){
  220. this.edgeMutationProb = prob;
  221. }
  222. }