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; public FlexibilityManager(HolonControlUnit hcu) { this.hcu = hcu; this.savesFlexManager = new HashMap<>(); } public float applyFlexibilities(float requiredPower, ArrayList predictedPowerUsage, int timeStep) { FlexManager fm = getFlexManager(timeStep); List offeredFlexes = fm.getAllFlexWrapperWithState(FlexState.OFFERED).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<>(); for(Flexibility f : l) { pu += f.fulfillsConstrains() ? f.getElement().getEnergyPerElement() : 0f; if(Math.abs(pu) > Math.abs(requiredPower)) break; } if(Math.abs(pu) <= Math.abs(requiredPower)) map.put(pu, l); } float max = 0f; for(float f : map.keySet()) { if(Math.abs(f) > Math.abs(max)) { // System.out.println("cand "+f); max = f; } } if(map.containsKey(max)) { fm.orderFlexFromList(map.get(max)); System.out.println(this.hcu.getHolon().getUniqueID()+" ordered flexes "+map.get(max)); } return max; } 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); // System.out.println("\tsubset "+l); } // out.add(List.of(set.get(i))); } return out; } }