StorageProductionController.java 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. package ui.controller;
  2. import classes.StorageElement;
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.LinkedList;
  6. public class StorageProductionController {
  7. private ArrayList<StorageElement> storages;
  8. private float energyRequiredForPowerplantBlackstart;
  9. public StorageProductionController(ArrayList<StorageElement> storages, float energyRequiredForPowerplantBlackstart) {
  10. this.storages = storages;
  11. this.energyRequiredForPowerplantBlackstart = energyRequiredForPowerplantBlackstart;
  12. }
  13. public float currentPossibleStorageProduction() {
  14. float possibleEnergy = 0;
  15. for (StorageElement ele : storages) {
  16. possibleEnergy += ele.getPossibleProduction(energyRequiredForPowerplantBlackstart);
  17. }
  18. return possibleEnergy;
  19. }
  20. // public float currentStorageProduction() {
  21. // float producedEnergy = 0;
  22. // for (StorageElement ele : storages) {
  23. // if (ele.getStatus().equals(StorageElement.Mode.EMIT)) {
  24. // // needed to no emit more than what is available
  25. // if(ele.getStateOfCharge() - ele.getEnergyPerElement() < 0){
  26. // ele.setEnergyPerElement(ele.getStateOfCharge());
  27. // }
  28. // producedEnergy += ele.getEnergyPerElement();
  29. // }
  30. // }
  31. // return producedEnergy;
  32. // }
  33. public void enableStorageDischarging(final double energyNeeded) {
  34. Collections.sort(storages, Collections.reverseOrder());
  35. // System.out.println("energy needed from storage" + energyNeeded);
  36. // int storagesLeft = storages.size();
  37. double energyLeftToEnabled = energyNeeded;
  38. for (StorageElement se: storages) {
  39. if(!se.chargeDepleted()){
  40. energyLeftToEnabled = energyLeftToEnabled - se.setStatusAndSetEnergy(
  41. StorageElement.Mode.EMIT, energyLeftToEnabled, energyRequiredForPowerplantBlackstart);
  42. }
  43. // storagesLeft = storagesLeft - 1;
  44. if(energyLeftToEnabled <= 0){
  45. System.out.println("enabled energy from storage");
  46. assessFitness(1,1,1,energyNeeded);
  47. return;
  48. }/*else if(storagesLeft <= 0){
  49. System.out.println("nicht genug enabled");
  50. }*/
  51. }
  52. }
  53. public void setAllStorageToStandy() {
  54. for (StorageElement se : storages) {
  55. se.setStatusAndSetEnergy(StorageElement.Mode.STANDBY, 0, energyRequiredForPowerplantBlackstart);
  56. }
  57. }
  58. //TODO: selbe probleme wie discharging
  59. void enableStorageCharging(float energyAvailable){
  60. Collections.sort(storages);
  61. System.out.println("energy available to storage" + energyAvailable);
  62. double availableEnergyLeft = energyAvailable;
  63. for (StorageElement se: storages) {
  64. if(!se.fullyCharged()){
  65. availableEnergyLeft = availableEnergyLeft - se.setStatusAndSetEnergy(
  66. StorageElement.Mode.COLLECT, availableEnergyLeft, energyRequiredForPowerplantBlackstart);
  67. }
  68. if(availableEnergyLeft <= 0){
  69. System.out.println("storage charging");
  70. return;
  71. }
  72. }
  73. }
  74. private void assessFitness(float w1, float w2, float w3, double energyNeeded){
  75. double fitness = 0f;
  76. fitness = w1 * distanceFitness(energyNeeded) + w2 * supplyFitness(energyNeeded) + w3 * holdMaxPowerFitness();
  77. System.out.println("Fitness score: " + fitness);
  78. }
  79. private double distanceFitness(double energyNeeded){//TODO: nicht lieber mit wiederstand?
  80. double distancePenalty = 0;
  81. ArrayList<StorageElement> sortedElements = storages;
  82. Collections.sort(sortedElements, Collections.reverseOrder());
  83. for (StorageElement ele : sortedElements) {
  84. if(!ele.chargeDepleted()){
  85. if(ele.getStatus().equals(StorageElement.Mode.EMIT)) {
  86. distancePenalty += goodDistance(energyNeeded ,ele);
  87. energyNeeded -= ele.getEnergyPerElement();
  88. }
  89. }
  90. }
  91. return distancePenalty;
  92. }
  93. private double goodDistance(double energyNeeded, StorageElement ele){
  94. if(energyNeeded <= 0){
  95. return 0;
  96. }
  97. if(energyNeeded >= ele.getCurrentMaxOutRatio()){
  98. if(ele.getChargingRatio() < ele.getCurrentMaxOutRatio()){
  99. return Math.abs(ele.getCurrentMaxOutRatio() - ele.getChargingRatio());
  100. }else{
  101. return 0;
  102. }
  103. }else{
  104. if(ele.getChargingRatio() < energyNeeded){
  105. return Math.abs(energyNeeded - ele.getChargingRatio());
  106. }else{
  107. return 0;
  108. }
  109. }
  110. }
  111. // private double produceTooMuch(StorageElement ele){
  112. // if(avgUtilization() >= ele.getUtilization(energyRequiredForPowerplantBlackstart)){
  113. // return 0;
  114. // }else{
  115. // return Math.abs(avgUtilization() - ele.getUtilization(energyRequiredForPowerplantBlackstart));
  116. // }
  117. // }
  118. //
  119. // private double produceTooLittle(StorageElement ele){
  120. // if(avgUtilization() <= ele.getUtilization(energyRequiredForPowerplantBlackstart)){
  121. // return 0;
  122. // }else{
  123. // return Math.abs(avgUtilization() - ele.getUtilization(energyRequiredForPowerplantBlackstart));
  124. // }
  125. // }
  126. //
  127. // private double avgDistance(){
  128. // double totalDistance = 0;
  129. // for (StorageElement ele : storages) {
  130. // if(ele.getStatus().equals(StorageElement.Mode.EMIT)){
  131. // totalDistance += ele.getHighDistance() + ele.getLowDistance();
  132. // }
  133. // }
  134. // return totalDistance/activeStorages();
  135. // }
  136. //
  137. // private double avgUtilization(){
  138. // double totalUtilization = 0;
  139. // for (StorageElement ele : storages) {
  140. // if(!ele.chargeDepleted()){
  141. // totalUtilization += ele.getUtilization(energyRequiredForPowerplantBlackstart);
  142. // }
  143. // }
  144. // return totalUtilization/activeStorages();
  145. // }
  146. //
  147. // private double activeStorages(){
  148. // double activeStorages = 0;
  149. // for (StorageElement ele : storages) {
  150. // if(ele.getStatus().equals(StorageElement.Mode.EMIT)){
  151. // activeStorages++;
  152. // }
  153. // }
  154. // return activeStorages;
  155. // }
  156. private double supplyFitness(double energyNeeded){
  157. double activeStoragePower = 0;
  158. for (StorageElement ele : storages) {
  159. if(ele.getStatus().equals(StorageElement.Mode.EMIT)) {
  160. activeStoragePower += ele.getEnergyPerElement();
  161. }
  162. }
  163. if((int) activeStoragePower + 1 < energyNeeded){
  164. return Math.pow(9000, 9000);//TODO:
  165. }else{
  166. return Math.abs(activeStoragePower - energyNeeded);
  167. }
  168. }
  169. private double holdMaxPowerFitness(){
  170. double willNotHoldPower = 0;
  171. for (StorageElement ele : storages) {
  172. if(ele.getStatus().equals(StorageElement.Mode.EMIT)) {
  173. willNotHoldPower += maxPowerNextIteration(ele);
  174. }
  175. }
  176. return willNotHoldPower;
  177. }
  178. private double maxPowerNextIteration(StorageElement ele){
  179. if(ele.getStateOfCharge() - ele.getChargingRatio() >= ele.getNominalOutRatio()){//TODO:
  180. return 0;
  181. }else{
  182. return ele.getNominalOutRatio() - (ele.getStateOfCharge() - ele.getChargingRatio());
  183. }
  184. }
  185. }