【发布时间】:2021-08-28 12:30:44
【问题描述】:
简介
我正在尝试使用 ojalgo 库来生成一种解决方案,以控制放置在任意位置的推进器,以生成整体请求的旋转和平移。有时请求的旋转和平移是不可能的,但我希望在这些情况下试一试。
问题
我创建了这个我设置的 ExpressionsBasedModel 的最小示例。
如果我请求一组可能的条件,我会得到一个好的结果:
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;
model.addExpression("XMotion")
.weight(1)
.set(thruster1, 1)
.set(thruster2, 1).lower(targetXThrust).upper(targetXThrust);
Optimisation.Result minimised = model.minimise();
System.out.println(minimised); //outputs 1,1
但如果我要求一些不太可能的事情
double targetXThrust = 2.1;
model.addExpression("XMotion")
.weight(1)
.set(thruster1, 1)
.set(thruster2, 1).lower(targetXThrust).upper(targetXThrust);
System.out.println(minimised); //outputs 0.5,0.5
理想情况下,我想要一个好的次优解决方案 (1,1),但它似乎放弃并返回 0.5,0.5
问题
对于不可能完全实现的问题,是否有可能得到一个好的次优解决方案?
可能的问题是我想最小化表达式上的错误,但我认为它实际上是最小化值(同时试图满足约束)
【问题讨论】:
-
我确实有一个 hacky 解决方案,引入了一个额外的变量; badness 允许任何正值(并有助于 XMotion)并且具有非常高的权重。这导致模型仅在确实需要时才使用它,但确保解决方案始终是可能的(从求解器的角度来看)。如果我没有得到答案,我会发布,但感觉不对
标签: ojalgo linear-optimization