DecoratedNetwork.java 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. package ui.model;
  2. import java.util.ArrayList;
  3. import classes.CpsEdge;
  4. import classes.HolonObject;
  5. import ui.model.DecoratedCable.CableState;
  6. import ui.model.DecoratedHolonObject.HolonObjectState;
  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){
  14. //Categorize
  15. for(HolonObject hObject: minimumNetwork.getHolonObjectList()) {
  16. float energyNeeded = hObject.getEnergyNeededFromConsumingElements(Iteration);
  17. float energySelfProducing = hObject.getEnergySelfProducingFromProducingElements(Iteration);
  18. if(energyNeeded < energySelfProducing) {
  19. Supplier sup = new Supplier(hObject);
  20. sup.setEnergyToSupplyNetwork(energySelfProducing - energyNeeded);
  21. supplierList.add(sup);
  22. } else if (energyNeeded > energySelfProducing) {
  23. Consumer con = new Consumer(hObject);
  24. con.setEnergyNeededFromNetwork(energyNeeded - energySelfProducing);
  25. con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergy(Iteration));
  26. con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElements(Iteration));
  27. con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElements(Iteration));
  28. consumerList.add(con);
  29. }else if(energyNeeded == energySelfProducing) {
  30. if (energySelfProducing == 0.0f) {
  31. Passiv pas = new Passiv(hObject);
  32. passivNoEnergyList.add(pas);
  33. } else {
  34. Consumer con = new Consumer(hObject);
  35. con.setEnergyNeededFromNetwork(0.0f);
  36. con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergy(Iteration));
  37. con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElements(Iteration));
  38. con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElements(Iteration));
  39. consumerSelfSuppliedList.add(con);
  40. }
  41. }
  42. }
  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. //Minimum demand first:
  50. float energyToSupplyInTheNetwork = supplierList.stream().map(supplier -> supplier.getEnergyToSupplyNetwork() - supplier.getEnergySupplied()).reduce( 0.0f, (a, b) -> a + b);
  51. //DecoratedCables
  52. for(CableWithState edge: minimumNetwork.getEdgeList()) {
  53. decoratedCableList.add(new DecoratedCable(edge.getModel(), edge.getState(), (edge.getState() == CableState.Working) ? energyToSupplyInTheNetwork : 0.0f));
  54. }
  55. outerLoop:
  56. for(Consumer con : consumerList)
  57. {
  58. //gehe Supplier list durch wer ihn supplien kann.
  59. for(Supplier sup : supplierList) {
  60. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  61. if(energyRdyToSupply == 0.0f) continue;
  62. float energyNeededForMinimumConsumingElement=con.getMinimumConsumingElementEnergy()-con.getEnergyFromNetwork();
  63. if(energyNeededForMinimumConsumingElement>energyToSupplyInTheNetwork) {
  64. //Dont supply a minimumElement when you cant supply it fully
  65. break outerLoop;
  66. }
  67. if(energyRdyToSupply>=energyNeededForMinimumConsumingElement) {
  68. energyToSupplyInTheNetwork -= energyNeededForMinimumConsumingElement;
  69. supply(con, sup, energyNeededForMinimumConsumingElement);
  70. continue outerLoop;
  71. }else
  72. {
  73. energyToSupplyInTheNetwork -= energyRdyToSupply;
  74. supply(con, sup, energyRdyToSupply);
  75. }
  76. }
  77. //No more Energy in the network
  78. break;
  79. }
  80. //consumerList.forEach((con) -> System.out.println("AfterSuppliing MinimumDemand " + con));
  81. //Sort ConsumerList according to the EnergyNeeded to supply fully after minimum Demand First.
  82. consumerList.sort((Consumer lhs,Consumer rhs) -> Float.compare(lhs.getEnergyNeededFromNetwork()-lhs.getEnergyFromNetwork() , rhs.getEnergyNeededFromNetwork()-rhs.getEnergyFromNetwork() ));
  83. //Supply consumer fully
  84. outerLoop:
  85. for(Consumer con : consumerList)
  86. {
  87. //gehe Supplier list durch wer ihn supplien kann.
  88. for(Supplier sup : supplierList) {
  89. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  90. if(energyRdyToSupply == 0.0f) continue;
  91. float energyNeededForFullySupply = con.getEnergyNeededFromNetwork() - con.getEnergyFromNetwork();
  92. if(energyNeededForFullySupply == 0.0f) continue outerLoop;
  93. if(energyRdyToSupply>=energyNeededForFullySupply) {
  94. supply(con, sup, energyNeededForFullySupply);
  95. continue outerLoop;
  96. }else
  97. {
  98. supply(con, sup, energyRdyToSupply);
  99. }
  100. }
  101. //No more Energy in the network
  102. break;
  103. }
  104. //consumerList.forEach((con) -> System.out.println("AfterFullySuplieing" + con));
  105. //If Energy Left Supply all equal
  106. //Count EnergyLeft
  107. float energyLeft = supplierList.stream().map(supplier -> supplier.getEnergyToSupplyNetwork() - supplier.getEnergySupplied()).reduce( 0.0f, (a, b) -> a + b);
  108. //System.out.println("EnergyLeft: " + energyLeft);
  109. if(energyLeft > 0.0f && (consumerList.size() + consumerSelfSuppliedList.size() != 0))
  110. {
  111. float equalAmountOfEnergyToSupply = energyLeft / ((float)(consumerList.size() + consumerSelfSuppliedList.size()));
  112. outerLoop:
  113. for(Consumer con : consumerList)
  114. {
  115. //gehe Supplier list durch wer ihn supplien kann.
  116. for(Supplier sup : supplierList) {
  117. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  118. if(energyRdyToSupply == 0.0f) continue;
  119. float energyNeededToSupplyConsumerTheEqualAmount = equalAmountOfEnergyToSupply +con.getEnergyNeededFromNetwork()- con.getEnergyFromNetwork();
  120. if(energyRdyToSupply>=energyNeededToSupplyConsumerTheEqualAmount) {
  121. supply(con, sup, energyNeededToSupplyConsumerTheEqualAmount);
  122. continue outerLoop;
  123. }else
  124. {
  125. supply(con, sup, energyRdyToSupply);
  126. }
  127. }
  128. //No more Energy in the network
  129. break;
  130. }
  131. outerLoop:
  132. for(Consumer con : consumerSelfSuppliedList)
  133. {
  134. //gehe Supplier list durch wer ihn supplien kann.
  135. for(Supplier sup : supplierList) {
  136. float energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
  137. if(energyRdyToSupply == 0.0f) continue;
  138. float energyNeededToSupplyConsumerTheEqualAmount = equalAmountOfEnergyToSupply +con.getEnergyNeededFromNetwork()- con.getEnergyFromNetwork();
  139. if(energyRdyToSupply>=energyNeededToSupplyConsumerTheEqualAmount) {
  140. supply(con, sup, energyNeededToSupplyConsumerTheEqualAmount);
  141. continue outerLoop;
  142. }else
  143. {
  144. supply(con, sup, energyRdyToSupply);
  145. }
  146. }
  147. //No more Energy in the network
  148. break;
  149. }
  150. }
  151. //consumerList.forEach((con) -> System.out.println("AfterOverSuppleiing" + con));
  152. //consumerSelfSuppliedList.forEach((con) -> System.out.println("AfterOverSuppleiing" + con));
  153. //CalculateStates:
  154. supplierList.forEach(sup -> sup.setState(HolonObjectState.PRODUCER));
  155. passivNoEnergyList.forEach(sup -> sup.setState(HolonObjectState.NO_ENERGY));
  156. for(Consumer con : this.consumerList)
  157. {
  158. setConsumerState(con);
  159. }
  160. for(Consumer con : this.consumerSelfSuppliedList)
  161. {
  162. setConsumerState(con);
  163. }
  164. }
  165. private void setConsumerState(Consumer con) {
  166. if(con.getEnergySelfSupplied() + con.getEnergyFromNetwork() > con.getEnergyFromConsumingElemnets()) {
  167. con.setState(HolonObjectState.OVER_SUPPLIED);
  168. }else if(con.getEnergySelfSupplied() + con.getEnergyFromNetwork() == con.getEnergyFromConsumingElemnets()) {
  169. con.setState(HolonObjectState.SUPPLIED);
  170. }else if(con.getEnergySelfSupplied() + con.getEnergyFromNetwork() >= con.getMinimumConsumingElementEnergy()) {
  171. con.setState(HolonObjectState.PARTIALLY_SUPPLIED);
  172. }else {
  173. con.setState(HolonObjectState.NOT_SUPPLIED);
  174. }
  175. }
  176. /**
  177. * No Checks.
  178. * @param con
  179. * @param sup
  180. * @param energy
  181. */
  182. private void supply(Consumer con, Supplier sup, float energy) {
  183. sup.getConsumerList().add(sup.new ConsumerListEntry(con , energy));
  184. sup.setEnergySupplied(sup.getEnergySupplied() + energy);
  185. con.getSupplierList().add(con.new SupplierListEntry(sup, energy));
  186. con.setEnergyFromNetwork(con.getEnergyFromNetwork() + energy);
  187. }
  188. public ArrayList<Supplier> getSupplierList() {
  189. return supplierList;
  190. }
  191. public ArrayList<Consumer> getConsumerList() {
  192. return consumerList;
  193. }
  194. public ArrayList<Consumer> getConsumerSelfSuppliedList() {
  195. return consumerSelfSuppliedList;
  196. }
  197. public ArrayList<Passiv> getPassivNoEnergyList() {
  198. return passivNoEnergyList;
  199. }
  200. public ArrayList<DecoratedCable> getDecoratedCableList(){
  201. return decoratedCableList;
  202. }
  203. }