DecoratedNetwork.java 11 KB

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