使用ojalgo求解线性优化问题时如何获取优质次优解
问题根源
你当前的写法是将推力输出必须等于目标值设为了硬约束,也就是要求t1+t2的上下限完全等于目标值。当该约束不可满足时(两个推进器最大总推力仅为2,无法达到2.1),ojalgo的求解逻辑会转为最小化不可行状态下的惩罚项,此时你给两个变量设置的0.1权重会生效,求解器会优先把变量值往最小方向压,因此得到了0.5、0.5的不符合预期的结果。
解决方法
你的需求属于软约束优化场景,即允许输出和目标有偏差,优先最小化偏差值,不需要设置强制的上下限约束,改用target()方法设置软目标即可:
Variable thruster1 = new Variable("t1").lower(0).upper(1).weight(0.1); Variable thruster2 = new Variable("t2").lower(0).upper(1).weight(0.1); ExpressionsBasedModel model = new ExpressionsBasedModel(); model.addVariable(thruster1); model.addVariable(thruster2); double targetXThrust = 2.1; model.addExpression("XMotion") .weight(1) .set(thruster1, 1) .set(thruster2, 1) .target(targetXThrust); // 替换硬上下限为软目标设置 Optimisation.Result minimised = model.minimise(); System.out.println(minimised); // 输出为1,1,符合预期
原理说明
改用软目标后,求解器的优化目标变为:(XMotion实际值与目标值的偏差 * 偏差权重1) + (t1*0.1 + t2*0.1)。这种场景下,两个推进器全开工输出总推力2,和目标2.1的偏差仅为0.1,是所有可行解里总优化目标最小的结果,自然会返回你期望的(1,1)次优解。
如果有多个平移、旋转维度的需求,都可以通过给对应维度的表达式设置不同的偏差权重,来得到贴合你优先级的最优拟合解。
内容的提问来源于stack exchange,提问作者Richard Tingle
相关产品推荐
相关产品推荐

