FSP流水车间调度问题

FSP流水车间调度问题

1.流水车间调度问题Flow Shop

FSP的基本特点:

  1. 车间要进行多个批次(多个种类)产品的生产;
  2. 这些批次(种类)的产品工艺路径相同,不同的是在每台机器上的加工时间。
  3. 每种机器只有一台。

特别:置换流水车间调度问题PFSP中,作业在每台设备上的加工顺序都相同。

2.FSP典型问题-算例

算例:

https://people.brunel.ac.uk/~mastjjb/jeb/info.html

3. 启发式算法求解

3.1类型

  1. Palmer算法:sum_{j=1}^{m} {(2j-m-1)*t_ij/2} m代表机器数数量。

3.2典型启发式算法实现

  1. Palmer算法Matlab实现:
    1. 初始化测试数据;
    2. 编写排序程序,得到排序结果;
    3. 根据排序结果,生成具体的生产调度方案。
    4. 获得最短完工时间。
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      
posted @ 2024-05-22 14:57  林每天都要努力  阅读(115)  评论(0编辑  收藏  举报