From 66ad6e422c44bd3059d81c71f7c32909df0d8634 Mon Sep 17 00:00:00 2001 From: Thomas Bouquet Date: Wed, 18 Dec 2024 14:04:53 +0100 Subject: [PATCH] average cost/angle for PSTs Signed-off-by: Thomas Bouquet --- .../fillers/CostCoreProblemFiller.java | 19 ++++++++++++++++-- .../fillers/CostCoreProblemFillerTest.java | 20 +++++++++---------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/linearoptimisation/algorithms/fillers/CostCoreProblemFiller.java b/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/linearoptimisation/algorithms/fillers/CostCoreProblemFiller.java index 858f112428..9a33a54608 100644 --- a/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/linearoptimisation/algorithms/fillers/CostCoreProblemFiller.java +++ b/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/linearoptimisation/algorithms/fillers/CostCoreProblemFiller.java @@ -10,6 +10,7 @@ import com.powsybl.openrao.commons.OpenRaoException; import com.powsybl.openrao.commons.Unit; import com.powsybl.openrao.data.crac.api.State; +import com.powsybl.openrao.data.crac.api.rangeaction.PstRangeAction; import com.powsybl.openrao.data.crac.api.rangeaction.RangeAction; import com.powsybl.openrao.raoapi.parameters.RangeActionsOptimizationParameters; import com.powsybl.openrao.searchtreerao.commons.RaoUtil; @@ -110,8 +111,10 @@ protected void fillObjective(LinearProblem linearProblem) { OpenRaoMPVariable downwardVariationVariable = linearProblem.getRangeActionVariationVariable(ra, state, LinearProblem.VariationDirectionExtension.DOWNWARD); double defaultVariationCost = getRangeActionPenaltyCost(ra, rangeActionParameters); - linearProblem.getObjective().setCoefficient(upwardVariationVariable, ra.getVariationCost(RangeAction.VariationDirection.UP).orElse(defaultVariationCost)); - linearProblem.getObjective().setCoefficient(downwardVariationVariable, ra.getVariationCost(RangeAction.VariationDirection.DOWN).orElse(defaultVariationCost)); + // convert cost/tap to cost/degree for PSTs + double conversionCoefficient = ra instanceof PstRangeAction pstRangeAction ? getCostPerAngleCoefficient(pstRangeAction) : 1.0; + linearProblem.getObjective().setCoefficient(upwardVariationVariable, conversionCoefficient * ra.getVariationCost(RangeAction.VariationDirection.UP).orElse(defaultVariationCost)); + linearProblem.getObjective().setCoefficient(downwardVariationVariable, conversionCoefficient * ra.getVariationCost(RangeAction.VariationDirection.DOWN).orElse(defaultVariationCost)); if (ra.getActivationCost().isPresent() && ra.getActivationCost().get() > 0) { OpenRaoMPVariable activationVariable = linearProblem.getRangeActionVariationBinary(ra, state); @@ -120,4 +123,16 @@ protected void fillObjective(LinearProblem linearProblem) { } )); } + + /** + * Approximates the cost of changing the angle of a PST by a degree. + * @param pstRangeAction : PST range action to optimize + * @return averaged cost per degree + */ + private static double getCostPerAngleCoefficient(PstRangeAction pstRangeAction) { + double maxAngle = pstRangeAction.getTapToAngleConversionMap().values().stream().max(Double::compareTo).orElseThrow(); + double minAngle = pstRangeAction.getTapToAngleConversionMap().values().stream().min(Double::compareTo).orElseThrow(); + int numberOfTaps = pstRangeAction.getTapToAngleConversionMap().size(); + return numberOfTaps / (maxAngle - minAngle); + } } diff --git a/ra-optimisation/search-tree-rao/src/test/java/com/powsybl/openrao/searchtreerao/linearoptimisation/algorithms/fillers/CostCoreProblemFillerTest.java b/ra-optimisation/search-tree-rao/src/test/java/com/powsybl/openrao/searchtreerao/linearoptimisation/algorithms/fillers/CostCoreProblemFillerTest.java index ad46a1ea12..2c8759163e 100644 --- a/ra-optimisation/search-tree-rao/src/test/java/com/powsybl/openrao/searchtreerao/linearoptimisation/algorithms/fillers/CostCoreProblemFillerTest.java +++ b/ra-optimisation/search-tree-rao/src/test/java/com/powsybl/openrao/searchtreerao/linearoptimisation/algorithms/fillers/CostCoreProblemFillerTest.java @@ -183,8 +183,8 @@ void fillTestOnPreventive() { // check objective assertEquals(15.0, linearProblem.getObjective().getCoefficient(activationVariable)); - assertEquals(10.0, linearProblem.getObjective().getCoefficient(upwardVariationVariable)); - assertEquals(10.0, linearProblem.getObjective().getCoefficient(downwardVariationVariable)); + assertEquals(26.49, linearProblem.getObjective().getCoefficient(upwardVariationVariable), 0.01); + assertEquals(26.49, linearProblem.getObjective().getCoefficient(downwardVariationVariable), 0.01); } @Test @@ -268,8 +268,8 @@ void fillTestOnPreventiveFiltered() { // check objective assertEquals(15.0, linearProblem.getObjective().getCoefficient(activationVariable)); - assertEquals(10.0, linearProblem.getObjective().getCoefficient(upwardVariationVariable)); - assertEquals(10.0, linearProblem.getObjective().getCoefficient(downwardVariationVariable)); + assertEquals(26.49, linearProblem.getObjective().getCoefficient(upwardVariationVariable), 0.01); + assertEquals(26.49, linearProblem.getObjective().getCoefficient(downwardVariationVariable), 0.01); } @Test @@ -353,8 +353,8 @@ void fillTestOnCurative() { // check objective assertEquals(15.0, linearProblem.getObjective().getCoefficient(activationVariable)); - assertEquals(10.0, linearProblem.getObjective().getCoefficient(upwardVariationVariable)); - assertEquals(10.0, linearProblem.getObjective().getCoefficient(downwardVariationVariable)); + assertEquals(26.49, linearProblem.getObjective().getCoefficient(upwardVariationVariable), 0.01); + assertEquals(26.49, linearProblem.getObjective().getCoefficient(downwardVariationVariable), 0.01); } @Test @@ -499,11 +499,11 @@ void fillTestOnGlobal() { // check objective assertEquals(15.0, linearProblem.getObjective().getCoefficient(prevActivationVariable)); - assertEquals(10.0, linearProblem.getObjective().getCoefficient(prevUpwardVariationVariable)); - assertEquals(10.0, linearProblem.getObjective().getCoefficient(prevDownwardVariationVariable)); + assertEquals(26.49, linearProblem.getObjective().getCoefficient(prevUpwardVariationVariable), 0.01); + assertEquals(26.49, linearProblem.getObjective().getCoefficient(prevDownwardVariationVariable), 0.01); assertEquals(15.0, linearProblem.getObjective().getCoefficient(curActivationVariable)); - assertEquals(10.0, linearProblem.getObjective().getCoefficient(curUpwardVariationVariable)); - assertEquals(10.0, linearProblem.getObjective().getCoefficient(curDownwardVariationVariable)); + assertEquals(26.49, linearProblem.getObjective().getCoefficient(curUpwardVariationVariable), 0.01); + assertEquals(26.49, linearProblem.getObjective().getCoefficient(curDownwardVariationVariable), 0.01); } private void updateLinearProblem() {