首頁 > 網際網路

詳解Java如何呼叫Cplex

2019-12-10 09:07:15

Cplex是IBM公司的一個優化軟體,可以用來求解線性規劃(Linear Programming,LP),二次規劃(Quadratic Programming,QP)、混合整數規劃(Mixed Integer Programming,MIP)問題。

下面介紹一下Java如何呼叫Cplex。

1

首先需要安裝Cplex軟體,我安裝的版本是cplex_studio122.win-x86-32.exe


2

下圖安裝後開啟的Cplex自帶的IDE,看上去跟Eclipse差不多。


3

在Cplex的安裝目錄下有許多值得我們學習的東西,還有一些examples,可供我們參考。


4

我是在Eclipse中使用Java呼叫Cplex,所以先把一些Cplex依賴加上。

執行依賴:cplex.jar(在..cplexlib目錄下找到)和cplex122.dll(在..cplexbin目錄下找到)。將cplex.jar加到工程的Build Path中。


5

cplex122.dll可以設定到執行時的環境中(VM arguments),或者新增到專案的Native library location。


6

接下來我們求解一個具體的線性規劃問題。


7

例如,我們求解下面這樣一個線性規劃問題:Maximize?? ?x1 + 2x2 + 3x3subject to?????????????????? -x1 + x2 + x3 ≦20??????????????????? x1 - 3x2 + x3 ≦30with these bounds????????????????????????? 0 ≦x1 ≦40????????????????????????? 0 ≦x2 ≦+∞????????????????????????? 0≦ x3≦ +∞

8

先建立一個IloCplex物件,它是用來建立所有建模物件所需要的模型。此時會丟擲一個異常:IloException,需要trycatch。程式碼如下:static public class Application {??? static public main(String[] args) {??????? try {??????????? IloCplex cplex = new IloCplex();??????????? // create model and solve it??????? } catch (IloException e) {??????????? System.err.println("Co
ncert exception caught: " + e);??????? }???? }}

9

定義決策變數:double[] lb = {0.0, 0.0, 0.0};double[] ub = {40.0, Double.MAX_VALUE, Double.MAX_VALUE};IloNumVar[] x = cplex.numVarArray(3, lb, ub);

10

定義目標函數:IloNumExpr expr = cplex.sum(x[0], cplex.prod(2.0, x[1]),cplex.prod(3.0, x[2]));cplex.addMaximize(expr);其中這個地方有許多寫法,大家在使用的時候可以注意一下。

11

定義決策的約束條件:cplex.addLe(cplex.sum(cplex.negative(x[0]), x[1], x[2]), 20);cplex.addLe(cplex.sum(cplex.prod(1, x[0]), cplex.prod(-3, x[1]),cplex.prod(1, x[2])), 30);

12

最後解決模型問題:if(cplex.solve()){....}如果solve()返回true的話,我們可以獲取一些資訊,例如問題的解決狀態、獲取方案的目標值、獲取陣列中的所有決策變數的解值。cplex.getStatus()返回值型別:Error、Unknown、Feasible、Bounded、Optimal、Infeasible、Unbouded、InfeasibleorUnbounded。獲取方案的目標值:double objval = cplex.getObjValue();獲取陣列中的所有決策變數的解值:double[] xval = cplex.getValues(x);

13

執行程式最後控制台的輸出結果如下所示:



IT145.com E-mail:sddin#qq.com