|
@@ -4,6 +4,7 @@ import classes.StorageElement;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Collections;
|
|
|
+import java.util.LinkedList;
|
|
|
|
|
|
public class StorageProductionController {
|
|
|
private ArrayList<StorageElement> storages;
|
|
@@ -16,8 +17,8 @@ public class StorageProductionController {
|
|
|
|
|
|
public float currentPossibleStorageProduction() {
|
|
|
float possibleEnergy = 0;
|
|
|
- for (StorageElement so : storages) {
|
|
|
- possibleEnergy += so.getPossibleProduction(energyRequiredForPowerplantBlackstart);
|
|
|
+ for (StorageElement ele : storages) {
|
|
|
+ possibleEnergy += ele.getPossibleProduction(energyRequiredForPowerplantBlackstart);
|
|
|
}
|
|
|
return possibleEnergy;
|
|
|
}
|
|
@@ -39,21 +40,21 @@ public class StorageProductionController {
|
|
|
public void enableStorageDischarging(final double energyNeeded) {
|
|
|
Collections.sort(storages, Collections.reverseOrder());
|
|
|
// System.out.println("energy needed from storage" + energyNeeded);
|
|
|
- int storagesLeft = storages.size();
|
|
|
+// int storagesLeft = storages.size();
|
|
|
double energyLeftToEnabled = energyNeeded;
|
|
|
for (StorageElement se: storages) {
|
|
|
if(!se.chargeDepleted()){
|
|
|
energyLeftToEnabled = energyLeftToEnabled - se.setStatusAndSetEnergy(
|
|
|
StorageElement.Mode.EMIT, energyLeftToEnabled, energyRequiredForPowerplantBlackstart);
|
|
|
}
|
|
|
- storagesLeft = storagesLeft - 1;
|
|
|
+// storagesLeft = storagesLeft - 1;
|
|
|
if(energyLeftToEnabled <= 0){
|
|
|
System.out.println("enabled energy from storage");
|
|
|
assessFitness(1,1,1,energyNeeded);
|
|
|
return;
|
|
|
- }else if(storagesLeft <= 0){
|
|
|
+ }/*else if(storagesLeft <= 0){
|
|
|
System.out.println("nicht genug enabled");
|
|
|
- }
|
|
|
+ }*/
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -84,75 +85,89 @@ public class StorageProductionController {
|
|
|
private void assessFitness(float w1, float w2, float w3, double energyNeeded){
|
|
|
double fitness = 0f;
|
|
|
|
|
|
- fitness = w1 * distanceFitness() + w2 * supplyFitness(energyNeeded) + w3 * holdMaxPowerFitness();
|
|
|
+ fitness = w1 * distanceFitness(energyNeeded) + w2 * supplyFitness(energyNeeded) + w3 * holdMaxPowerFitness();
|
|
|
System.out.println("Fitness score: " + fitness);
|
|
|
}
|
|
|
|
|
|
- private double distanceFitness(){//TODO: nicht lieber mit wiederstand?
|
|
|
+ private double distanceFitness(double energyNeeded){//TODO: nicht lieber mit wiederstand?
|
|
|
double distancePenalty = 0;
|
|
|
- for (StorageElement ele : storages) {
|
|
|
+ ArrayList<StorageElement> sortedElements = storages;
|
|
|
+ Collections.sort(sortedElements, Collections.reverseOrder());
|
|
|
+ for (StorageElement ele : sortedElements) {
|
|
|
if(!ele.chargeDepleted()){
|
|
|
if(ele.getStatus().equals(StorageElement.Mode.EMIT)) {
|
|
|
- distancePenalty += goodDistance(ele);
|
|
|
+ distancePenalty += goodDistance(energyNeeded ,ele);
|
|
|
+ energyNeeded -= ele.getEnergyPerElement();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return distancePenalty;
|
|
|
}
|
|
|
|
|
|
- private double goodDistance(StorageElement ele){
|
|
|
- if(avgDistance() < ele.getHighDistance() + ele.getLowDistance()){
|
|
|
- return produceTooMuch(ele);
|
|
|
- }else{
|
|
|
- return produceTooLittle(ele);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private double produceTooMuch(StorageElement ele){
|
|
|
- if(avgUtilization() >= ele.getUtilization(energyRequiredForPowerplantBlackstart)){
|
|
|
+ private double goodDistance(double energyNeeded, StorageElement ele){
|
|
|
+ if(energyNeeded <= 0){
|
|
|
return 0;
|
|
|
- }else{
|
|
|
- return Math.abs(avgUtilization() - ele.getUtilization(energyRequiredForPowerplantBlackstart));
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- private double produceTooLittle(StorageElement ele){
|
|
|
- if(avgUtilization() <= ele.getUtilization(energyRequiredForPowerplantBlackstart)){
|
|
|
- return 0;
|
|
|
- }else{
|
|
|
- return Math.abs(avgUtilization() - ele.getUtilization(energyRequiredForPowerplantBlackstart));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private double avgDistance(){
|
|
|
- double totalDistance = 0;
|
|
|
- for (StorageElement ele : storages) {
|
|
|
- if(ele.getStatus().equals(StorageElement.Mode.EMIT)){
|
|
|
- totalDistance += ele.getHighDistance() + ele.getLowDistance();
|
|
|
+ if(energyNeeded >= ele.getCurrentMaxOutRatio()){
|
|
|
+ if(ele.getChargingRatio() < ele.getCurrentMaxOutRatio()){
|
|
|
+ return Math.abs(ele.getCurrentMaxOutRatio() - ele.getChargingRatio());
|
|
|
+ }else{
|
|
|
+ return 0;
|
|
|
}
|
|
|
- }
|
|
|
- return totalDistance/activeStorages();
|
|
|
- }
|
|
|
-
|
|
|
- private double avgUtilization(){
|
|
|
- double totalUtilization = 0;
|
|
|
- for (StorageElement ele : storages) {
|
|
|
- if(!ele.chargeDepleted()){
|
|
|
- totalUtilization += ele.getUtilization(energyRequiredForPowerplantBlackstart);
|
|
|
+ }else{
|
|
|
+ if(ele.getChargingRatio() < energyNeeded){
|
|
|
+ return Math.abs(energyNeeded - ele.getChargingRatio());
|
|
|
+ }else{
|
|
|
+ return 0;
|
|
|
}
|
|
|
}
|
|
|
- return totalUtilization/activeStorages();
|
|
|
}
|
|
|
|
|
|
- private double activeStorages(){
|
|
|
- double activeStorages = 0;
|
|
|
- for (StorageElement ele : storages) {
|
|
|
- if(ele.getStatus().equals(StorageElement.Mode.EMIT)){
|
|
|
- activeStorages++;
|
|
|
- }
|
|
|
- }
|
|
|
- return activeStorages;
|
|
|
- }
|
|
|
+// private double produceTooMuch(StorageElement ele){
|
|
|
+// if(avgUtilization() >= ele.getUtilization(energyRequiredForPowerplantBlackstart)){
|
|
|
+// return 0;
|
|
|
+// }else{
|
|
|
+// return Math.abs(avgUtilization() - ele.getUtilization(energyRequiredForPowerplantBlackstart));
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// private double produceTooLittle(StorageElement ele){
|
|
|
+// if(avgUtilization() <= ele.getUtilization(energyRequiredForPowerplantBlackstart)){
|
|
|
+// return 0;
|
|
|
+// }else{
|
|
|
+// return Math.abs(avgUtilization() - ele.getUtilization(energyRequiredForPowerplantBlackstart));
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// private double avgDistance(){
|
|
|
+// double totalDistance = 0;
|
|
|
+// for (StorageElement ele : storages) {
|
|
|
+// if(ele.getStatus().equals(StorageElement.Mode.EMIT)){
|
|
|
+// totalDistance += ele.getHighDistance() + ele.getLowDistance();
|
|
|
+// }
|
|
|
+// }
|
|
|
+// return totalDistance/activeStorages();
|
|
|
+// }
|
|
|
+//
|
|
|
+// private double avgUtilization(){
|
|
|
+// double totalUtilization = 0;
|
|
|
+// for (StorageElement ele : storages) {
|
|
|
+// if(!ele.chargeDepleted()){
|
|
|
+// totalUtilization += ele.getUtilization(energyRequiredForPowerplantBlackstart);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// return totalUtilization/activeStorages();
|
|
|
+// }
|
|
|
+//
|
|
|
+// private double activeStorages(){
|
|
|
+// double activeStorages = 0;
|
|
|
+// for (StorageElement ele : storages) {
|
|
|
+// if(ele.getStatus().equals(StorageElement.Mode.EMIT)){
|
|
|
+// activeStorages++;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// return activeStorages;
|
|
|
+// }
|
|
|
|
|
|
private double supplyFitness(double energyNeeded){
|
|
|
double activeStoragePower = 0;
|
|
@@ -185,18 +200,4 @@ public class StorageProductionController {
|
|
|
return ele.getNominalOutRatio() - (ele.getStateOfCharge() - ele.getChargingRatio());
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-// private float storageEnergy(StorageElement ele){
|
|
|
-// return ele.getStateOfCharge();
|
|
|
-// }
|
|
|
-//
|
|
|
-// private float totalEnergy(){
|
|
|
-// float energy = 0;
|
|
|
-// for (StorageElement ele : storages) {
|
|
|
-// if(ele.getStatus().equals(StorageElement.Mode.EMIT)){
|
|
|
-// energy = energy + storageEnergy(ele);
|
|
|
-// }
|
|
|
-// }
|
|
|
-// return energy;
|
|
|
-// }
|
|
|
}
|