Evaluation.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package algorithm.objectiveFunction;
  2. import classes.HolonElement.Priority;
  3. import model.DecoratedNetwork;
  4. import model.DecoratedState;
  5. import model.DecoratedHolonObject.HolonObjectState;
  6. import classes.HolonObject;
  7. import ui.controller.FlexManager.FlexState;
  8. import ui.controller.FlexManager.FlexWrapper;
  9. public class Evaluation {
  10. /**
  11. * Calculate the Fitness(Penelty) Value for a state (alias the calculated Position).
  12. * TODO: Make me better Rolf.
  13. * @param state
  14. * @return
  15. */
  16. public static double getFitnessValueForState(DecoratedState state) {
  17. double fitness = 0.0;
  18. double nw_fitness =0.0;
  19. double object_fitness = 0.0;
  20. double flexFitness = 0.0;
  21. double sigma = 9;
  22. // calculate network_fitness
  23. for(DecoratedNetwork net : state.getNetworkList()) {
  24. float production = net.getSupplierList().stream().map(supplier -> supplier.getEnergyToSupplyNetwork()).reduce(0.0f, (a, b) -> a + b);
  25. float consumption = net.getConsumerList().stream().map(con -> con.getEnergyNeededFromNetwork()).reduce(0.0f, (a, b) -> a + b);
  26. nw_fitness += Math.abs((production - consumption)/100); //Energy is now everywhere positive
  27. }
  28. // calculate object_fitness
  29. for(DecoratedNetwork net : state.getNetworkList()) {
  30. object_fitness += net.getConsumerList().stream().map(con -> holonObjectSupplyPenaltyFunction(con.getSupplyBarPercentage()) /*+ inactiveHolonElementPenalty(con.getModel())*/).reduce(0.0, (a, b) -> (a + b));
  31. object_fitness += net.getConsumerList().stream().map(con -> StateToDouble(con.getState())).reduce(0.0, (a,b) -> (a+b));
  32. //object_fitness += net.getPassivNoEnergyList().stream().map(sup -> inactiveHolonElementPenalty(sup.getModel())).reduce(0.0, (a, b) -> (a + b));
  33. //object_fitness += net.getSupplierList().stream().map(sup -> inactiveHolonElementPenalty(sup.getModel())).reduce(0.0, (a, b) -> (a + b));
  34. //object_fitness += net.getConsumerSelfSuppliedList().stream().map(con -> inactiveHolonElementPenalty(con.getModel())).reduce(0.0, (a, b) -> (a + b));
  35. }
  36. // calculate flexibility fitness old cost flex
  37. /*for(FlexWrapper flexWrapper :state.getFlexManager().getAllFlexWrapperWithState(FlexState.IN_USE)) {
  38. flexFitness += flexWrapper.getFlex().cost / (double)flexWrapper.getFlex().getDuration();
  39. }*/
  40. for(FlexWrapper flexWrapper :state.getFlexManager().getAllFlexWrapperWithState(FlexState.IN_USE)) {
  41. flexFitness += Math.pow(sigma, (double)priorityToInt(flexWrapper.getFlex().getElement().getPriority())) - 1;
  42. }
  43. fitness = nw_fitness + object_fitness + flexFitness;
  44. return fitness;
  45. }
  46. private static int priorityToInt(Priority priority) {
  47. switch(priority) {
  48. case Essential:
  49. return 3;
  50. case High:
  51. return 2;
  52. case Medium:
  53. return 1;
  54. case Low:
  55. default:
  56. return 0;
  57. }
  58. }
  59. /**
  60. * Untouched:
  61. * Function that returns the fitness depending on the number of elements deactivated in a single holon object
  62. * @param obj Holon Object that contains Holon Elements
  63. * @return fitness value for that object depending on the number of deactivated holon elements
  64. */
  65. @SuppressWarnings("unused")
  66. private static double inactiveHolonElementPenalty(HolonObject obj) {
  67. float result = 0;
  68. int activeElements = obj.getNumberOfActiveElements();
  69. int maxElements = obj.getElements().size();
  70. //result = (float) Math.pow((maxElements -activeElements),2)*10;
  71. result = (float) Math.pow(5, 4* ( (float) maxElements - (float) activeElements)/ (float) maxElements) - 1;
  72. //System.out.console.println("max: " + maxElements + " active: " + activeElements + " results in penalty: " + result);
  73. return result;
  74. }
  75. /**
  76. * Untouched:
  77. * Calculates a penalty value based on the HOs current supply percentage
  78. * @param supplyPercentage
  79. * @return
  80. */
  81. private static double holonObjectSupplyPenaltyFunction(float supplyPercentage) {
  82. double result = 0;
  83. /*if(supplyPercentage == 1)
  84. return result;
  85. else if(supplyPercentage < 1 && supplyPercentage >= 0.25) // undersupplied inbetween 25% and 100%
  86. result = (float) Math.pow(1/supplyPercentage, 2);
  87. else if (supplyPercentage < 0.25) //undersupplied with less than 25%
  88. result = (float) Math.pow(1/supplyPercentage,2);
  89. else if (supplyPercentage < 1.25) //Oversupplied less than 25%
  90. result = (float) Math.pow(supplyPercentage,3) ;
  91. else result = (float) Math.pow(supplyPercentage,4); //Oversupplied more than 25%
  92. if(Float.isInfinite(result) || Float.isNaN(result))
  93. result = 1000;
  94. */
  95. if(supplyPercentage <= 1.0) {
  96. result = Math.pow(5,(Math.abs((100 - (supplyPercentage*100)))/50 + 2)) - Math.pow(5, 2);
  97. }
  98. else {
  99. result = Math.pow(6,(Math.abs((100 - (supplyPercentage*100)))/50 + 2)) - Math.pow(6, 2);
  100. }
  101. if(result > 1000)System.out.println("supplyPenalty(" + supplyPercentage + ")=" + result);
  102. return result;
  103. }
  104. /**
  105. * If you want to get in touch with a reliable state? Working function not in use currently.
  106. * @param state
  107. * @return
  108. */
  109. private static double StateToDouble(HolonObjectState state) {
  110. switch (state) {
  111. case NOT_SUPPLIED:
  112. return 150.0;
  113. case NO_ENERGY:
  114. return 150.0;
  115. case OVER_SUPPLIED:
  116. return 100.0;
  117. case PARTIALLY_SUPPLIED:
  118. return 100.0;
  119. case PRODUCER:
  120. return 0;
  121. case SUPPLIED:
  122. return 0;
  123. default:
  124. return 0;
  125. }
  126. }
  127. }