FlexibilityManager.java 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. public FlexibilityManager(HolonControlUnit hcu) {
  13. this.hcu = hcu;
  14. this.savesFlexManager = new HashMap<>();
  15. }
  16. public float applyFlexibilities(float requiredPower, ArrayList<Float> predictedPowerUsage, int timeStep) {
  17. FlexManager fm = getFlexManager(timeStep);
  18. List<Flexibility> offeredFlexes = fm.getAllFlexWrapperWithState(FlexState.OFFERED).stream().map(fw -> fw.getFlex()).collect(Collectors.toList());
  19. List<List<Flexibility>> offeredPerm = getAllPermutations(offeredFlexes);
  20. HashMap<Float, List<Flexibility>> map = new HashMap<>();
  21. for(List<Flexibility> l : offeredPerm) {
  22. float pu = 0f;
  23. // ArrayList<Float> pus = new ArrayList<>();
  24. for(Flexibility f : l) {
  25. pu += f.fulfillsConstrains() ? f.getElement().getEnergyPerElement() : 0f;
  26. if(Math.abs(pu) > Math.abs(requiredPower))
  27. break;
  28. }
  29. if(Math.abs(pu) <= Math.abs(requiredPower))
  30. map.put(pu, l);
  31. }
  32. float max = 0f;
  33. for(float f : map.keySet()) {
  34. if(Math.abs(f) > Math.abs(max)) {
  35. // System.out.println("cand "+f);
  36. max = f;
  37. }
  38. }
  39. if(map.containsKey(max)) {
  40. fm.orderFlexFromList(map.get(max));
  41. System.out.println(this.hcu.getHolon().getUniqueID()+" ordered flexes "+map.get(max));
  42. }
  43. return max;
  44. }
  45. public FlexManager getFlexManager(int timeStep) {
  46. boolean doesFlexManagerExist = savesFlexManager.containsKey(timeStep);
  47. boolean createNew = !doesFlexManagerExist;
  48. FlexManager newFlexManager;
  49. if(createNew) {
  50. newFlexManager = new FlexManager(List.of(this.hcu.getHolon().getHolonObject()), timeStep, savesFlexManager.get(timeStep-1));
  51. if(doesFlexManagerExist) newFlexManager.orderFlexFromList(savesFlexManager.get(timeStep).getAllFlexesOrderedThisTimeStep());
  52. savesFlexManager.put(timeStep, newFlexManager);
  53. }else {
  54. newFlexManager = savesFlexManager.get(timeStep);
  55. }
  56. // System.out.println("+++++++++");
  57. // newFlexManager.getAllFlexWrapper().stream().forEach(fw -> System.out.print(fw.getFlex().name+" "+fw.getState()+", "));
  58. // System.out.println("\n+++++++++");
  59. return newFlexManager;
  60. }
  61. public void orderFlex(Flexibility flex, int timeStep) {
  62. System.out.println(this.hcu.getHolon().getUniqueID()+" ordered flex "+flex);
  63. getFlexManager(timeStep).orderFlex(flex);
  64. }
  65. private <T> List<List<T>> getAllPermutations(List<T> set){
  66. List<List<T>> out = new ArrayList<List<T>>();
  67. for(int i=0; i<set.size(); i++) {
  68. for(int j=i; j<set.size(); j++) {
  69. List<T> l = new ArrayList<T>();
  70. l.addAll(set.subList(i, j+1));
  71. out.add(l);
  72. // System.out.println("\tsubset "+l);
  73. }
  74. // out.add(List.of(set.get(i)));
  75. }
  76. return out;
  77. }
  78. }