在線急急急急急!!!!!
请问以下 CPLEX 该如何输出 Cmax?
我主要输出工厂之间最大总完工时间。
int num_jobs = ...;
int num_stages = ...;
int num_factory = ...;
range pred_jobs = 0..num_jobs;
range jobs = 1..num_jobs;
range stages = 1..num_stages;
range factories = 1..num_factory;
int stage_machines[stages] = ...;
range machines = 1.. max(g in stages) stage_machines[g];
int processing_time[jobs][stages] = ...;
int setup_time[pred_jobs][jobs] = ...;
int BigM = sum(j in jobs, g in stages) processing_time[j][g] +
sum(pred_j in pred_jobs, j in jobs) setup_time[pred_j][j];
dvar boolean x[jobs][factories];
dvar boolean y[jobs][factories][stages][machines];
dvar boolean z[pred_jobs][jobs][stages];
dvar int+ S[jobs][factories][stages];
dvar int+ C[jobs][factories][stages];
dvar int+ Cmax;
minimize Cmax;
subject to{
forall(f in factories)
sum(j in jobs) x[j][f] >= 1;
forall(j in jobs)
sum(f in factories) x[j][f] == 1;
forall(j in jobs, f in factories, g in stages)
sum(i in 1..stage_machines[g]) y[j][f][g][i] == x[j][f];
forall(j in jobs, f in factories, g in stages)
sum(i in 1..stage_machines[g]) y[j][f][g][i] <= 1;
forall(f in factories, g in stages, i in 1..stage_machines[g])
sum(j in jobs) y[j][f][g][i] >= 1;
forall(pred_j in jobs, j in jobs: pred_j != j, g in stages)
z[pred_j][j][g] + z[j][pred_j][g] >= 1;
forall(j in jobs, g in stages)
z[0][j][g] == 1;
// 任何階段之第一個工作之起始時間及完工時間
forall(j in jobs, f in factories, g in stages, i in 1..stage_machines[g]){
S[j][f][g] + BigM * (2 - y[j][f][g][i] - z[0][j][g]) >= setup_time[0][j];
C[j][f][g] + BigM * (2 - y[j][f][g][i] - z[0][j][g]) >= S[j][f][g] + processing_time[j][g];
}
// 第一個工作在後續階段之起始時間
forall(j in jobs, f in factories, g in 1..num_stages-1, i in 1..stage_machines[g]){
S[j][f][g+1] + BigM * (4 - y[j][f][g][i] - y[j][f][g+1][i] - z[0][j][g] - z[0][j][g+1]) >= C[j][f][g];
}
// 同一階段之後續工作之起始時間
forall(pred_j, j in jobs: pred_j != j, f in factories, g in stages, i in 1..stage_machines[g]){
S[j][f][g] + BigM * (3 - y[pred_j][f][g][i] - y[j][f][g][i] - z[pred_j][j][g]) >= C[pred_j][f][g] + setup_time[pred_j][j];
}
// 後續工作之下一階段之起始時間
forall(pred_j, j in jobs: pred_j != j, f in factories, g in 1..num_stages-1, i in 1..stage_machines[g]){
S[j][f][g+1] + BigM * (4 - y[pred_j][f][g][i] - y[j][f][g][i] - z[pred_j][j][g] - z[pred_j][j][g+1]) >= C[pred_j][f][g+1];
}
}
CPLEX 问题
最新推荐文章于 2024-09-27 10:11:28 发布