2017-03-29 52 views
0

以下爲目標函數:如何在Gurobi中編寫如下目標函數?

enter image description here

我有以下的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,因爲x的值將決定是否選擇了p。另外,我注意到p有時可以是0,這意味着日誌是-Infinity。在運行MIP解算器後,這會混淆輸出。我對p的計算有可能是錯誤的,還是有一些解算器可以用來處理這個值的功能? – Andrei

回答

2

你的循環看起來是正確的,但你只能創建一個GRBVar x,而不是爲j,k和z的每個組合創建一個GRBVar。您應該創建一些數據結構來存儲所有這些GRBVar對象,並在迭代j,k和z的組合時創建它們。

+0

我現在更新了代碼,但我仍然遇到與我之前的評論中提到的日誌值相同的問題。 – Andrei

+0

在Gurobi這樣的LP/MIP求解器中,沒有辦法使用+/- Infinity值。 –