使用 CPLEX 为任务添加多个前置任务,通过 OPL 实现 RCPSP

问题描述 投票:0回答:1

在多次收到有关此问题的帮助后,我正在一步步完成我的模型。我已经创建了这个,并且它在单个前置任务中运行良好。然而,我现在的目标是调整这个模型来处理多个前置任务。 :

// Example data
range J = 1..4;
range R = 1..1;
range T = 0..9;
int P[J] = [0,1,2,3]; 
int d[J] = [2, 3, 1, 4];
int EF[J] = [0, 2, 5, 6];
int LF[J] = [0, 2, 5, 6];
int Tbar = sum(j in J) d[j];

// Resource usage matrix
int u[J][R] = [[2],[5],[5],[5]]; 

// Resource availability
int a[R]= [10];

// Decision Variables
dvar boolean x[J][T];

dexpr int CT = sum(j in J, t in EF[j]..LF[j])t*x[j][t];
minimize CT;

subject to {
  forall(j in J)
    ct1:sum (t in EF[j]..LF[j]) x[j][t] == 1;
  forall(j in J: P[j] != 0) // assuming 0 indicates no predecessor
    ct2:sum (t in EF[j]..LF[j]) x[j][t] * t >=
        sum (t in EF[P[j]]..LF[P[j]]) x[P[j]][t] * (t + d[P[j]]);
  forall(r in R, t in 1..Tbar) {
    ct3:sum(j in J) u[j][r] * sum(q in maxl(t, EF[j])..minl(t + d[j] - 1, LF[j])) x[j][q] <= a[r];
  }
}

对于这个,我尝试修改它以处理多个前置任务,但遇到了一些问题:

// Example data
range J = 1..10;
range R = 1..2;
range T = 1..10;
{int} Tasks =asSet(1..10);
setof(int) P[Tasks] = [{0}, {1}, {2}, {1}, {4,3}, {4,3}, {4,3}, {6}, {8}, {5,7,9}];

int d[J] = [7, 3, 1, 8, 2, 1, 1, 2, 2, 1];
int EF[J] = [0, 7, 10, 7, 15, 15, 15, 16, 18, 20];
int LF[J] = [0, 11, 14, 7, 18, 15, 19, 16, 18, 20];
int Tbar = sum(j in J) d[j];

// Resource usage matrix
int u[J][R] = [[2,1], [2,2], [2,2], [1,1], [2,1], [2,1], [1,0], [2,1], [2,2], [3,0]];

// Resource availability
int a[R] = [4, 2];

// Decision Variables
dvar boolean x[J][T];

dexpr int CT = sum(j in J, t in EF[j]..LF[j]:t in T) t * x[j][t];
minimize CT;

subject to {
  forall(j in J)
    ct1:sum (t in EF[j]..LF[j]) x[j][t] == 1;
  forall(j in J: P[Tasks]!= 0) // assuming 0 indicates no predecessor
        ct2:sum (t in EF[j]..LF[j]) x[j][t] * t >=
             sum (t in EF[P[Tasks]]..LF[P[Tasks]]) x[P[Tasks]][t] * (t + d[P[Tasks]]); 
  forall(r in R, t in 1..Tbar) {
    ct3:sum(j in J) u[j][r] * sum(q in maxl(t, EF[j])..minl(t + d[j] - 1, LF[j])) x[j][q] <= a[r];
  }
}

我的目标是调整 RCPSP 模型来处理多个前置任务。

mathematical-optimization cplex opl
1个回答
0
投票

以下模型工作正常

// Example data
range J = 1..4;
range R = 1..1;
range T = 0..9;
//int P[J] = [0,1,2,3]; 
int d[J] = [2, 3, 1, 4];
int EF[J] = [0, 2, 5, 6];
int LF[J] = [0, 2, 5, 6];
int Tbar = sum(j in J) d[j];

{int} Tasks =asSet(1..10);
setof(int) P[Tasks] = [{}, {1}, {2}, {1}, {4,3}, {4,3}, {4,3}, {6}, {8}, {5,7,9}];
// {} means no predecessor


// Resource usage matrix
int u[J][R] = [[2],[5],[5],[5]]; 

// Resource availability
int a[R]= [10];

// Decision Variables
dvar boolean x[J][T];

dexpr int CT = sum(j in J, t in EF[j]..LF[j])t*x[j][t];
minimize CT;

subject to {
  forall(j in J)
    ct1:sum (t in EF[j]..LF[j]) x[j][t] == 1;
  forall(j in J) forall(predj in P[j]) // assuming 0 indicates no predecessor
    sum (t in EF[j]..LF[j]) x[j][t] * t >=
        sum (t in EF[predj]..LF[predj]) x[predj][t] * (t + d[predj]);
  forall(r in R, t in 1..Tbar) {
    ct3:sum(j in J) u[j][r] * sum(q in maxl(t, EF[j])..minl(t + d[j] - 1, LF[j])) x[j][q] <= a[r];
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.