2017-11-19 9 views
1

私はojAlgoを使用してモデルを最適化見つけることになって非常に短いプログラムを持っている:私はそれをTUNときNPE 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) 
) 

、私は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) 

私は二次オプティマイザの使用方法に関するドキュメントが見つかりませんでした。どこで私は間違えましたか?

[OK]を
+0

あなたは非線形の仕事をしているので、ただ、明確にしますか? ojAlgoにはいくつかの二次関数があるようです。私はあなたがそれを呼び出さないと思っています。後で詳しく見ていきます。 https://github.com/optimatika/ojAlgo/blob/7a8662eb7d311b88f13b110aace8907855212ab6/src/org/ojalgo/optimisation/Expression.java#L55L:L70 – tmn

答えて

1

ExpressionsBasedModelはモデリングツールです。多くの異なるソルバーを使用することができ、各ソルバーは異なる能力を持ちます。 ojAlgoには、ソルバの集合が組み込まれています。一般に、それらはExpressionsBasedModelが2つの制約を除いてモデル化できるものすべてを処理できます。これは、ExpressionsBasedModelクラスのjavadocに記述されています。 (NPEを取得するのは「良い」ではありません。それを修正します)

2次制約付き問題を解決するには、それを処理できるソルバーが必要です。あなたは、インスタンスのためMOSEKを試みることができる:

https://www.mosek.com/

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

+0

ありがとう! Gradleだけを使って設定する方法はありますか? – voddan

+1

MOSEKはJavaで書かれていない製品です。あなたはMavenやGradleを使ってそれを得ることはできません。 Javaインターフェースがあり、ojAlgoはそれを使って統合しています。 – apete

0

は、それを見つけた:

現在ojAlgoにより供給されたソルバーが唯一の線形制約式を扱うことができます。

残念ですが、ドキュメントやサイトのどこにも見つかりませんでした(見付かった見積もりはコードコメントからのものです)。

+0

ああ、非線形制約がソルバーで利用できないかもしれないことを示唆しました。 – tmn

+0

@tmnあなたはそのライブラリ(QCLP)を提案できますか? – voddan

関連する問題