FSP流水车间调度问题
FSP流水车间调度问题
1.流水车间调度问题Flow Shop
FSP的基本特点:
- 车间要进行多个批次(多个种类)产品的生产;
- 这些批次(种类)的产品工艺路径相同,不同的是在每台机器上的加工时间。
- 每种机器只有一台。
特别:置换流水车间调度问题PFSP中,作业在每台设备上的加工顺序都相同。
2.FSP典型问题-算例
算例:
3. 启发式算法求解
3.1类型
- Palmer算法:sum_{j=1}^{m} {(2j-m-1)*t_ij/2} m代表机器数数量。
3.2典型启发式算法实现
- Palmer算法Matlab实现:
- 初始化测试数据;
- 编写排序程序,得到排序结果;
- 根据排序结果,生成具体的生产调度方案。
- 获得最短完工时间。
function Palmer4FSP()
clc;clear
%初始化数据
data=initDataCar1();
%利用Palmer算法进行排序
seq=Palmer(data);
%根据排序结果,生成详细调度方案
sch=createSchedule(seq,data);
%获得最短完工时间
fit=fitness(sch);
end
%最大完工时间
function fit=fitness(schedule)
fit=max(schedule(:,5));
end
%根据排序,生成具体调度方案
function schedule=createSchedule(seq,data)
[jobQty,cols]=size(data);
machQty=cols/2;
schedule=zeros(jobQty*machQty,5);
jobCanSTime=zeros(jobQty,1);
machCanSTime=zeros(machQty,1);
schIdx=1;
for i=1:machQty
for j=1:jobQty
nowJobId=seq(j);
nowMachId=i;
myStartTime=max(jobCanSTime(nowJobId),machCanSTime(nowMachId));
myEndTime=myStartTime+data(nowJobId,2*nowMachId);
jobCanSTime(nowJobId)=myEndTime;
machCanSTime(nowMachId)=myEndTime;
schedule(schIdx,:)=[nowJobId,nowMachId,nowMachId,myStartTime,myEndTime];
schIdx=schIdx+1;
end
end
end
%Palmer算法
function sequence=Palmer(data)
[jobQty,cols]=size(data);
machQty=cols/2;
s=zeros(jobQty,1);
for i=1:jobQty
for j=1:machQty
s(i)=s(i)+(2*j-machQty-1)*data(i,2*j)/2;
end
end
%排序 降序
[~,sequence]=sortrows(s,-1);
end
%初始化算例数据
function data=initDataCar1()
data=[ 0 375 1 12 2 142 3 245 4 412;
0 632 1 452 2 758 3 278 4 398;
0 12 1 876 2 124 3 534 4 765;
0 460 1 542 2 523 3 120 4 499;
0 528 1 101 2 789 3 124 4 999;
0 796 1 245 2 632 3 375 4 123;
0 532 1 230 2 543 3 896 4 452;
0 14 1 124 2 214 3 543 4 785;
0 257 1 527 2 753 3 210 4 463;
0 896 1 896 2 214 3 258 4 259;
0 532 1 302 2 501 3 765 4 988];
for i=1:size(data,2)
if mod(i,2)==1
data(:,i)=data(:,i)+1;
end
end
end