在cplex(Java)中向目标函数添加二次惩罚项
我正在为一个也包含电池的家庭能源系统开发一个优化工具。所有值都是正确的,解决方案是有意义的。问题是这个解包含非常强的波动。这意味着决策变量通常为0或最大值。为了避免这种情况,我想添加一个二次约束,惩罚两个值的差(类似于导数)。应该是这样的:在cplex(Java)中向目标函数添加二次惩罚项,java,optimization,cplex,objective-function,Java,Optimization,Cplex,Objective Function,我正在为一个也包含电池的家庭能源系统开发一个优化工具。所有值都是正确的,解决方案是有意义的。问题是这个解包含非常强的波动。这意味着决策变量通常为0或最大值。为了避免这种情况,我想添加一个二次约束,惩罚两个值的差(类似于导数)。应该是这样的: IloCplex model = new IloCplex(); ... IloLQNumExpr expr = model.lqNumExpr(); expr.addTerm(x, a, a); expr.addTerm(x, b, b); expr.a
IloCplex model = new IloCplex();
...
IloLQNumExpr expr = model.lqNumExpr();
expr.addTerm(x, a, a);
expr.addTerm(x, b, b);
expr.addTerm(-2 * x, a, b);
((x[t]-x[t-1])/步长)^2
其中x是感兴趣的决策变量。例如,power\u g\u 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]);
}
IloLQNumExpr expr=model.lqNumExpr();
for(int t=0;t
我希望这在某种程度上是可以理解的,并且有人能够判断这在CPLEX中是否是可能的
如果这是不可能的,我会非常高兴的提示如何“平滑”的解决方案在CPLEX
致以亲切的问候
L.问题的解决方法如下:
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]);
}
似乎不可能添加像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中是相同的变量。随时间的变化保持较小。是的,您可以向目标添加二次项。请参阅CPLEX附带的
QPex1.java
示例。这就是你要问的吗?你应该试试看它是否能给你想要的平滑效果。另一个想法是尝试使用检查备选最佳解决方案。谢谢您的回答。问题的解决方案是将(x2-x1)^2重写为x2x2-2x2x1+x1x1。但是QPex1.java的提示也非常有用。很高兴能提供帮助。顺便说一句,如果你想获得一些声誉积分,请随意提供一个更详细的问题(这是完全合法的,鼓励回答并“接受”你自己的答案)。