FlexibilityManager.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package classes.holonControlUnit;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.stream.Collectors;
  6. import classes.Flexibility;
  7. import ui.controller.FlexManager;
  8. import ui.controller.FlexManager.FlexState;
  9. public class FlexibilityManager {
  10. private HolonControlUnit hcu;
  11. private HashMap<Integer, FlexManager> savesFlexManager;
  12. private int appliedFlexCounter;
  13. public FlexibilityManager(HolonControlUnit hcu) {
  14. this.hcu = hcu;
  15. this.savesFlexManager = new HashMap<>();
  16. this.appliedFlexCounter = 0;
  17. }
  18. public float applyFlexibilities(float currentPower, float requiredPower, ArrayList<Float> predictedPowerUsage, int timeStep) {
  19. FlexManager fm = getFlexManager(timeStep);
  20. List<Flexibility> offeredFlexes = fm.getAllFlexWrapperWithState(FlexState.OFFERED).stream().map(fw -> fw.getFlex()).collect(Collectors.toList());
  21. // System.out.println("offered flexes: "+offeredFlexes+"\nall: "+fm.getAllFlexWrapper().stream().map(fw -> fw.getFlex()).collect(Collectors.toList()));
  22. List<List<Flexibility>> offeredPerm = getAllPermutations(offeredFlexes);
  23. HashMap<Float, List<Flexibility>> map = new HashMap<>();
  24. for(List<Flexibility> l : offeredPerm) {
  25. float pu = 0f;
  26. // ArrayList<Float> pus = new ArrayList<>();
  27. Float[] savings = new Float[predictedPowerUsage.size()];
  28. for(int i=0; i<savings.length; i++)
  29. savings[i] = 0f;
  30. for(Flexibility f : l) {
  31. pu += f.fulfillsConstrains() ? f.getElement().getEnergyPerElement() : 0f;
  32. if(Math.abs(pu) > Math.abs(requiredPower))
  33. break;
  34. for(int i=0; i<Math.min(savings.length, f.getDuration()); i++) {
  35. savings[i] = savings[i] + f.bringtmir();
  36. // savings[i] = savings[i] + (f.fulfillsConstrains() ? f.getElement().getEnergyPerElement() : 0f);
  37. }
  38. // if(!this.hcu.decreasesPowerUsage(List.of(savings), currentPower, predictedPowerUsage, requiredPower))
  39. // break;
  40. }
  41. if(this.hcu.decreasesPowerUsage(List.of(savings), currentPower, predictedPowerUsage, requiredPower)) {
  42. float s = 0f;
  43. for(int i=0; i<savings.length; i++)
  44. s += savings[i];
  45. s = s/savings.length; //average saving over the next time periods
  46. if(map.containsKey(s) && map.get(s).size() >= l.size())
  47. continue;
  48. map.put(s, l);
  49. }
  50. }
  51. float min = Float.MAX_VALUE;
  52. for(float f : map.keySet()) {
  53. if(Math.abs(requiredPower-f) < Math.abs(requiredPower-min)) {
  54. min = f;
  55. }
  56. }
  57. if(map.containsKey(min)) {
  58. fm.orderFlexFromList(map.get(min));
  59. // System.out.println(this.hcu.getHolon().getUniqueID()+" ordered flexes "+map.get(min)+" "+requiredPower+" "+currentPower);
  60. this.appliedFlexCounter += map.get(min).size();
  61. return min;
  62. }
  63. return 0f;
  64. }
  65. public FlexManager getFlexManager(int timeStep) {
  66. boolean doesFlexManagerExist = savesFlexManager.containsKey(timeStep);
  67. boolean createNew = !doesFlexManagerExist;
  68. FlexManager newFlexManager;
  69. if(createNew) {
  70. newFlexManager = new FlexManager(List.of(this.hcu.getHolon().getHolonObject()), timeStep, savesFlexManager.get(timeStep-1));
  71. if(doesFlexManagerExist) newFlexManager.orderFlexFromList(savesFlexManager.get(timeStep).getAllFlexesOrderedThisTimeStep());
  72. savesFlexManager.put(timeStep, newFlexManager);
  73. }else {
  74. newFlexManager = savesFlexManager.get(timeStep);
  75. }
  76. // System.out.println("+++++++++");
  77. // newFlexManager.getAllFlexWrapper().stream().forEach(fw -> System.out.print(fw.getFlex().name+" "+fw.getState()+", "));
  78. // System.out.println("\n+++++++++");
  79. return newFlexManager;
  80. }
  81. public void orderFlex(Flexibility flex, int timeStep) {
  82. // System.out.println(this.hcu.getHolon().getUniqueID()+" ordered flex "+flex);
  83. getFlexManager(timeStep).orderFlex(flex);
  84. }
  85. private <T> List<List<T>> getAllPermutations(List<T> set){
  86. List<List<T>> out = new ArrayList<List<T>>();
  87. for(int i=0; i<set.size(); i++) {
  88. for(int j=i; j<set.size(); j++) {
  89. List<T> l = new ArrayList<T>();
  90. l.addAll(set.subList(i, j+1));
  91. out.add(l);
  92. }
  93. }
  94. return out;
  95. }
  96. public int getAppliedFlexCounter() {
  97. return appliedFlexCounter;
  98. }
  99. }