DecoratedNetwork.java 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. package ui.model;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.stream.Collectors;
  5. import classes.HolonElement;
  6. import classes.HolonObject;
  7. import ui.controller.FlexManager;
  8. import ui.model.DecoratedCable.CableState;
  9. import ui.model.DecoratedHolonObject.HolonObjectState;
  10. import ui.model.Model.FairnessModel;
  11. public class DecoratedNetwork {
  12. private ArrayList<Supplier> supplierList = new ArrayList<Supplier>();
  13. private ArrayList<Consumer> consumerList = new ArrayList<Consumer>();
  14. private ArrayList<Consumer> consumerSelfSuppliedList = new ArrayList<Consumer>();
  15. private ArrayList<Passiv> passivNoEnergyList = new ArrayList<Passiv>();
  16. private ArrayList<DecoratedCable> decoratedCableList = new ArrayList<DecoratedCable>();
  17. private int timestep;
  18. public DecoratedNetwork(MinimumNetwork minimumNetwork, int Iteration, FairnessModel actualFairnessModel, FlexManager flexManager){
  19. this.timestep = Iteration;
  20. switch(actualFairnessModel) {
  21. case AllEqual:
  22. calculateAllEqualNetwork(minimumNetwork, Iteration, flexManager);
  23. break;
  24. case MininumDemandFirst:
  25. default:
  26. calculateMinimumDemandFirstNetwork(minimumNetwork, Iteration, flexManager);
  27. break;
  28. }
  29. }
  30. public DecoratedNetwork(MinimumNetwork minimumNetwork, int Iteration, FairnessModel actualFairnessModel){
  31. this.timestep = Iteration;
  32. switch(actualFairnessModel) {
  33. case AllEqual:
  34. calculateAllEqualNetwork(minimumNetwork, Iteration);
  35. break;
  36. case MininumDemandFirst:
  37. default:
  38. calculateMinimumDemandFirstNetwork(minimumNetwork, Iteration);
  39. break;
  40. }
  41. }
  42. //Getter:
  43. public ArrayList<Supplier> getSupplierList() {
  44. return supplierList;
  45. }
  46. public ArrayList<Consumer> getConsumerList() {
  47. return consumerList;
  48. }
  49. public ArrayList<Consumer> getConsumerSelfSuppliedList() {
  50. return consumerSelfSuppliedList;
  51. }
  52. public ArrayList<Passiv> getPassivNoEnergyList() {
  53. return passivNoEnergyList;
  54. }
  55. public ArrayList<DecoratedCable> getDecoratedCableList(){
  56. return decoratedCableList;
  57. }
  58. //Calculations:
  59. private void calculateMinimumDemandFirstNetwork(MinimumNetwork minimumNetwork, int Iteration, FlexManager flexManager) {
  60. categorize(minimumNetwork, Iteration, flexManager);
  61. //Sort SupplierList according to the EnergyToSupplyNetwork maximum first.
  62. //Sort ConsumerList according to the MinimumConsumingElementEnergy minimum first.
  63. supplierList.sort((Supplier lhs,Supplier rhs) -> -Float.compare(lhs.getEnergyToSupplyNetwork(), rhs.getEnergyToSupplyNetwork()));
  64. consumerList.sort((Consumer lhs,Consumer rhs) -> Float.compare(lhs.getMinimumConsumingElementEnergy() , rhs.getMinimumConsumingElementEnergy()));
  65. //consumerList.forEach((con) -> System.out.println(con.getMinimumConsumingElementEnergy()));
  66. //consumerList.forEach((con) -> System.out.println("AfterSorting" + con));
  67. float energyToSupplyInTheNetwork = supplierList.stream().map(supplier -> supplier.getEnergyToSupplyNetwork() - supplier.getEnergySupplied()).reduce( 0.0f, (a, b) -> a + b);
  68. decorateCable(minimumNetwork, energyToSupplyInTheNetwork);
  69. outerLoop:
  70. for(Consumer con : consumerList)
  71. {
  72. //gehe Supplier list durch wer ihn supplien kann.
  73. for(Supplier sup : supplierList) {
  74. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  75. if(energyRdyToSupply == 0.0f) continue;
  76. float energyNeededForMinimumConsumingElement=con.getMinimumConsumingElementEnergy()-con.getEnergyFromNetwork();
  77. if(energyNeededForMinimumConsumingElement>energyToSupplyInTheNetwork) {
  78. //Dont supply a minimumElement when you cant supply it fully
  79. break outerLoop;
  80. }
  81. if(energyRdyToSupply>=energyNeededForMinimumConsumingElement) {
  82. energyToSupplyInTheNetwork -= energyNeededForMinimumConsumingElement;
  83. supply(con, sup, energyNeededForMinimumConsumingElement);
  84. continue outerLoop;
  85. }else
  86. {
  87. energyToSupplyInTheNetwork -= energyRdyToSupply;
  88. supply(con, sup, energyRdyToSupply);
  89. }
  90. }
  91. //No more Energy in the network
  92. break;
  93. }
  94. //consumerList.forEach((con) -> System.out.println("AfterSuppliing MinimumDemand " + con));
  95. //Sort ConsumerList according to the EnergyNeeded to supply fully after minimum Demand First.
  96. consumerList.sort((Consumer lhs,Consumer rhs) -> Float.compare(lhs.getEnergyNeededFromNetwork()-lhs.getEnergyFromNetwork() , rhs.getEnergyNeededFromNetwork()-rhs.getEnergyFromNetwork() ));
  97. //Supply consumer fully
  98. outerLoop:
  99. for(Consumer con : consumerList)
  100. {
  101. //gehe Supplier list durch wer ihn supplien kann.
  102. for(Supplier sup : supplierList) {
  103. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  104. if(energyRdyToSupply == 0.0f) continue;
  105. float energyNeededForFullySupply = con.getEnergyNeededFromNetwork() - con.getEnergyFromNetwork();
  106. if(energyNeededForFullySupply == 0.0f) continue outerLoop;
  107. if(energyRdyToSupply>=energyNeededForFullySupply) {
  108. supply(con, sup, energyNeededForFullySupply);
  109. continue outerLoop;
  110. }else
  111. {
  112. supply(con, sup, energyRdyToSupply);
  113. }
  114. }
  115. //No more Energy in the network
  116. break;
  117. }
  118. //consumerList.forEach((con) -> System.out.println("AfterFullySuplieing" + con));
  119. //If Energy Left Supply all equal
  120. //Count EnergyLeft
  121. float energyLeft = supplierList.stream().map(supplier -> supplier.getEnergyToSupplyNetwork() - supplier.getEnergySupplied()).reduce( 0.0f, (a, b) -> a + b);
  122. //System.out.println("EnergyLeft: " + energyLeft);
  123. if(energyLeft > 0.0f && (consumerList.size() + consumerSelfSuppliedList.size() != 0))
  124. {
  125. float equalAmountOfEnergyToSupply = energyLeft / ((float)(consumerList.size() + consumerSelfSuppliedList.size()));
  126. outerLoop:
  127. for(Consumer con : consumerList)
  128. {
  129. //gehe Supplier list durch wer ihn supplien kann.
  130. for(Supplier sup : supplierList) {
  131. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  132. if(energyRdyToSupply == 0.0f) continue;
  133. float energyNeededToSupplyConsumerTheEqualAmount = equalAmountOfEnergyToSupply +con.getEnergyNeededFromNetwork()- con.getEnergyFromNetwork();
  134. if(energyRdyToSupply>=energyNeededToSupplyConsumerTheEqualAmount) {
  135. supply(con, sup, energyNeededToSupplyConsumerTheEqualAmount);
  136. continue outerLoop;
  137. }else
  138. {
  139. supply(con, sup, energyRdyToSupply);
  140. }
  141. }
  142. //No more Energy in the network
  143. break;
  144. }
  145. outerLoop:
  146. for(Consumer con : consumerSelfSuppliedList)
  147. {
  148. //gehe Supplier list durch wer ihn supplien kann.
  149. for(Supplier sup : supplierList) {
  150. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  151. if(energyRdyToSupply == 0.0f) continue;
  152. float energyNeededToSupplyConsumerTheEqualAmount = equalAmountOfEnergyToSupply +con.getEnergyNeededFromNetwork()- con.getEnergyFromNetwork();
  153. if(energyRdyToSupply>=energyNeededToSupplyConsumerTheEqualAmount) {
  154. supply(con, sup, energyNeededToSupplyConsumerTheEqualAmount);
  155. continue outerLoop;
  156. }else
  157. {
  158. supply(con, sup, energyRdyToSupply);
  159. }
  160. }
  161. //No more Energy in the network
  162. break;
  163. }
  164. }
  165. //consumerList.forEach((con) -> System.out.println("AfterOverSuppleiing" + con));
  166. //consumerSelfSuppliedList.forEach((con) -> System.out.println("AfterOverSuppleiing" + con));
  167. calculateStates();
  168. }
  169. private void calculateMinimumDemandFirstNetwork(MinimumNetwork minimumNetwork, int Iteration) {
  170. categorize(minimumNetwork, Iteration);
  171. //Sort SupplierList according to the EnergyToSupplyNetwork maximum first.
  172. //Sort ConsumerList according to the MinimumConsumingElementEnergy minimum first.
  173. supplierList.sort((Supplier lhs,Supplier rhs) -> -Float.compare(lhs.getEnergyToSupplyNetwork(), rhs.getEnergyToSupplyNetwork()));
  174. consumerList.sort((Consumer lhs,Consumer rhs) -> Float.compare(lhs.getMinimumConsumingElementEnergy() , rhs.getMinimumConsumingElementEnergy()));
  175. //consumerList.forEach((con) -> System.out.println(con.getMinimumConsumingElementEnergy()));
  176. //consumerList.forEach((con) -> System.out.println("AfterSorting" + con));
  177. float energyToSupplyInTheNetwork = supplierList.stream().map(supplier -> supplier.getEnergyToSupplyNetwork() - supplier.getEnergySupplied()).reduce( 0.0f, (a, b) -> a + b);
  178. decorateCable(minimumNetwork, energyToSupplyInTheNetwork);
  179. outerLoop:
  180. for(Consumer con : consumerList)
  181. {
  182. //gehe Supplier list durch wer ihn supplien kann.
  183. for(Supplier sup : supplierList) {
  184. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  185. if(energyRdyToSupply == 0.0f) continue;
  186. float energyNeededForMinimumConsumingElement=con.getMinimumConsumingElementEnergy()-con.getEnergyFromNetwork();
  187. if(energyNeededForMinimumConsumingElement>energyToSupplyInTheNetwork) {
  188. //Dont supply a minimumElement when you cant supply it fully
  189. break outerLoop;
  190. }
  191. if(energyRdyToSupply>=energyNeededForMinimumConsumingElement) {
  192. energyToSupplyInTheNetwork -= energyNeededForMinimumConsumingElement;
  193. supply(con, sup, energyNeededForMinimumConsumingElement);
  194. continue outerLoop;
  195. }else
  196. {
  197. energyToSupplyInTheNetwork -= energyRdyToSupply;
  198. supply(con, sup, energyRdyToSupply);
  199. }
  200. }
  201. //No more Energy in the network
  202. break;
  203. }
  204. //consumerList.forEach((con) -> System.out.println("AfterSuppliing MinimumDemand " + con));
  205. //Sort ConsumerList according to the EnergyNeeded to supply fully after minimum Demand First.
  206. consumerList.sort((Consumer lhs,Consumer rhs) -> Float.compare(lhs.getEnergyNeededFromNetwork()-lhs.getEnergyFromNetwork() , rhs.getEnergyNeededFromNetwork()-rhs.getEnergyFromNetwork() ));
  207. //Supply consumer fully
  208. outerLoop:
  209. for(Consumer con : consumerList)
  210. {
  211. //gehe Supplier list durch wer ihn supplien kann.
  212. for(Supplier sup : supplierList) {
  213. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  214. if(energyRdyToSupply == 0.0f) continue;
  215. float energyNeededForFullySupply = con.getEnergyNeededFromNetwork() - con.getEnergyFromNetwork();
  216. if(energyNeededForFullySupply == 0.0f) continue outerLoop;
  217. if(energyRdyToSupply>=energyNeededForFullySupply) {
  218. supply(con, sup, energyNeededForFullySupply);
  219. continue outerLoop;
  220. }else
  221. {
  222. supply(con, sup, energyRdyToSupply);
  223. }
  224. }
  225. //No more Energy in the network
  226. break;
  227. }
  228. //consumerList.forEach((con) -> System.out.println("AfterFullySuplieing" + con));
  229. //If Energy Left Supply all equal
  230. //Count EnergyLeft
  231. float energyLeft = supplierList.stream().map(supplier -> supplier.getEnergyToSupplyNetwork() - supplier.getEnergySupplied()).reduce( 0.0f, (a, b) -> a + b);
  232. //System.out.println("EnergyLeft: " + energyLeft);
  233. if(energyLeft > 0.0f && (consumerList.size() + consumerSelfSuppliedList.size() != 0))
  234. {
  235. float equalAmountOfEnergyToSupply = energyLeft / ((float)(consumerList.size() + consumerSelfSuppliedList.size()));
  236. outerLoop:
  237. for(Consumer con : consumerList)
  238. {
  239. //gehe Supplier list durch wer ihn supplien kann.
  240. for(Supplier sup : supplierList) {
  241. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  242. if(energyRdyToSupply == 0.0f) continue;
  243. float energyNeededToSupplyConsumerTheEqualAmount = equalAmountOfEnergyToSupply +con.getEnergyNeededFromNetwork()- con.getEnergyFromNetwork();
  244. if(energyRdyToSupply>=energyNeededToSupplyConsumerTheEqualAmount) {
  245. supply(con, sup, energyNeededToSupplyConsumerTheEqualAmount);
  246. continue outerLoop;
  247. }else
  248. {
  249. supply(con, sup, energyRdyToSupply);
  250. }
  251. }
  252. //No more Energy in the network
  253. break;
  254. }
  255. outerLoop:
  256. for(Consumer con : consumerSelfSuppliedList)
  257. {
  258. //gehe Supplier list durch wer ihn supplien kann.
  259. for(Supplier sup : supplierList) {
  260. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  261. if(energyRdyToSupply == 0.0f) continue;
  262. float energyNeededToSupplyConsumerTheEqualAmount = equalAmountOfEnergyToSupply +con.getEnergyNeededFromNetwork()- con.getEnergyFromNetwork();
  263. if(energyRdyToSupply>=energyNeededToSupplyConsumerTheEqualAmount) {
  264. supply(con, sup, energyNeededToSupplyConsumerTheEqualAmount);
  265. continue outerLoop;
  266. }else
  267. {
  268. supply(con, sup, energyRdyToSupply);
  269. }
  270. }
  271. //No more Energy in the network
  272. break;
  273. }
  274. }
  275. //consumerList.forEach((con) -> System.out.println("AfterOverSuppleiing" + con));
  276. //consumerSelfSuppliedList.forEach((con) -> System.out.println("AfterOverSuppleiing" + con));
  277. calculateStates();
  278. }
  279. private void decorateCable(MinimumNetwork minimumNetwork, float energyToSupplyInTheNetwork) {
  280. //DecoratedCables
  281. //Minimum demand first:
  282. for(IntermediateCableWithState edge: minimumNetwork.getEdgeList()) {
  283. decoratedCableList.add(new DecoratedCable(edge.getModel(), edge.getState(), (edge.getState() == CableState.Working) ? energyToSupplyInTheNetwork : 0.0f));
  284. }
  285. }
  286. private void calculateAllEqualNetwork(MinimumNetwork minimumNetwork, int Iteration, FlexManager flexManager) {
  287. categorize(minimumNetwork, Iteration, flexManager);
  288. float energyToSupplyInTheNetwork = supplierList.stream().map(supplier -> supplier.getEnergyToSupplyNetwork() - supplier.getEnergySupplied()).reduce( 0.0f, (a, b) -> a + b);
  289. float energyForEachConsumer = (consumerList.size() != 0) ? energyToSupplyInTheNetwork / consumerList.size() : 0.0f;
  290. decorateCable(minimumNetwork, energyToSupplyInTheNetwork);
  291. //Supply consumer equal
  292. outerLoop:
  293. for(Consumer con : consumerList)
  294. {
  295. //gehe Supplier list durch wer ihn supplien kann.
  296. float energyNeededForEqualSupply = energyForEachConsumer;
  297. for(Supplier sup : supplierList) {
  298. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  299. if(energyRdyToSupply == 0.0f) continue;
  300. if(energyRdyToSupply>=energyNeededForEqualSupply) {
  301. supply(con, sup, energyNeededForEqualSupply);
  302. continue outerLoop;
  303. }else
  304. {
  305. supply(con, sup, energyRdyToSupply);
  306. energyNeededForEqualSupply -= energyRdyToSupply;
  307. }
  308. }
  309. //No more Energy in the network
  310. break;
  311. }
  312. calculateStates();
  313. }
  314. private void calculateAllEqualNetwork(MinimumNetwork minimumNetwork, int Iteration) {
  315. categorize(minimumNetwork, Iteration);
  316. float energyToSupplyInTheNetwork = supplierList.stream().map(supplier -> supplier.getEnergyToSupplyNetwork() - supplier.getEnergySupplied()).reduce( 0.0f, (a, b) -> a + b);
  317. float energyForEachConsumer = (consumerList.size() != 0) ? energyToSupplyInTheNetwork / consumerList.size() : 0.0f;
  318. decorateCable(minimumNetwork, energyToSupplyInTheNetwork);
  319. //Supply consumer equal
  320. outerLoop:
  321. for(Consumer con : consumerList)
  322. {
  323. //gehe Supplier list durch wer ihn supplien kann.
  324. float energyNeededForEqualSupply = energyForEachConsumer;
  325. for(Supplier sup : supplierList) {
  326. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  327. if(energyRdyToSupply == 0.0f) continue;
  328. if(energyRdyToSupply>=energyNeededForEqualSupply) {
  329. supply(con, sup, energyNeededForEqualSupply);
  330. continue outerLoop;
  331. }else
  332. {
  333. supply(con, sup, energyRdyToSupply);
  334. energyNeededForEqualSupply -= energyRdyToSupply;
  335. }
  336. }
  337. //No more Energy in the network
  338. break;
  339. }
  340. calculateStates();
  341. }
  342. private void calculateStates() {
  343. //CalculateStates:
  344. supplierList.forEach(sup -> sup.setState(HolonObjectState.PRODUCER));
  345. passivNoEnergyList.forEach(sup -> sup.setState(HolonObjectState.NO_ENERGY));
  346. for(Consumer con : this.consumerList)
  347. {
  348. setConsumerState(con);
  349. }
  350. for(Consumer con : this.consumerSelfSuppliedList)
  351. {
  352. setConsumerState(con);
  353. }
  354. }
  355. private void categorize(MinimumNetwork minimumNetwork, int Iteration, FlexManager flexManager) {
  356. //Categorize
  357. for(HolonObject hObject: minimumNetwork.getHolonObjectList()) {
  358. float energyNeeded = hObject.getEnergyNeededFromConsumingElementsWithFlex(Iteration, flexManager);
  359. float energySelfProducing = hObject.getEnergySelfProducingFromProducingElementsWithFlex(Iteration, flexManager);
  360. if(energyNeeded < energySelfProducing) {
  361. Supplier sup = new Supplier(hObject, energySelfProducing - energyNeeded, energyNeeded);
  362. supplierList.add(sup);
  363. } else if (energyNeeded > energySelfProducing) {
  364. Consumer con = new Consumer(hObject);
  365. con.setEnergyNeededFromNetwork(energyNeeded - energySelfProducing);
  366. con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergyWithFlex(Iteration, flexManager));
  367. con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElementsWithFlex(Iteration, flexManager));
  368. con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElementsWithFlex(Iteration, flexManager));
  369. consumerList.add(con);
  370. }else if(energyNeeded == energySelfProducing) {
  371. if (energySelfProducing == 0.0f) {
  372. Passiv pas = new Passiv(hObject);
  373. passivNoEnergyList.add(pas);
  374. } else {
  375. Consumer con = new Consumer(hObject);
  376. con.setEnergyNeededFromNetwork(0.0f);
  377. con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergyWithFlex(Iteration, flexManager));
  378. con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElementsWithFlex(Iteration, flexManager));
  379. con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElementsWithFlex(Iteration, flexManager));
  380. consumerSelfSuppliedList.add(con);
  381. }
  382. }
  383. }
  384. }
  385. private void categorize(MinimumNetwork minimumNetwork, int Iteration) {
  386. //Categorize
  387. for(HolonObject hObject: minimumNetwork.getHolonObjectList()) {
  388. float energyNeeded = hObject.getEnergyNeededFromConsumingElementsFlex(Iteration);
  389. float energySelfProducing = hObject.getEnergySelfProducingFromProducingElementsFlex(Iteration);
  390. if(energyNeeded < energySelfProducing) {
  391. Supplier sup = new Supplier(hObject, energySelfProducing - energyNeeded, energyNeeded);
  392. supplierList.add(sup);
  393. } else if (energyNeeded > energySelfProducing) {
  394. Consumer con = new Consumer(hObject);
  395. con.setEnergyNeededFromNetwork(energyNeeded - energySelfProducing);
  396. con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergyFlex(Iteration));
  397. con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElementsFlex(Iteration));
  398. con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElementsFlex(Iteration));
  399. consumerList.add(con);
  400. }else if(energyNeeded == energySelfProducing) {
  401. if (energySelfProducing == 0.0f) {
  402. Passiv pas = new Passiv(hObject);
  403. passivNoEnergyList.add(pas);
  404. } else {
  405. Consumer con = new Consumer(hObject);
  406. con.setEnergyNeededFromNetwork(0.0f);
  407. con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergyFlex(Iteration));
  408. con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElementsFlex(Iteration));
  409. con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElementsFlex(Iteration));
  410. consumerSelfSuppliedList.add(con);
  411. }
  412. }
  413. }
  414. }
  415. private void setConsumerState(Consumer con) {
  416. if(con.getEnergySelfSupplied() + con.getEnergyFromNetwork() > con.getEnergyFromConsumingElemnets()) {
  417. con.setState(HolonObjectState.OVER_SUPPLIED);
  418. }else if(con.getEnergySelfSupplied() + con.getEnergyFromNetwork() == con.getEnergyFromConsumingElemnets()) {
  419. con.setState(HolonObjectState.SUPPLIED);
  420. }else if(con.getEnergySelfSupplied() + con.getEnergyFromNetwork() >= con.getMinimumConsumingElementEnergy()) {
  421. con.setState(HolonObjectState.PARTIALLY_SUPPLIED);
  422. }else {
  423. con.setState(HolonObjectState.NOT_SUPPLIED);
  424. }
  425. }
  426. /**
  427. * No Checks.
  428. * @param con
  429. * @param sup
  430. * @param energy
  431. */
  432. private void supply(Consumer con, Supplier sup, float energy) {
  433. sup.getConsumerList().add(sup.new ConsumerListEntry(con , energy));
  434. sup.setEnergySupplied(sup.getEnergySupplied() + energy);
  435. con.getSupplierList().add(con.new SupplierListEntry(sup, energy));
  436. con.setEnergyFromNetwork(con.getEnergyFromNetwork() + energy);
  437. }
  438. public int getAmountOfActiveElements() {
  439. return supplierList.stream().map(object -> object.getModel().getNumberOfActiveElements()).reduce(0, Integer::sum)+
  440. consumerList.stream().map(object -> object.getModel().getNumberOfActiveElements()).reduce(0, Integer::sum)+
  441. consumerSelfSuppliedList.stream().map(object -> object.getModel().getNumberOfActiveElements()).reduce(0, Integer::sum);
  442. }
  443. public int getAmountOfElements() {
  444. return supplierList.stream().map(object -> object.getModel().getNumberOfElements()).reduce(0, Integer::sum)+
  445. consumerList.stream().map(object -> object.getModel().getNumberOfElements()).reduce(0, Integer::sum)+
  446. consumerSelfSuppliedList.stream().map(object -> object.getModel().getNumberOfElements()).reduce(0, Integer::sum);
  447. }
  448. public int getAmountOfConsumer() {
  449. return consumerList.size() + this.consumerSelfSuppliedList.size();
  450. }
  451. public int getAmountOfSupplier() {
  452. return supplierList.size();
  453. }
  454. public int getAmountOfConsumerWithState(HolonObjectState state) {
  455. return (int) (consumerList.stream().filter(con -> con.getState() == state).count() + consumerSelfSuppliedList.stream().filter(con -> con.getState() == state).count());
  456. }
  457. public int getAmountOfPassiv() {
  458. return passivNoEnergyList.size();
  459. }
  460. public int getAmountOfHolonObjects() {
  461. return getAmountOfConsumer() + getAmountOfSupplier() + getAmountOfPassiv();
  462. }
  463. public float getTotalConsumption() {
  464. float energy = consumerList.stream().map(con -> con.getEnergyFromConsumingElemnets()).reduce(0.f, Float::sum) + consumerSelfSuppliedList.stream().map(con -> con.getEnergyFromConsumingElemnets()).reduce(0.f, Float::sum);
  465. energy += supplierList.stream().map(sup -> sup.getEnergySelfConsuming()).reduce(0.f, Float::sum);
  466. return energy;
  467. }
  468. public float getAverageConsumptionInNetworkForHolonObject(){
  469. return getTotalConsumption() / (float)getAmountOfHolonObjects();
  470. }
  471. public float getTotalProduction() {
  472. float energy = consumerList.stream().map(con -> con.getEnergySelfSupplied()).reduce(0.f, Float::sum) + consumerSelfSuppliedList.stream().map(con -> con.getEnergySelfSupplied()).reduce(0.f, Float::sum);
  473. energy += supplierList.stream().map(sup -> sup.getEnergyProducing()).reduce(0.f, Float::sum);
  474. return energy;
  475. }
  476. public float getAverageProductionInNetworkForHolonObject() {
  477. return getTotalProduction() / (float) getAmountOfHolonObjects();
  478. }
  479. /**
  480. * returns the Varianz in Poduction
  481. * @return
  482. */
  483. public float getVarianzInProductionInNetworkForHolonObjects() {
  484. float average = getAverageProductionInNetworkForHolonObject();
  485. float sum = consumerList.stream().map(con -> squared(con.getEnergySelfSupplied() - average)).reduce(0.f, Float::sum)
  486. + consumerSelfSuppliedList.stream().map(con -> squared(con.getEnergySelfSupplied() - average)).reduce(0.f, Float::sum)
  487. + supplierList.stream().map(sup -> squared(sup.getEnergyProducing() - average)).reduce(0.f, Float::sum);
  488. return sum / (float) getAmountOfHolonObjects();
  489. }
  490. public float getDeviationInProductionInNetworkForHolonObjects() {
  491. return (float)Math.sqrt(getVarianzInProductionInNetworkForHolonObjects());
  492. }
  493. public float getVarianzInConsumptionInNetworkForHolonObjects() {
  494. float average = getAverageConsumptionInNetworkForHolonObject();
  495. float sum = consumerList.stream().map(con -> squared(con.getEnergyFromConsumingElemnets() - average)).reduce(0.f, Float::sum)
  496. + consumerSelfSuppliedList.stream().map(con -> squared(con.getEnergyFromConsumingElemnets() - average)).reduce(0.f, Float::sum)
  497. + supplierList.stream().map(sup -> squared(sup.getEnergySelfConsuming() - average)).reduce(0.f, Float::sum);
  498. return sum / (float) getAmountOfHolonObjects();
  499. }
  500. public float getDeviationInConsumptionInNetworkForHolonObjects() {
  501. return (float)Math.sqrt(getVarianzInConsumptionInNetworkForHolonObjects());
  502. }
  503. //HelperFunction
  504. /**
  505. *
  506. * @return a list of energy
  507. */
  508. public List<Float> getListOfEnergyThatIsOfferedByFlexibilitiesInThisNetwork() {
  509. List<HolonElement> eleList = consumerList.stream().flatMap(con-> con.getModel().getElements().stream()).collect(Collectors.toList());
  510. eleList.addAll(consumerSelfSuppliedList.stream().flatMap(con-> con.getModel().getElements().stream()).collect(Collectors.toList()));
  511. eleList.addAll(supplierList.stream().flatMap(con-> con.getModel().getElements().stream()).collect(Collectors.toList()));
  512. eleList.addAll(passivNoEnergyList.stream().flatMap(con-> con.getModel().getElements().stream()).collect(Collectors.toList()));
  513. return eleList.stream().filter(ele -> (ele.flexList.stream().anyMatch(flex -> flex.offered && flex.fulfillsConstrains())) ).map(ele -> -ele.getEnergyAtTimeStep(timestep) ).collect(Collectors.toList()) ;
  514. }
  515. public List<Float> getListOfEnergyInProductionThatIsOfferedByFlexibilitiesInThisNetwork(){
  516. return getListOfEnergyThatIsOfferedByFlexibilitiesInThisNetwork().stream().filter(value -> (value > 0.f)).collect(Collectors.toList());
  517. }
  518. public List<Float> getListOfEnergyInConsumptionThatIsOfferedByFlexibilitiesInThisNetwork(){
  519. return getListOfEnergyThatIsOfferedByFlexibilitiesInThisNetwork().stream().filter(value -> (value < 0.f)).map(value -> -value).collect(Collectors.toList());
  520. }
  521. public float getFlexibilityProductionCapacity() {
  522. return getListOfEnergyInProductionThatIsOfferedByFlexibilitiesInThisNetwork().stream().reduce(0.f, Float::sum);
  523. }
  524. public float getFlexibilityConsumptionCapacity() {
  525. return getListOfEnergyInConsumptionThatIsOfferedByFlexibilitiesInThisNetwork().stream().reduce(0.f, Float::sum);
  526. }
  527. public int getAmountOfProductionFlexibilities() {
  528. return getListOfEnergyInProductionThatIsOfferedByFlexibilitiesInThisNetwork().size();
  529. }
  530. public int getAmountOfConsumptionFlexibilities() {
  531. return getListOfEnergyInConsumptionThatIsOfferedByFlexibilitiesInThisNetwork().size();
  532. }
  533. public float getAverageFlexibilityProduction() {
  534. int amount = getAmountOfProductionFlexibilities();
  535. return (amount > 0)? getFlexibilityProductionCapacity() / (float)amount : 0.f;
  536. }
  537. public float getAverageFlexibilityConsumption() {
  538. int amount = getAmountOfConsumptionFlexibilities();
  539. return (amount > 0)? getFlexibilityConsumptionCapacity() / (float)amount : 0.f;
  540. }
  541. public float getVarianzInFlexibilitieConsumption() {
  542. float average = getAverageFlexibilityConsumption();
  543. float sum = getListOfEnergyInConsumptionThatIsOfferedByFlexibilitiesInThisNetwork().stream().map(energy -> squared(energy - average)).reduce(0.f, Float::sum);
  544. int amountOfFlexibilities = getAmountOfConsumptionFlexibilities();
  545. return (amountOfFlexibilities > 0)? sum / (float) amountOfFlexibilities : 0.f;
  546. }
  547. public float getVarianzInFlexibilitieProduction() {
  548. float average = getAverageFlexibilityProduction();
  549. float sum = getListOfEnergyInProductionThatIsOfferedByFlexibilitiesInThisNetwork().stream().map(energy -> squared(energy - average)).reduce(0.f, Float::sum);
  550. int amountOfFlexibilities = getAmountOfProductionFlexibilities();
  551. return (amountOfFlexibilities > 0)? sum / (float) amountOfFlexibilities : 0.f;
  552. }
  553. public float getDiviationInFlexibilityConsumption() {
  554. return (float) Math.sqrt(getVarianzInFlexibilitieConsumption());
  555. }
  556. public float getDiviationInFlexibilityProduction() {
  557. return (float) Math.sqrt(getVarianzInFlexibilitieProduction());
  558. }
  559. //Help Function
  560. private float squared(float input) {
  561. return (float) Math.pow(input, 2);
  562. }
  563. }