首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ojAlgo用ExpressionsBasedModel求解最小二乘问题

ojAlgo用ExpressionsBasedModel求解最小二乘问题
EN

Stack Overflow用户
提问于 2019-11-18 17:00:57
回答 2查看 323关注 0票数 1

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

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

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

代码语言:javascript
复制
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);
    }
}

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

代码语言:javascript
复制
The state: OPTIMAL
The full result: OPTIMAL 0.0 @ { 0 }

但是,我希望输出表明解决方案x= 4:

代码语言:javascript
复制
The state: OPTIMAL
The full result: OPTIMAL 0.0 @ { 4 }

为什么ojAlgo不以我期望的方式解决我的问题呢?

我特别想用ExpressionsBasedModel来在最小二乘问题中加入线性不等式约束,但是在这样做之前,我希望能够解决最小的可能的最小二乘问题。

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-19 05:25:07

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

代码语言:javascript
复制
expr.weight(1.0);

所以它会读到

代码语言:javascript
复制
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();

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

代码语言:javascript
复制
The state: DISTINCT
The full result: DISTINCT -16.0 @ { 4 }

这正是我们所期望的。-16来源于这样一个事实,即我们没有固定的偏移量。要进一步了解设置权重意味着expr将对目标函数做出贡献,请添加一行System.out.println("Objective? " + expr.isObjective());,只有在设置了权重时才会显示为真。

票数 1
EN

Stack Overflow用户

发布于 2019-11-18 18:35:21

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58919581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档