Browse Source

Merge branch 'updateInProgress' of https://git.tk.informatik.tu-darmstadt.de/carlos.garcia/praktikum-holons.git into updateInProgress2

Rolf Egert 5 years ago
parent
commit
e92238d386

+ 3 - 1
src/classes/HolonElement.java

@@ -236,7 +236,9 @@ public class HolonElement implements LocalMode, GraphEditable{
     	//Bool logic XOR
     	return flexManager.isAFlexInUseOfHolonElement(this) ^ active;
     }
-    
+    public boolean isFlexActive(FlexManager flexManager) {
+    	return flexManager.isAFlexInUseOfHolonElement(this);
+    }
     
     /**
      * Set the Status of the Element (see description of variables).

+ 79 - 14
src/exampleAlgorithms/FlexExample.java

@@ -8,7 +8,9 @@ import java.awt.image.BufferedImage;
 import java.text.NumberFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -32,9 +34,11 @@ import api.Algorithm;
 import classes.AbstractCpsObject;
 import classes.CpsUpperNode;
 import classes.HolonElement;
+import classes.HolonElement.Priority;
 import classes.HolonObject;
 import classes.HolonSwitch;
 import ui.controller.Control;
+import ui.controller.FlexManager;
 import ui.controller.FlexManager.FlexState;
 import ui.controller.FlexManager.FlexWrapper;
 import ui.model.DecoratedGroupNode;
@@ -203,6 +207,7 @@ public class FlexExample implements Algorithm {
 			if(initialState != null) {
 				println("Resetting..");
 				resetState();
+				control.resetSimulation();
 				updateVisual();
 			}else {
 				println("No run inistialized.");
@@ -268,39 +273,99 @@ public class FlexExample implements Algorithm {
 		
 		
 		//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() {
 			extractPositionAndAccess();
 			int actualIteration = control.getModel().getCurIteration();
 			println("AlgoStart....");
 			control.calculateStateAndVisualForCurrentTimeStep();
+			List<Priority> priorityListASC = createPriorityListASC();
 			DecoratedState actualstate = control.getSimManager().getActualDecorState();	
 			for(DecoratedNetwork net : actualstate.getNetworkList()) {
 				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 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());
-				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....");
 			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.
 		 * Also initialize the Access Hashmap to swap faster positions.

+ 1 - 0
src/ui/view/AbstractCanvas.java

@@ -67,6 +67,7 @@ public abstract class AbstractCanvas extends JPanel {
 	ArrayList<HolonElement> dataSelected = new ArrayList<>();
 	ArrayList<AbstractCpsObject> tempSelected = new ArrayList<>();
 	boolean[] showedInformation = new boolean[5];
+	boolean showConnectionInformation;
 	boolean dragging = false; // for dragging
 	boolean dragged = false; // if an object/objects was/were dragged
 	boolean drawEdge = false; // for drawing edges

+ 2 - 0
src/ui/view/DisplayedInformationPopUp.java

@@ -90,6 +90,8 @@ public class DisplayedInformationPopUp extends JDialog {
 	 * @param nodeOfnode 
 	 */
 	private void setInformation(boolean connection, boolean object, boolean borders, boolean nodeOfnode) {
+		System.out.println("Test " + connection);
+		
 		canvas.setShowedInformation(connection, object, borders, nodeOfnode);
 		canvas.repaint();
 		toUpdate.updateUI();

+ 7 - 5
src/ui/view/MyCanvas.java

@@ -65,7 +65,7 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 		
 		scalediv20 = model.getScale() / 20;
 		
-		showedInformation[0] = true;
+		showConnectionInformation = true;
 		showedInformation[1] = true;
 		showedInformation[3] = false;
 		showedInformation[4] = true;
@@ -432,9 +432,11 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 			g.setColor(Color.lightGray);
 		}
 		g.drawLine(start.x, start.y, end.x, end.y);
-		Position middle = new Position((start.x + end.x) / 2, (start.y + end.y) / 2);
-		g.setFont(new Font("TimesRoman", Font.PLAIN, Math.max((int) (controller.getScale() / 3.5f), 10) )); 
-		g.drawString(currentEnergy + "/" + (unlimited?"\u221E":capacity) , middle.x, middle.y);
+		if(showConnectionInformation) {			
+			Position middle = new Position((start.x + end.x) / 2, (start.y + end.y) / 2);
+			g.setFont(new Font("TimesRoman", Font.PLAIN, Math.max((int) (controller.getScale() / 3.5f), 10) )); 
+			g.drawString(currentEnergy + "/" + (unlimited?"\u221E":capacity) , middle.x, middle.y);
+		}
 	}
 	private void paintSwitch(Graphics2D g, DecoratedSwitch dSwitch)
 	{
@@ -1112,7 +1114,7 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 	 */
 	void setShowedInformation(boolean connection, boolean object,
 			boolean border, boolean nodeOfnode) {
-		showedInformation[0] = connection;
+		showConnectionInformation = connection;
 		showedInformation[1] = object;
 		showedInformation[3] = border;
 		showedInformation[4] = nodeOfnode;