将二次惩罚项添加到 cplex (Java) 中的 objective 函数

Add quadratic penalty term to objective function in cplex (Java)

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

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

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

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

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 中是否可行。

如果无法做到这一点,我将很乐意提供有关如何 "smoothen" CPLEX 中的解决方案的提示。

谨致问候,

L.

问题解决如下:

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

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。随着时间的推移变化很小。