|
@@ -8,7 +8,9 @@ import java.awt.image.BufferedImage;
|
|
import java.text.NumberFormat;
|
|
import java.text.NumberFormat;
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
|
|
+import java.util.HashSet;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
+import java.util.Set;
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Stream;
|
|
import java.util.stream.Stream;
|
|
@@ -32,9 +34,11 @@ import api.Algorithm;
|
|
import classes.AbstractCpsObject;
|
|
import classes.AbstractCpsObject;
|
|
import classes.CpsUpperNode;
|
|
import classes.CpsUpperNode;
|
|
import classes.HolonElement;
|
|
import classes.HolonElement;
|
|
|
|
+import classes.HolonElement.Priority;
|
|
import classes.HolonObject;
|
|
import classes.HolonObject;
|
|
import classes.HolonSwitch;
|
|
import classes.HolonSwitch;
|
|
import ui.controller.Control;
|
|
import ui.controller.Control;
|
|
|
|
+import ui.controller.FlexManager;
|
|
import ui.controller.FlexManager.FlexState;
|
|
import ui.controller.FlexManager.FlexState;
|
|
import ui.controller.FlexManager.FlexWrapper;
|
|
import ui.controller.FlexManager.FlexWrapper;
|
|
import ui.model.DecoratedGroupNode;
|
|
import ui.model.DecoratedGroupNode;
|
|
@@ -203,6 +207,7 @@ public class FlexExample implements Algorithm {
|
|
if(initialState != null) {
|
|
if(initialState != null) {
|
|
println("Resetting..");
|
|
println("Resetting..");
|
|
resetState();
|
|
resetState();
|
|
|
|
+ control.resetSimulation();
|
|
updateVisual();
|
|
updateVisual();
|
|
}else {
|
|
}else {
|
|
println("No run inistialized.");
|
|
println("No run inistialized.");
|
|
@@ -268,39 +273,99 @@ public class FlexExample implements Algorithm {
|
|
|
|
|
|
|
|
|
|
//Algo Part:
|
|
//Algo Part:
|
|
-
|
|
|
|
|
|
+ /**
|
|
|
|
+ * The Execution of the FlexAlgo.
|
|
|
|
+ *
|
|
|
|
+ *
|
|
|
|
+ * Begin
|
|
|
|
+ * for(All Networks) do
|
|
|
|
+ *
|
|
|
|
+ * if(not (production < consumption)) continue;
|
|
|
|
+ *
|
|
|
|
+ *
|
|
|
|
+ * for(Priority emergencyShutDownPriority: priorityListASC) do
|
|
|
|
+ * difference = Math.abs(production - consumption);
|
|
|
|
+ * amountOfAllEnergyOffered = sumEnergyAvailable(flexList);
|
|
|
|
+ * if(amountOfAllEnergyOffered > difference) break;
|
|
|
|
+ * shutDownAllConsumerWithPriority(emergencyShutDownPriority)
|
|
|
|
+ * end for
|
|
|
|
+ *
|
|
|
|
+ * takeAKombinationOfOffers(); (nach welchem Kriterium)
|
|
|
|
+ *
|
|
|
|
+ *
|
|
|
|
+ * end for
|
|
|
|
+ * End
|
|
|
|
+ *
|
|
|
|
+ */
|
|
private void executeDemoAlgo() {
|
|
private void executeDemoAlgo() {
|
|
extractPositionAndAccess();
|
|
extractPositionAndAccess();
|
|
int actualIteration = control.getModel().getCurIteration();
|
|
int actualIteration = control.getModel().getCurIteration();
|
|
println("AlgoStart....");
|
|
println("AlgoStart....");
|
|
control.calculateStateAndVisualForCurrentTimeStep();
|
|
control.calculateStateAndVisualForCurrentTimeStep();
|
|
|
|
+ List<Priority> priorityListASC = createPriorityListASC();
|
|
DecoratedState actualstate = control.getSimManager().getActualDecorState();
|
|
DecoratedState actualstate = control.getSimManager().getActualDecorState();
|
|
for(DecoratedNetwork net : actualstate.getNetworkList()) {
|
|
for(DecoratedNetwork net : actualstate.getNetworkList()) {
|
|
float production = net.getSupplierList().stream().map(supplier -> supplier.getEnergyToSupplyNetwork()).reduce(0.0f, (a, b) -> a + b);
|
|
float production = net.getSupplierList().stream().map(supplier -> supplier.getEnergyToSupplyNetwork()).reduce(0.0f, (a, b) -> a + b);
|
|
float consumption = net.getConsumerList().stream().map(con -> con.getEnergyNeededFromNetwork()).reduce(0.0f, (a, b) -> a + b);
|
|
float consumption = net.getConsumerList().stream().map(con -> con.getEnergyNeededFromNetwork()).reduce(0.0f, (a, b) -> a + b);
|
|
float difference = Math.abs(production - consumption);
|
|
float difference = Math.abs(production - consumption);
|
|
- boolean toMuchEnergy = production - consumption > 0;
|
|
|
|
- boolean notEnoughEnergy = production - consumption > 0;
|
|
|
|
- if(notEnoughEnergy)
|
|
|
|
- println("production:" + production + " consumption:" + consumption + " difference:" + difference);
|
|
|
|
- List<FlexWrapper> allOfferedFlex = control.getSimManager().getActualFlexManager().getAllFlexWrapperWithState(FlexState.OFFERED);
|
|
|
|
|
|
+ println("production: " + production);
|
|
|
|
+ println("consumption: " + consumption);
|
|
|
|
+ println("difference: " + difference);
|
|
|
|
+ Set<HolonElement> allHolonElemntsInThisNetwork = createListOfAllHolonElemnts(net);
|
|
|
|
+ FlexManager flexManager = control.getSimManager().getActualFlexManager();
|
|
|
|
+
|
|
|
|
+ List<FlexWrapper> allOfferedFlex = flexManager.getAllFlexWrapperWithState(FlexState.OFFERED).stream().filter(flexWrapper -> allHolonElemntsInThisNetwork.contains(flexWrapper.getFlex().getElement())).collect(Collectors.toList());
|
|
List<FlexWrapper> allFlexThatGetMeEnergy = allOfferedFlex.stream().filter(flexWrapper -> (flexWrapper.getFlex().bringtmir() > 0)).collect(Collectors.toList());
|
|
List<FlexWrapper> allFlexThatGetMeEnergy = allOfferedFlex.stream().filter(flexWrapper -> (flexWrapper.getFlex().bringtmir() > 0)).collect(Collectors.toList());
|
|
- float energyICanOrder = allFlexThatGetMeEnergy.stream().map(flexWrapper -> flexWrapper.getFlex().bringtmir()).reduce(0.0f,(a, b) -> a + b);
|
|
|
|
- println("canOrder: " + energyICanOrder);
|
|
|
|
- List<FlexWrapper> orderedOfferedFlexes = allFlexThatGetMeEnergy.stream().sorted((flex1, flex2) -> Float.compare(flex1.getFlex().bringtmir(), flex2.getFlex().bringtmir())).collect(Collectors.toList());
|
|
|
|
- for(FlexWrapper flex : orderedOfferedFlexes){
|
|
|
|
- System.out.println(flex.getFlex().name +" " +flex.getFlex().bringtmir());
|
|
|
|
- if(flex.getFlex().bringtmir() > difference) break;
|
|
|
|
- flex.order();
|
|
|
|
- difference -= Math.abs(flex.getFlex().bringtmir());
|
|
|
|
|
|
+ float amountOfAllEnergyOffered = sumEnergyAvailable(allFlexThatGetMeEnergy);
|
|
|
|
+ println("amountOfAllEnergyOffered:" + amountOfAllEnergyOffered);
|
|
|
|
+ println("vor continue");
|
|
|
|
+ if(production > consumption) continue;
|
|
|
|
+ println("nach continue");
|
|
|
|
+ if(priorityListASC != null) println("sdfsdf");
|
|
|
|
+ priorityListASC.stream().forEach(prio -> println("Prio"));
|
|
|
|
+ for(Priority emergencyShutDownPriority: priorityListASC) {
|
|
|
|
+ println("Wir sind hier: " + emergencyShutDownPriority);
|
|
|
|
+ if(amountOfAllEnergyOffered >= difference) break;
|
|
|
|
+ println("ShutDown: " + emergencyShutDownPriority);
|
|
|
|
+ difference -= shutDownAllConsumerElementsWithPriority(flexManager, allHolonElemntsInThisNetwork, emergencyShutDownPriority);
|
|
}
|
|
}
|
|
|
|
+ println("Ende");
|
|
|
|
+
|
|
|
|
|
|
}
|
|
}
|
|
println("AlgoEnde....");
|
|
println("AlgoEnde....");
|
|
updateVisual();
|
|
updateVisual();
|
|
}
|
|
}
|
|
|
|
+ private float shutDownAllConsumerElementsWithPriority(FlexManager flexManager, Set<HolonElement> allHolonElemntsInThisNetwork,
|
|
|
|
+ Priority emergencyShutDownPriority) {
|
|
|
|
+
|
|
|
|
+ List<HolonElement> elementsOfPriorityToShutdown = allHolonElemntsInThisNetwork.stream().filter(hElement -> hElement.isConsumer() && hElement.getPriority() == emergencyShutDownPriority && !hElement.isFlexActive(flexManager) && hElement.isActive()).collect(Collectors.toList());
|
|
|
|
+ //.forEach(hElement -> hElement.setActive(false));
|
|
|
|
+ float energyGained = elementsOfPriorityToShutdown.stream().map(hElement -> -hElement.getEnergyPerElement() * hElement.getAmount()).reduce(0.0f, (a, b) -> a + b);
|
|
|
|
+ elementsOfPriorityToShutdown.forEach(hElement -> hElement.setActive(false));
|
|
|
|
+ println("Gained " + energyGained + "Energy from Shutdown with Priority:" + emergencyShutDownPriority);
|
|
|
|
+ return energyGained;
|
|
|
|
+ }
|
|
|
|
+ private Set<HolonElement> createListOfAllHolonElemnts(DecoratedNetwork net) {
|
|
|
|
+ Set<HolonElement> allHolonElemntsInThisNetwork = new HashSet<HolonElement>();
|
|
|
|
+ allHolonElemntsInThisNetwork.addAll(net.getConsumerList().stream().flatMap(con -> con.getModel().getElements().stream()).collect(Collectors.toList()));
|
|
|
|
+ allHolonElemntsInThisNetwork.addAll(net.getConsumerSelfSuppliedList().stream().flatMap(con -> con.getModel().getElements().stream()).collect(Collectors.toList()));
|
|
|
|
+ allHolonElemntsInThisNetwork.addAll(net.getSupplierList().stream().flatMap(con -> con.getModel().getElements().stream()).collect(Collectors.toList()));
|
|
|
|
+ return allHolonElemntsInThisNetwork;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
|
|
+ private float sumEnergyAvailable(List<FlexWrapper> flexList) {
|
|
|
|
+ return flexList.stream().map(flexWrapper -> flexWrapper.getFlex().bringtmir()).reduce(0.0f,(a, b) -> a + b);
|
|
|
|
+ }
|
|
|
|
+ private List<Priority> createPriorityListASC() {
|
|
|
|
+ List<Priority> priorityASC = new ArrayList<Priority>();
|
|
|
|
+ priorityASC.add(Priority.Low);
|
|
|
|
+ priorityASC.add(Priority.Medium);
|
|
|
|
+ priorityASC.add(Priority.High);
|
|
|
|
+ priorityASC.add(Priority.Essential);
|
|
|
|
+ return priorityASC;
|
|
|
|
+ }
|
|
/**
|
|
/**
|
|
* Method to get the current Position alias a ListOf Booleans for aktive settings on the Objects on the Canvas.
|
|
* Method to get the current Position alias a ListOf Booleans for aktive settings on the Objects on the Canvas.
|
|
* Also initialize the Access Hashmap to swap faster positions.
|
|
* Also initialize the Access Hashmap to swap faster positions.
|