You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:24:01