首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ojAlgo二次型优化器中的NPE

ojAlgo二次型优化器中的NPE
EN

Stack Overflow用户
提问于 2017-11-19 14:46:36
回答 2查看 172关注 0票数 1

我有一个非常短的程序,用来查找使用ojAlgo优化模型的方法:

代码语言:javascript
复制
package dwarfs

import org.ojalgo.optimisation.ExpressionsBasedModel
import org.ojalgo.optimisation.Variable
import java.util.concurrent.atomic.AtomicInteger

val model = ExpressionsBasedModel()

private val funcId = AtomicInteger(0)
private val variableId = AtomicInteger(0)
fun ExpressionsBasedModel.newVariable() = Variable(variableId.incrementAndGet().toString().let { "Variable$it" }).also(this::addVariable)
fun ExpressionsBasedModel.newExpression() = funcId.incrementAndGet().let { "Expression$it"}.let { this.addExpression(it) }

fun main(args: Array<String>) {
    val works = model.newExpression().upper(1).lower(0).apply {
        dwarfs.forEach { set(it.quata, it.quata, 1) }
    }

    println(model)
    println(works)

    model.maximise().let(::println)
}

class Dwarf(val usefulness: Double) {
    val quata: Variable = model.newVariable().lower(0).upper(1).weight(usefulness)
}

val dwarfs = listOf(
        Dwarf(0.4), Dwarf(0.2), Dwarf(1.1)
)

当我拉它的时候,我得到了NPE:

代码语言:javascript
复制
############################################
0 <= Variable1 (0.400000) <= 1.000000
0 <= Variable2 (0.200000) <= 1.000000
0 <= Variable3 (1.100000) <= 1.000000
0 <= Expression1: 0.75 <= 1.000000
############################################

0 <= Expression1 <= 1.000000
Exception in thread "main" java.lang.NullPointerException
at java.util.Objects.requireNonNull(Objects.java:203)
at org.ojalgo.ProgrammingError.throwIfNull(ProgrammingError.java:83)
at org.ojalgo.optimisation.convex.ConvexSolver$Builder.objective(ConvexSolver.java:318)
at org.ojalgo.optimisation.convex.ConvexSolver.copy(ConvexSolver.java:543)
at org.ojalgo.optimisation.convex.ConvexSolver$ModelIntegration.build(ConvexSolver.java:445)
at org.ojalgo.optimisation.convex.ConvexSolver$ModelIntegration.build(ConvexSolver.java:439)
at org.ojalgo.optimisation.ExpressionsBasedModel.solve(ExpressionsBasedModel.java:762)
at org.ojalgo.optimisation.ExpressionsBasedModel.maximise(ExpressionsBasedModel.java:626)
at dwarfs.DwarfsKt.main(dwarfs.kt:22)

我找不到关于如何使用二次优化器的任何文档。我哪里出错了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-20 10:46:11

ExpressionsBasedModel是一种建模工具。它可以使用许多不同的求解器,每个求解器都有不同的能力。ojAlgo有一组内置的求解器。一般来说,这可以处理ExpressionsBasedModel可以建模的所有东西,除了一件事--二次约束。这在ExpressionsBasedModel类的javadoc中有说明。(获得NPE并不“好”。我会解决的。)

要解决二次约束问题,您需要一个能够处理这个问题的求解器。例如,您可以尝试使用MOSEK:

https://www.mosek.com/

https://github.com/optimatika/ojAlgo-extensions/tree/master/ojAlgo-mosek

票数 1
EN

Stack Overflow用户

发布于 2017-11-19 15:45:10

好的,找到了:

目前,ojAlgo提供的求解器只能处理线性约束表达式。

遗憾的是,它没有出现在文档中或站点的任何地方(发现的引用来自代码注释)。

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

https://stackoverflow.com/questions/47378153

复制
相关文章

相似问题

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