我正在为一个家庭能源系统开发一个优化工具,它也包含一个电池。所有值都是正确的,解决方案是有意义的。问题是解决方案包含非常大的波动。这意味着决策变量通常为 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.
该问题已解决如下:
似乎无法添加像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.随时间的变化保持很小。