package classes.holonControlUnit; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; import classes.Flexibility; import ui.controller.FlexManager; import ui.controller.FlexManager.FlexState; public class FlexibilityManager { private HolonControlUnit hcu; private HashMap savesFlexManager; private int appliedFlexCounter; public FlexibilityManager(HolonControlUnit hcu) { this.hcu = hcu; this.savesFlexManager = new HashMap<>(); this.appliedFlexCounter = 0; } public float applyFlexibilities(float currentPower, float requiredPower, ArrayList predictedPowerUsage, int timeStep) { FlexManager fm = getFlexManager(timeStep); List offeredFlexes = fm.getAllFlexWrapperWithState(FlexState.OFFERED).stream().map(fw -> fw.getFlex()).collect(Collectors.toList()); // System.out.println("offered flexes: "+offeredFlexes+"\nall: "+fm.getAllFlexWrapper().stream().map(fw -> fw.getFlex()).collect(Collectors.toList())); List> offeredPerm = getAllPermutations(offeredFlexes); HashMap> map = new HashMap<>(); for(List l : offeredPerm) { float pu = 0f; // ArrayList pus = new ArrayList<>(); Float[] savings = new Float[predictedPowerUsage.size()]; for(int i=0; i Math.abs(requiredPower)) break; for(int i=0; i= l.size()) continue; map.put(s, l); } } float min = Float.MAX_VALUE; for(float f : map.keySet()) { if(Math.abs(requiredPower-f) < Math.abs(requiredPower-min)) { min = f; } } if(map.containsKey(min)) { fm.orderFlexFromList(map.get(min)); // System.out.println(this.hcu.getHolon().getUniqueID()+" ordered flexes "+map.get(min)+" "+requiredPower+" "+currentPower); this.appliedFlexCounter += map.get(min).size(); return min; } return 0f; } public FlexManager getFlexManager(int timeStep) { boolean doesFlexManagerExist = savesFlexManager.containsKey(timeStep); boolean createNew = !doesFlexManagerExist; FlexManager newFlexManager; if(createNew) { newFlexManager = new FlexManager(List.of(this.hcu.getHolon().getHolonObject()), timeStep, savesFlexManager.get(timeStep-1)); if(doesFlexManagerExist) newFlexManager.orderFlexFromList(savesFlexManager.get(timeStep).getAllFlexesOrderedThisTimeStep()); savesFlexManager.put(timeStep, newFlexManager); }else { newFlexManager = savesFlexManager.get(timeStep); } // System.out.println("+++++++++"); // newFlexManager.getAllFlexWrapper().stream().forEach(fw -> System.out.print(fw.getFlex().name+" "+fw.getState()+", ")); // System.out.println("\n+++++++++"); return newFlexManager; } public void orderFlex(Flexibility flex, int timeStep) { // System.out.println(this.hcu.getHolon().getUniqueID()+" ordered flex "+flex); getFlexManager(timeStep).orderFlex(flex); } private List> getAllPermutations(List set){ List> out = new ArrayList>(); for(int i=0; i l = new ArrayList(); l.addAll(set.subList(i, j+1)); out.add(l); } } return out; } public int getAppliedFlexCounter() { return appliedFlexCounter; } }