在cplex(Java)中为目标函数添加二次惩罚项

问题描述 投票:0回答:1

我正在开发一种用于家用能源系统的优化工具,该系统还包含电池。所有值都是正确的,解决方案是有道理的。问题是该解决方案包含非常强烈的波动。意味着决策变量通常为0或最大值。为了避免这种情况,我想添加一个二次约束来惩罚两个值的差异(类似于导数)。应该看起来像这样:

((x [t] - x [t-1])/ stepsize)^ 2

其中x是感兴趣的决策变量。例如。 power_g_h[t]

我的目标函数(到目前为止)定义如下:

IloLQNumExpr expr = model.lqNumExpr();

        for (int t = 0; t < timesteps; t++) {
            expr.addTerm(problem.getCosts().getElectricityCosts(t), power_g_h[t]);
            expr.addTerm(problem.getCosts().getElectricityCosts(t), power_g_b[t]);
            expr.addTerm(problem.getCosts().getElectricityCosts(t), power_g_bev[t]);
            expr.addTerm(problem.getCosts().getFeedCompensation(), power_pv_g[t]);

        } 

我希望这在某种程度上是可以理解的,并且有人能够在CPLEX中判断这是否可能。

如果这是不可能的,我会对如何在CPLEX中“平滑”解决方案的提示感到非常高兴。

亲切的问候,

L.

java optimization cplex objective-function
1个回答
0
投票

问题解决如下:

似乎不可能添加像x * ((a - b) ^ 2)这样的表达式。相反,解决方案是将上面写为x*a*a - 2x*a*b + x*b*b。其中x是惩罚因子,a&b是决策变量。这样就可以在cplex中将该术语添加到目标函数中。在代码中它看起来像这样:

IloCplex model = new IloCplex();
...
IloLQNumExpr expr = model.lqNumExpr();

expr.addTerm(x, a, a);
expr.addTerm(x, b, b);
expr.addTerm(-2 * x, a, b);

在我的情况下,a和b是两个连续时间步长相同的变量,s.t。随着时间的推移变化很小。

© www.soinside.com 2019 - 2024. All rights reserved.