2017-03-29 8 views
0

は、以下の目的関数である:enter image description hereGurobiに以下の目的関数を書くには?

I次のJavaコードがあります。

// Create list of variables 
List<GRBVar> varList = new ArrayList<>(); 

// Set objective: maximize log(p) * x 
GRBLinExpr expr = new GRBLinExpr(); 

int counter = 0; 

for(Map.Entry<String, Double[]> entry: probabilityLevels.entrySet()) { 

    Double[] probs = entry.getValue(); 

    for (Double prob: probs) { 
     GRBVar x = model.addVar(0.0, 1.0, 0.0, GRB.BINARY, "x" + counter); 
     expr.addTerm(Math.log(prob), x); 
     varList.add(x); 
    } 
} 

model.setObjective(expr, GRB.MAXIMIZE); 

更新コードを

+0

pは意思決定変数かデータですか? zは上付き文字か指数ですか? –

+0

zは指数ではない上付き文字であり、pは単なる量子であり、既知の値を持つ変数です。私は、xの値がpが選択されているかどうかを決定するので、唯一の決定変数はxであると信じています。また、pが0になることもあることに気付きました。つまり、logは-Infinityです。これは、MIPソルバを実行した後に出力を失ってしまいます。私のpの計算が間違っている可能性がありますか、あるいはソルバーがこの値に対処するために使用できるいくつかの機能がありますか? – Andrei

答えて

2

あなたのループが正しく見えるが、あなたは一つだけを作成していますGRBVar xを使用して、j、k、zの各組み合わせに対して1つのGRBVarを作成するのではなく、これらのGRBVarオブジェクトをすべて格納するデータ構造を作成し、j、k、zの組み合わせに対して反復処理を行うように作成する必要があります。

+0

私は今コードを更新しましたが、私は以前のコメントで述べたようにログ値に同じ問題があります。 – Andrei

+0

GurobiのようなLP/MIPソルバで+/- Infinity値を操作する方法はありません。 –

関連する問題