DecoratedNetwork.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. package ui.model;
  2. import java.util.ArrayList;
  3. import classes.HolonObject;
  4. import ui.controller.FlexManager;
  5. import ui.model.DecoratedCable.CableState;
  6. import ui.model.DecoratedHolonObject.HolonObjectState;
  7. import ui.model.Model.FairnessModel;
  8. public class DecoratedNetwork {
  9. private ArrayList<Supplier> supplierList = new ArrayList<Supplier>();
  10. private ArrayList<Consumer> consumerList = new ArrayList<Consumer>();
  11. private ArrayList<Consumer> consumerSelfSuppliedList = new ArrayList<Consumer>();
  12. private ArrayList<Passiv> passivNoEnergyList = new ArrayList<Passiv>();
  13. private ArrayList<DecoratedCable> decoratedCableList = new ArrayList<DecoratedCable>();
  14. public DecoratedNetwork(MinimumNetwork minimumNetwork, int Iteration, FairnessModel actualFairnessModel, FlexManager flexManager){
  15. switch(actualFairnessModel) {
  16. case AllEqual:
  17. calculateAllEqualNetwork(minimumNetwork, Iteration, flexManager);
  18. break;
  19. case MininumDemandFirst:
  20. default:
  21. calculateMinimumDemandFirstNetwork(minimumNetwork, Iteration, flexManager);
  22. break;
  23. }
  24. }
  25. //Getter:
  26. public ArrayList<Supplier> getSupplierList() {
  27. return supplierList;
  28. }
  29. public ArrayList<Consumer> getConsumerList() {
  30. return consumerList;
  31. }
  32. public ArrayList<Consumer> getConsumerSelfSuppliedList() {
  33. return consumerSelfSuppliedList;
  34. }
  35. public ArrayList<Passiv> getPassivNoEnergyList() {
  36. return passivNoEnergyList;
  37. }
  38. public ArrayList<DecoratedCable> getDecoratedCableList(){
  39. return decoratedCableList;
  40. }
  41. //Calculations:
  42. private void calculateMinimumDemandFirstNetwork(MinimumNetwork minimumNetwork, int Iteration, FlexManager flexManager) {
  43. categorize(minimumNetwork, Iteration, flexManager);
  44. //Sort SupplierList according to the EnergyToSupplyNetwork maximum first.
  45. //Sort ConsumerList according to the MinimumConsumingElementEnergy minimum first.
  46. supplierList.sort((Supplier lhs,Supplier rhs) -> -Float.compare(lhs.getEnergyToSupplyNetwork(), rhs.getEnergyToSupplyNetwork()));
  47. consumerList.sort((Consumer lhs,Consumer rhs) -> Float.compare(lhs.getMinimumConsumingElementEnergy() , rhs.getMinimumConsumingElementEnergy()));
  48. //consumerList.forEach((con) -> System.out.println(con.getMinimumConsumingElementEnergy()));
  49. //consumerList.forEach((con) -> System.out.println("AfterSorting" + con));
  50. float energyToSupplyInTheNetwork = supplierList.stream().map(supplier -> supplier.getEnergyToSupplyNetwork() - supplier.getEnergySupplied()).reduce( 0.0f, (a, b) -> a + b);
  51. decorateCable(minimumNetwork, energyToSupplyInTheNetwork);
  52. outerLoop:
  53. for(Consumer con : consumerList)
  54. {
  55. //gehe Supplier list durch wer ihn supplien kann.
  56. for(Supplier sup : supplierList) {
  57. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  58. if(energyRdyToSupply == 0.0f) continue;
  59. float energyNeededForMinimumConsumingElement=con.getMinimumConsumingElementEnergy()-con.getEnergyFromNetwork();
  60. if(energyNeededForMinimumConsumingElement>energyToSupplyInTheNetwork) {
  61. //Dont supply a minimumElement when you cant supply it fully
  62. break outerLoop;
  63. }
  64. if(energyRdyToSupply>=energyNeededForMinimumConsumingElement) {
  65. energyToSupplyInTheNetwork -= energyNeededForMinimumConsumingElement;
  66. supply(con, sup, energyNeededForMinimumConsumingElement);
  67. continue outerLoop;
  68. }else
  69. {
  70. energyToSupplyInTheNetwork -= energyRdyToSupply;
  71. supply(con, sup, energyRdyToSupply);
  72. }
  73. }
  74. //No more Energy in the network
  75. break;
  76. }
  77. //consumerList.forEach((con) -> System.out.println("AfterSuppliing MinimumDemand " + con));
  78. //Sort ConsumerList according to the EnergyNeeded to supply fully after minimum Demand First.
  79. consumerList.sort((Consumer lhs,Consumer rhs) -> Float.compare(lhs.getEnergyNeededFromNetwork()-lhs.getEnergyFromNetwork() , rhs.getEnergyNeededFromNetwork()-rhs.getEnergyFromNetwork() ));
  80. //Supply consumer fully
  81. outerLoop:
  82. for(Consumer con : consumerList)
  83. {
  84. //gehe Supplier list durch wer ihn supplien kann.
  85. for(Supplier sup : supplierList) {
  86. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  87. if(energyRdyToSupply == 0.0f) continue;
  88. float energyNeededForFullySupply = con.getEnergyNeededFromNetwork() - con.getEnergyFromNetwork();
  89. if(energyNeededForFullySupply == 0.0f) continue outerLoop;
  90. if(energyRdyToSupply>=energyNeededForFullySupply) {
  91. supply(con, sup, energyNeededForFullySupply);
  92. continue outerLoop;
  93. }else
  94. {
  95. supply(con, sup, energyRdyToSupply);
  96. }
  97. }
  98. //No more Energy in the network
  99. break;
  100. }
  101. //consumerList.forEach((con) -> System.out.println("AfterFullySuplieing" + con));
  102. //If Energy Left Supply all equal
  103. //Count EnergyLeft
  104. float energyLeft = supplierList.stream().map(supplier -> supplier.getEnergyToSupplyNetwork() - supplier.getEnergySupplied()).reduce( 0.0f, (a, b) -> a + b);
  105. //System.out.println("EnergyLeft: " + energyLeft);
  106. if(energyLeft > 0.0f && (consumerList.size() + consumerSelfSuppliedList.size() != 0))
  107. {
  108. float equalAmountOfEnergyToSupply = energyLeft / ((float)(consumerList.size() + consumerSelfSuppliedList.size()));
  109. outerLoop:
  110. for(Consumer con : consumerList)
  111. {
  112. //gehe Supplier list durch wer ihn supplien kann.
  113. for(Supplier sup : supplierList) {
  114. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  115. if(energyRdyToSupply == 0.0f) continue;
  116. float energyNeededToSupplyConsumerTheEqualAmount = equalAmountOfEnergyToSupply +con.getEnergyNeededFromNetwork()- con.getEnergyFromNetwork();
  117. if(energyRdyToSupply>=energyNeededToSupplyConsumerTheEqualAmount) {
  118. supply(con, sup, energyNeededToSupplyConsumerTheEqualAmount);
  119. continue outerLoop;
  120. }else
  121. {
  122. supply(con, sup, energyRdyToSupply);
  123. }
  124. }
  125. //No more Energy in the network
  126. break;
  127. }
  128. outerLoop:
  129. for(Consumer con : consumerSelfSuppliedList)
  130. {
  131. //gehe Supplier list durch wer ihn supplien kann.
  132. for(Supplier sup : supplierList) {
  133. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  134. if(energyRdyToSupply == 0.0f) continue;
  135. float energyNeededToSupplyConsumerTheEqualAmount = equalAmountOfEnergyToSupply +con.getEnergyNeededFromNetwork()- con.getEnergyFromNetwork();
  136. if(energyRdyToSupply>=energyNeededToSupplyConsumerTheEqualAmount) {
  137. supply(con, sup, energyNeededToSupplyConsumerTheEqualAmount);
  138. continue outerLoop;
  139. }else
  140. {
  141. supply(con, sup, energyRdyToSupply);
  142. }
  143. }
  144. //No more Energy in the network
  145. break;
  146. }
  147. }
  148. //consumerList.forEach((con) -> System.out.println("AfterOverSuppleiing" + con));
  149. //consumerSelfSuppliedList.forEach((con) -> System.out.println("AfterOverSuppleiing" + con));
  150. calculateStates();
  151. }
  152. private void decorateCable(MinimumNetwork minimumNetwork, float energyToSupplyInTheNetwork) {
  153. //DecoratedCables
  154. //Minimum demand first:
  155. for(IntermediateCableWithState edge: minimumNetwork.getEdgeList()) {
  156. decoratedCableList.add(new DecoratedCable(edge.getModel(), edge.getState(), (edge.getState() == CableState.Working) ? energyToSupplyInTheNetwork : 0.0f));
  157. }
  158. }
  159. private void calculateAllEqualNetwork(MinimumNetwork minimumNetwork, int Iteration, FlexManager flexManager) {
  160. categorize(minimumNetwork, Iteration, flexManager);
  161. float energyToSupplyInTheNetwork = supplierList.stream().map(supplier -> supplier.getEnergyToSupplyNetwork() - supplier.getEnergySupplied()).reduce( 0.0f, (a, b) -> a + b);
  162. float energyForEachConsumer = (consumerList.size() != 0) ? energyToSupplyInTheNetwork / consumerList.size() : 0.0f;
  163. decorateCable(minimumNetwork, energyToSupplyInTheNetwork);
  164. //Supply consumer equal
  165. outerLoop:
  166. for(Consumer con : consumerList)
  167. {
  168. //gehe Supplier list durch wer ihn supplien kann.
  169. float energyNeededForEqualSupply = energyForEachConsumer;
  170. for(Supplier sup : supplierList) {
  171. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  172. if(energyRdyToSupply == 0.0f) continue;
  173. if(energyRdyToSupply>=energyNeededForEqualSupply) {
  174. supply(con, sup, energyNeededForEqualSupply);
  175. continue outerLoop;
  176. }else
  177. {
  178. supply(con, sup, energyRdyToSupply);
  179. energyNeededForEqualSupply -= energyRdyToSupply;
  180. }
  181. }
  182. //No more Energy in the network
  183. break;
  184. }
  185. calculateStates();
  186. }
  187. private void calculateStates() {
  188. //CalculateStates:
  189. supplierList.forEach(sup -> sup.setState(HolonObjectState.PRODUCER));
  190. passivNoEnergyList.forEach(sup -> sup.setState(HolonObjectState.NO_ENERGY));
  191. for(Consumer con : this.consumerList)
  192. {
  193. setConsumerState(con);
  194. }
  195. for(Consumer con : this.consumerSelfSuppliedList)
  196. {
  197. setConsumerState(con);
  198. }
  199. }
  200. private void categorize(MinimumNetwork minimumNetwork, int Iteration, FlexManager flexManager) {
  201. //Categorize
  202. for(HolonObject hObject: minimumNetwork.getHolonObjectList()) {
  203. float energyNeeded = hObject.getEnergyNeededFromConsumingElementsWithFlex(Iteration, flexManager);
  204. float energySelfProducing = hObject.getEnergySelfProducingFromProducingElementsWithFlex(Iteration, flexManager);
  205. if(energyNeeded < energySelfProducing) {
  206. Supplier sup = new Supplier(hObject, energySelfProducing - energyNeeded);
  207. supplierList.add(sup);
  208. } else if (energyNeeded > energySelfProducing) {
  209. Consumer con = new Consumer(hObject);
  210. con.setEnergyNeededFromNetwork(energyNeeded - energySelfProducing);
  211. con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergyWithFlex(Iteration, flexManager));
  212. con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElementsWithFlex(Iteration, flexManager));
  213. con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElementsWithFlex(Iteration, flexManager));
  214. consumerList.add(con);
  215. }else if(energyNeeded == energySelfProducing) {
  216. if (energySelfProducing == 0.0f) {
  217. Passiv pas = new Passiv(hObject);
  218. passivNoEnergyList.add(pas);
  219. } else {
  220. Consumer con = new Consumer(hObject);
  221. con.setEnergyNeededFromNetwork(0.0f);
  222. con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergyWithFlex(Iteration, flexManager));
  223. con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElementsWithFlex(Iteration, flexManager));
  224. con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElementsWithFlex(Iteration, flexManager));
  225. consumerSelfSuppliedList.add(con);
  226. }
  227. }
  228. }
  229. }
  230. private void setConsumerState(Consumer con) {
  231. if(con.getEnergySelfSupplied() + con.getEnergyFromNetwork() > con.getEnergyFromConsumingElemnets()) {
  232. con.setState(HolonObjectState.OVER_SUPPLIED);
  233. }else if(con.getEnergySelfSupplied() + con.getEnergyFromNetwork() == con.getEnergyFromConsumingElemnets()) {
  234. con.setState(HolonObjectState.SUPPLIED);
  235. }else if(con.getEnergySelfSupplied() + con.getEnergyFromNetwork() >= con.getMinimumConsumingElementEnergy()) {
  236. con.setState(HolonObjectState.PARTIALLY_SUPPLIED);
  237. }else {
  238. con.setState(HolonObjectState.NOT_SUPPLIED);
  239. }
  240. }
  241. /**
  242. * No Checks.
  243. * @param con
  244. * @param sup
  245. * @param energy
  246. */
  247. private void supply(Consumer con, Supplier sup, float energy) {
  248. sup.getConsumerList().add(sup.new ConsumerListEntry(con , energy));
  249. sup.setEnergySupplied(sup.getEnergySupplied() + energy);
  250. con.getSupplierList().add(con.new SupplierListEntry(sup, energy));
  251. con.setEnergyFromNetwork(con.getEnergyFromNetwork() + energy);
  252. }
  253. public int getAmountOfConsumer() {
  254. return consumerList.size() + this.consumerSelfSuppliedList.size();
  255. }
  256. public int getAmountOfSupplier() {
  257. return supplierList.size();
  258. }
  259. public int getAmountOfConsumerWithState(HolonObjectState state) {
  260. return (int) (consumerList.stream().filter(con -> con.getState() == state).count() + consumerSelfSuppliedList.stream().filter(con -> con.getState() == state).count());
  261. }
  262. public int getAmountOfPassiv() {
  263. return passivNoEnergyList.size();
  264. }
  265. }