@@ -8,7 +8,8 @@ package edu.ie3.simona.model.em.opt
88
99import optimus .algebra .{Double2Const , Expression }
1010import optimus .optimization .MPModel
11- import optimus .optimization .model .MPFloatVar
11+ import optimus .optimization .model .{MPFloatVar , MPVar }
12+ import squants .Power
1213
1314/** Trait for factories of power objectives. An objective is created for the sum
1415 * of power of a single time step.
@@ -25,7 +26,9 @@ trait PowerObjectiveFactory {
2526 * @return
2627 * The objective as an expression.
2728 */
28- def build (totalPower : Expression )(using model : MPModel ): Expression
29+ def build (totalPower : Expression , target : Power )(using
30+ model : MPModel
31+ ): Expression
2932}
3033
3134object PowerObjectiveFactory {
@@ -36,13 +39,12 @@ object PowerObjectiveFactory {
3639 object MinAbsPowerObjectiveFactory extends PowerObjectiveFactory {
3740
3841 override def build (
39- totalPower : Expression
42+ totalPower : Expression ,
43+ target : Power ,
4044 )(using model : MPModel ): Expression = {
41- val d = MPFloatVar .positive(" d" )
42- model.add(d >:= totalPower)
43- model.add(d >:= - totalPower)
45+ val difference = totalPower - target.toKilowatts
4446
45- d
47+ absoluteValue(difference, " differenceAbs " )
4648 }
4749
4850 }
@@ -70,12 +72,12 @@ object PowerObjectiveFactory {
7072 ) extends PowerObjectiveFactory {
7173
7274 override def build (
73- totalPower : Expression
75+ totalPower : Expression ,
76+ target : Power ,
7477 )(using model : MPModel ): Expression = {
78+ val difference = totalPower - target.toKilowatts
7579
76- val powerAbs = MPFloatVar .positive(" powerAbs" )
77- model.add(powerAbs >:= totalPower)
78- model.add(powerAbs >:= - totalPower)
80+ val differenceAbs = absoluteValue(difference, " differenceAbs" )
7981
8082 val segmentSize = lastSegment / segmentCount
8183
@@ -86,7 +88,7 @@ object PowerObjectiveFactory {
8688 val m = uCurrent + uNext
8789 val b = - uCurrent * uNext
8890
89- model.add(t >:= m * powerAbs + b)
91+ model.add(t >:= m * differenceAbs + b)
9092 }
9193
9294 // normalize the final value so that it maximizes
@@ -97,4 +99,14 @@ object PowerObjectiveFactory {
9799 }
98100
99101 }
102+
103+ private def absoluteValue (value : Expression , name : String )(using
104+ model : MPModel
105+ ): MPVar = {
106+ val valueAbs = MPFloatVar .positive(name)
107+ model.add(valueAbs >:= value)
108+ model.add(valueAbs >:= - value)
109+ valueAbs
110+ }
111+
100112}
0 commit comments