From 7e65e89ed80bcfd431184844db3def6673a06830 Mon Sep 17 00:00:00 2001 From: Milos-RTEi Date: Fri, 8 Dec 2023 00:19:23 +0100 Subject: [PATCH] fix - calc number of maintenances - exclude edge case --- .../Parameters/CalculateParametersPerCluster.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/solver/ts-generator/optimized-thermal-generator/Parameters/CalculateParametersPerCluster.cpp b/src/solver/ts-generator/optimized-thermal-generator/Parameters/CalculateParametersPerCluster.cpp index 4d3d43d3d1..2a90726289 100644 --- a/src/solver/ts-generator/optimized-thermal-generator/Parameters/CalculateParametersPerCluster.cpp +++ b/src/solver/ts-generator/optimized-thermal-generator/Parameters/CalculateParametersPerCluster.cpp @@ -61,6 +61,19 @@ std::vector OptimizationParameters::calculateNumberOfMaintenances( / (getAverageDurationBetweenMaintenances(cluster) + getAverageMaintenanceDuration(cluster)); numberOfMaintenances[unit] = std::max(1 + div, minNumberOfMaintenances); + + // Exclude Edge case: + // first maintenance starts in day 0 + last maintenance starts last day of Horizon + // and breaks the solver - can only happen for number of maintenances > 2 + int earliestStart + = std::max(0, calculateUnitEarliestStartOfFirstMaintenance(cluster, unit)); + int lastMaintenanceStart = earliestStart + + (numberOfMaintenances[unit] - 1) + * (getAverageDurationBetweenMaintenances(cluster) + + getAverageMaintenanceDuration(cluster)); + + if (lastMaintenanceStart >= timeHorizon_) + numberOfMaintenances[unit]--; } return numberOfMaintenances;