0

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

((x[t] - x[t-1]) / 步长) ^ 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.

4

1 回答 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 在两个连续的时间步中是相同的变量,st 随着时间的变化保持很小。

于 2018-09-13T10:08:54.397 回答