问题描述
按照机器环境分为单机调度、平行机调度、Flow Shop调度和Job Shop调度。单机调度是指所有工件都在同一台机器上加工完成。平行机调度是指每个工件只需在多台加工功能相同的机器中的任意一台上加工一次,其中,根据平行机加工速度的不同,又可将平行机分为具有相同加工速度的同型(identical)机、具有不同的加工速度但此速度不依赖于工件的同速(uniform)机和随加工的工件不同加工速度也不同的非同类型(unrelated)机。Flow Shop调度是指所有工件以相同的工艺路径在多台机器上加工。Job Shop调度是指每个工件以各自特定的工艺路径进行加工。
已知产品批次数,机器个数,批次m在机器j内的加工时间。采用平行机调度使得最大完工时间最短,并求出每批产品在各个机器中加工的开始时间和各批次产品在各个机器中加工的顺序。
参数设置
产品批次数
机器个数
机器编号
产品批次编号
某批产品在对应机器中的加工顺序编号
批次
在机器
内的加工时间
机器
内第
批产品的开始时间
模型建立
最小化最大完工时间:
一个批次只能分配给一个机器,不能被拆分:
一个机器在同一个时间段只能加工一批产品:
最大完工时间大于各个机器的完工时间:
每个机器中第一批产品的开始时间都是0:
只有第k-1位的批次加工完成后才能开始加工第k批产品:
分配规则,产品批次必须按顺序进行分配:
案例数据
M=8;
J=5;
p=[[544.5,539.01,534.6,463.05,449.82,519.75,495.72,453.6],[574.2,615.33,563.76,546.84,480.69,613.8,529.74,496.8],[524.7,581.94,515.16,511.56,423.36,574.2,466.56,423.36],[544.5,524.7,534.6,480.69,414.54,539.55,456.84,427.68],[534.6,586.71,524.88,471.87,423.36,529.65,466.56,475.2]];
/*********************************************
* OPL 12.8.0.0 Model
* Author: Sealand
* Creation Date: 2022年11月12日 at 下午11:33:53
*********************************************/
int M = 8;
int J = 5;
float p[1..J][1..M] =[[544.5,539.01,534.6,463.05,449.82,519.75,495.72,453.6],[574.2,615.33,563.76,546.84,480.69,613.8,529.74,496.8],[524.7,581.94,515.16,511.56,423.36,574.2,466.56,423.36],[544.5,524.7,534.6,480.69,414.54,539.55,456.84,427.68],[534.6,586.71,524.88,471.87,423.36,529.65,466.56,475.2]];
dvar boolean z[1..M][1..J][1..M];
dvar float t[1..J][1..M];
dvar float makespan;
minimize makespan;
subject to {
forall(m in 1..M)
sum(j in 1..J,k in 1..M)
z[m][j][k] == 1;
forall(j in 1..J, k in 1..M)
sum(m in 1..M)
z[m][j][k] <= 1;
forall(j in 1..J, m in 1..M)
makespan >= t[j][M] + sum(m in 1..M) z[m][j][M] * p[j][m];
forall(j in 1..J)
t[j][1] == 0;
forall(j in 1..J, k in 2..M)
t[j][k] >= t[j][k-1] + sum(m in 1..M) z[m][j][k-1] * p[j][m];
forall(j in 1..J, k in 2..M)
sum(m in 1..M) z[m][j][k] <= sum(m in 1..M) z[m][j][k-1];
}
求解结果
makespan = 939.24;
[[0,519.75,519.75,519.75,519.75,519.75,519.75,519.75],[0,574.2,574.2,574.2,574.2,574.2,574.2,574.2],[0,423.36,938.52,938.52,938.52,938.52,938.52,938.52],[0,524.7,939.24,939.24,939.24,939.24,939.24,939.24],[0,466.56,938.43,938.43,938.43,938.43,938.43,938.43]];
[[[0,0,0,0,0,0,0,0],[1,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]],[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[1,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]],[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,1,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]],[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,1,0,0,0,0,0,0]],[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,1,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]],[[1,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]],[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[1,0,0,0,0,0,0,0]],[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[1,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]]];