台灣最大程式設計社群網站
線上人數
1553
 
會員總數:243325
討論主題:188102
歡迎您免費加入會員
討論區列表 >> Java >> 使用JAVA 寫CPLEX (線性最佳化) 的程式問題
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
使用JAVA 寫CPLEX (線性最佳化) 的程式問題
價值 : 100 QP  點閱數:122 回應數:0

樓主

s35212153
門外漢
0 2
71 2
發送站內信

各位大家好,由於在寫線性最佳化時遇到一些問題,不知道是不適合發文在此板塊,
若有不適請告知,我會立即刪文的,謝謝!

目前利用IBM CPLEX 提供的JAVA API 解線性最佳化的程式,遇到一些問題,想請問大家,問題如下:

假設今天我有5個區域需要做人力資源的派遣,且這5個區域中各有數量不等的子區域,每個子區域也有不同的距離成本,
而每個子區域也只需要一人派遣去建築,但是每個區域中的子區域都要有人派遣才可以算是滿足。

例如:

我有6個人可以派遣,每個人的體力有100%,每工作60分鐘,消耗10%的體力,每移動10公尺則會消耗體力1%。

區域分成有以下幾個區域

A1--->3 sub area : A11,A12,A13

A2--->2 sub area : A21,A22

A3--->2 sub area : A31,A32

A4--->4 sub area : A41,A42,A43,A44

A5--->4 sub area : A51,A52,A53,A54

我利用CPLEX去選擇距離成本最小的區域去派遣人力,假設A11 + A12 + A13得到最小的成本,所以我派遣3個人至A11,A12,A13,因此我剩下3個人,所以還有機會可以派遣至A2或A3,

假設A3中A31 + A32比A2的成本來的低,因此我派遣2個人力至A3,最終我剩餘1個人就無法派遣,我的目標是要得到最大化人力體力的消耗(表示要極大化的讓人力盡量消耗在建築中)

以下是我的程式碼

[code]

//宣告區域的2維陣列
double[][] A = new double[6][];
A[0] = new double[3];
A[1] = new double[2];
A[2] = new double[2];
A[3] = new double[4];
A[4] = new double[4];

//設定每個子區域人力體力的消耗量

A[0][0] = 55.2;
A[0][1] = 39.7;
A[0][2] = 69.8;

A[1][0] = 45.0;
A[1][1] = 36.0;

A[2][0] = 175.2;
A[2][1] = 115.4;

A[3][0] = 15.9;
A[3][1] = 52.8;
A[3][2] = 18.8;
A[3][3] = 15.8;

A[4][0] = 6.1;
A[4][1] = 27.0;
A[4][2] = 5.7;
A[4][3] = 8.8;


// x 表示 decision variable, 若我有派遣人力至子區域則 x = 1.
IloNumVar[][] x = new IloNumVar[6][];

// 根據區域中不同子區域,建立decision variable的長度
for (int i = 0; i < x.length; i++) {

x[i] = cplex.boolVarArray(A[i].length);

}


//判斷要派遣至哪一個區域

IloLinearNumExpr numExpr_total = cplex.linearNumExpr();

for (int i = 0; i < A.length; i++) {

IloLinearNumExpr numExpr = cplex.linearNumExpr();

for (int j = 0; j < A[i].length; j++) {

numExpr.addTerm(1.0, x[i][j]);

numExpr_total.addTerm(1.0, x[i][j]);

}

cplex.addEq(numExpr, A[i].length);
cplex.addLe(numExpr_total, peopleNum);

}

loLinearNumExpr object = cplex.linearNumExpr();

for (int i = 0; i < A.length; i++) {

for (int j = 0; j < A[i].length; j++) {

object.addTerm(A[i][j], x[i][j]);

}

}

cplex.addMaximize(object);

[/code]

最後會出現以下錯誤

CPXPARAM_Read_APIEncoding "UTF8"

Infeasibility row 'c2': 0 = -3.

Presolve time = 0.00 sec. (0.01 ticks)

請問不知道是程式碼哪邊沒有寫好,或是有什麼問題?

請各位指教,謝謝。

搜尋相關Tags的文章: [ java ] , [ cplex ] , [ lp ] ,
本篇文章發表於2018-07-14 12:11
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
目前尚無任何回覆
   

回覆
如要回應,請先登入.