1

我试图了解如何使用 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
4

2 回答 2

1

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

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());显示为真的行。

于 2019-11-19T05:25:07.367 回答
0

您尚未指定目标函数是什么。将某些东西命名为“客观”并不能做到这一点……相反,您将其分配weights给变量和/或表达式。在创建优化模型时,您可以使用以下代码示例作为起点:https ://www.ojalgo.org/code-examples/

于 2019-11-18T18:35:21.627 回答