gpt4 book ai didi

java - ojAlgo 使用 ExpressionsBasedModel 解决最小二乘问题

转载 作者:行者123 更新时间:2023-11-30 05:24:33 25 4
gpt4 key购买 nike

我试图了解如何使用 ExpressionsBasedModel 类来解决最小二乘问题并构造一个最小问题,但我没有获得我期望的结果。我的玩具问题是最小化

f(x) = (x - 4)^2

关于x。很容易看出这个函数的最小值是 x = 4。我编写了这个小 Java 程序,使用 ojAlgo 来最小化它:

import org.ojalgo.optimisation.ExpressionsBasedModel;
import org.ojalgo.optimisation.Variable;
import org.ojalgo.optimisation.Expression;
import org.ojalgo.optimisation.Optimisation.Result;

public class OjalgoDemo {
public static void main(String[] args) {
ExpressionsBasedModel model = new ExpressionsBasedModel();

// Minimize f(x) = (x - 4)^2, which has minimum x = 4

// (x - 4)^2 = x^2 - 8x + 16.
// Note that minimum of
// f(x) = x^2 - 8x + k
// is the same no matter the choice of k.

Variable x = model.addVariable("x");
Expression expr = model.addExpression("objective");

// Add the x^2 term
expr.set(x, x, 1.0);

// Add the -8x term
expr.set(x, -8.0);

Result result = model.minimise();

System.out.println("The state: " + result.getState());
System.out.println("The full result: " + result);
}
}

当我运行它时,我得到输出

The state: OPTIMAL
The full result: OPTIMAL 0.0 @ { 0 }

但我希望输出表明解 x = 4:

The state: OPTIMAL
The full result: OPTIMAL 0.0 @ { 4 }

为什么 ojAlgo 似乎没有按照我期望的方式解决我的问题?

我特别想使用 ExpressionsBasedModel 稍后向最小二乘问题添加线性不等式约束,但在此之前我希望能够解决我能想到的最小可能的最小二乘问题。

我使用以下命令编译并运行它:

javac OjalgoDemo.java -classpath ~/.m2/repository/org/ojalgo/ojalgo/47.3.1/ojalgo-47.3.1.jar
java -classpath ".:/home/rulle/.m2/repository/org/ojalgo/ojalgo/47.3.1/ojalgo-47.3.1.jar" OjalgoDemo

最佳答案

问题是您没有设置表达式的权重。如果不设置权重,对目标函数没有贡献。为了使代码按您的预期工作,您必须添加行

expr.weight(1.0);

这样就可以读取

Variable x = model.addVariable("x");
Expression expr = model.addExpression("objective");

// Add the x^2 term
expr.set(x, x, 1.0);

// Add the -8x term
expr.set(x, -8.0);

// THIS FIXES IT
expr.weight(1.0);

Result result = model.minimise();

执行此代码时,我得到输出

The state: DISTINCT
The full result: DISTINCT -16.0 @ { 4 }

这正是我们所期望的。 -16 来自这样一个事实:我们没有一个恒定的偏移量。要进一步了解设置权重意味着 expr 将有助于目标函数,请添加行 System.out.println("Objective? "+ expr.isObjective()); 仅当设置了权重时才会显示 true

关于java - ojAlgo 使用 ExpressionsBasedModel 解决最小二乘问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58919581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com