Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin ojAlgo二次优化器中的NPE_Kotlin_Ojalgo - Fatal编程技术网

Kotlin ojAlgo二次优化器中的NPE

Kotlin ojAlgo二次优化器中的NPE,kotlin,ojalgo,Kotlin,Ojalgo,我有一个很短的程序,它应该使用ojAlgo找到优化模型: package dwarfs import org.ojalgo.optimisation.ExpressionsBasedModel import org.ojalgo.optimisation.Variable import java.util.concurrent.atomic.AtomicInteger val model = ExpressionsBasedModel() private val funcId = Atom

我有一个很短的程序,它应该使用ojAlgo找到优化模型:

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)
)
包矮人
导入org.ojalgo.optimization.expressionbasedModel
导入org.ojalgo.optimization.Variable
导入java.util.concurrent.AtomicInteger
val模型=表达式BasedModel()
private val funcId=AtomicInteger(0)
private val variableId=AtomicInteger(0)
fun ExpressionBasedModel.newVariable()=变量(variableId.incrementAndGet().toString().let{“Variable$it”})。另外(this::addVariable)
fun expressionbasedModel.newExpression()=funcId.incrementAndGet().let{“Expression$it”}.let{this.addExpression(it)}
趣味主线(args:Array){
val works=model.newExpression().upper(1).lower(0).apply{
dwarfs.forEach{set(it.quata,it.quata,1)}
}
println(模型)
印刷(工程)
model.maximize().let(::println)
}
类侏儒(val有用性:双){
val quata:Variable=model.newVariable().下限(0).上限(1).权重(有用性)
}
瓦尔矮星=列表(
矮星(0.4)、矮星(0.2)、矮星(1.1)
)
当我完成时,我会得到一个NPE:

############################################
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)
############################################
0Ok,找到了:

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


遗憾的是,它不在文档中或网站上的任何地方(找到的引用来自代码注释)。

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

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


我只是想澄清一下,你是在做非线性工作吗?看起来ojAlgo有一些二次函数。我猜你没有调用它。稍后我会更深入地了解。啊,我想建议非线性约束可能在解算器中不可用。@tmn您能建议一个用于该约束的库(QCLP)吗?谢谢!有没有一种方法可以只使用Gradle进行设置?MOSEK是一种非Java编写的商业产品。你不能只用Maven或Gradle就能得到它。有一个Java接口,ojAlgo有一个使用该接口的集成。