精华内容
下载资源
问答
  • 针对分布式柔性作业车间调度问题的特点,提出一种改进人工蜂群算法.首先,建立以最小化最大完工时间为优化目标的分布式柔性作业车间调度优化模型;然后,改进基本人工蜂群算法以使其适用于求解分布式柔性作业车间调度...
  • 柔性作业车间调度遗传算法代码!!!!!!!!!!!!
  • 经典作业车间调度问题 在传统车间调度模型中,假设工序加工所需要的资源是不具备柔性的资源,工件的所有工序的加工机器是唯一的...柔性作业车间调度问题(flexiblejobshopschedu-lingpro

    经典作业车间调度问题

    在传统车间调度模型中,假设工序加工所需要的资源是不具备柔性的资源,工件的所有工序的加工机器是唯一的,且机器顺序是已知的,则可通过确定工序在每台机器上的加工顺序来优化完工时间等系统目标。随着大批量连续生产时代正逐渐被适应市场动态变化的多品种、小批量离散生产所替代,一个制造企业的生存能力和竞争能力在很大程度上取决于它是否能在较短的生产周期内,生产出较低成本、较高质量的多个产品品种的能力。
    在这里插入图片描述

    柔性作业车间调度问题

    柔性作业车间调度问题(flexiblejobshopschedu-lingproblem,FJSP)也就成为研究重点,它是JSP问题的扩展,工件的每道工序可以在多台机器上进行加工,且在每台机器上的加工时间不一定相同。实际生产中可以按照资源负荷情况,灵活地进行资源的选择,提高加工的灵活性。工件的每道工序可以在多台机器上加工的情况在实际生产中有明显的优点:
    (1)提高设备的利用率,机床一旦空闲就可以安排工件进行加工,减少设备闲置和等待的时间;
    (2)具有维持生产稳定的能力,当一台或多台机器发生故障时,工序可以绕过故障机器,在其他机器上进行加工,使生产得以继续,保证生产的稳定;
    (3)提高产品质量和缩短生产周期,与经典的JSP模型相比,同一工件的多道工序可以在同一台机床上连续进行加工,减少了中间装卸和搬运等而造成的时间消耗

    柔性作业车间调度问题是一个NP-hard问题,不可能找到精确求得FJSP最优解的多项式时间算法。研究人员为解决这个难题已付出了几十年的努力,但至今最先进的算法仍很难得到规模较小问题的最优解。近十几年以来,通过模拟自然界中生物或物理过程而发展起来的元启发式算法用于研究FJSP,如遗传算法(geneticalgorithms,GA)、蚁群优化算法(antcolonyoptimization,ACO)、禁忌搜索算法(tabusearch,TS)、粒子群优化算法(particleswarmoptimization,PSO)、模拟退火算法(simulatedannealing,SA)、DNA算法等

    在这里插入图片描述

    柔性作业车间调度问题特点

    1.计算复杂
    柔性作业车间调度问题是作业车间调度问题的扩展,它不仅需要确定工序加工的顺序,还要给每道工序分配机器,是比JSP更为复杂的NP-hard问题

    2.多目标
    实际生产中经常考虑多项性能指标要求,且各项要求可能彼此冲突。常用的调度性能指标包括:最大完工时间、交货期、机器总负荷、生产成本、延迟或拖期、库存等。
    3.不确定性
    实际制造中存在广泛的不确定性因素,如机器故障、操作人员的熟练程度、原材料的差异、刀具磨损等因素的影响,确定的加工信息很少能获得。
    4.动态性
    实际生产制造过程是一个动态的过程,加工工件通常是依次进入待加工状态的,各种工件不断进入制造系统接受加工,已加工完的工件又不断地离开制造系统。
    目前车间静态、不确定随机、动态调度范围的定义存在多种不同的分类模型,而这些模型直接影响解决问题的复杂性,因此要求模型简单,接近实际生产过程。一种简单、实用的动态和不确定调度分类模型如图1.3所示,图中可清晰区分静态调度、动态调度、多目标调度、不确定调度、多目标不确定调度的范围
    在这里插入图片描述

    展开全文
  • 柔性作业车间调度

    2021-03-06 13:27:31
    柔性作业车间调度 1 问题描述 1.1 传统作业车间调度 传统作业车间带调度实例 工件 工序 可选择的加工机器 M1 M2 M3 M4 M5 J1 O11 -- -- 5 -- -- O12 11 -- ...

    柔性作业车间调度


    1 问题描述

    1.1 传统作业车间调度

    传统作业车间带调度实例
    工件 工序 可选择的加工机器
    M1 M2 M3 M4 M5
    J1 O11 -- -- 5 -- --
    O12 11 -- -- -- --
    O13 -- -- -- -- 8
    J2 O21 -- 6 -- -- --
    O22 9 -- -- -- --
    O23 -- -- -- 7 --

    有若干工件,每个工件有若干工序,有多个加工机器,但是每道工序只能在一台机器上加工。对应到上面表格中的实例就是,两个工件,工件J1有三道工序,工序Q11只能在M3上加工,加工时间是5小时。

    约束是对于一个工件来说,工序的相对顺序不能变。O11->O12->O13。每时刻,每个工件只能在一台机器上加工;每个机器上只能有一个工件。

    调度的任务则是安排出工序的加工顺序,加工顺序确定了,因为每道工序只有一台机器可用,加工的机器也就确定了。

    调度的目的是总的完工时间最短(也可以是其他目标)。举个例子,比如确定了O21->O22->O11->O23->O12->O13的加工顺序之后,我们就可以根据加工机器的约束,计算出总的加工时间。
    M2加工O21消耗6小时,工件J2当前加工时间6小时。
    M1加工O22消耗9小时,工件J2当前加工时间6+9=15小时。
    M3加工O11消耗5小时,工件J1当前加工时间5小时。
    M4加工O23消耗7小时,工件J2加工时间15+7=22小时。
    M1加工O12消耗11小时,但是要等M1加工完O22之后才开始加工O12,所以工件J1的当前加工时间为max(5,9)+11=20小时。
    M5加工O13消耗8小时,工件J2加工时间20+8=28小时。
    总的完工时间就是max(22,28)=28小时。

    1.2 柔性作业车间调度

    柔性作业车间带调度实例(参考自高亮老师论文
    《改进遗传算法求解柔性作业车间调度问题》——机械工程学报)
    工件 工序 可选择的加工机器
    M1 M2 M3 M4 M5
    J1 O11 2 6 5 3 4
    O12 -- 8 -- 4 --
    O13 4 -- 3 6 2
    J2 O21 3 -- 6 -- 5
    O22 4 6 5 -- --
    O23 -- 7 11 5 8

    相比于传统作业车间调度,柔性作业车间调度放宽了对加工机器的约束,更符合现实生产情况,每个工序可选加工机器变成了多个,可以由多个加工机器中的一个加工。比如上表中的实例,J1的O12工序可以选择M2和M4加工,加工时间分别是8小时和4小时,但是并不一定选择M4加工,最后得出来的总的完工时间就更短,所以,需要调度算法求解优化。

    相比于传统作业车间,柔性车间作业调度的调度任务不仅要确定工序的加工顺序,而且需要确定每道工序的机器分配。比如,确定了O21->O22->O11->O23->O12->O13的加工顺序,我们并不能相应工序的加工机器,所以还应该确定对应的[M1、M3、M5]->[M1、M2、M3]->[M1、M2、M3、M4、M5]->[M2、M3、M4、M5]->[M2、M4]->[M1、M3、M4、M5]的机器组合。调度的目的还是总的完工时间最短(也可以是其他目标,比如机器最大负荷最短、总的机器负荷最短)


    2 数据处理

    2.1 数据集

    引自博文“【标准算例数据源】作业车间、流水车间、柔性作业车间、其它”:https://blog.csdn.net/weixin_40775077/article/details/108762117

    2.2 数据解释

    一个Mk数据的例子
    上面的图片是Mk数据的一个例子,第一行6 6 1表示6个工件6个机器,平均每道工序有1个可选加工机器。第2-7行为工件1-6的信息。以第2行为例,6表示工件J1有6道工序;后面的1 3 1表示工序O11有1台机器可选,可选机器为M3,加工时间为1小时;后面的1 1 3表示工序O12有1台机器可选,可选机器为M1,加工时间为3小时。依此类推。

    2.3 处理为适合自己的格式

    上面的数据格式其实是不方便计算的(可行解不容易设计,调度目标如完工时长不容易计算)。所以需要读取为适合自己的格式。

    下面是我的处理方式:

    变量 类型 解释
    num_job 1*1大小的整数 工件个数
    num_machine 1*1大小的整数 机器个数
    num_op 1*num_job大小的数组 num_op[i]表示工件i的工序个数
    operation_time 1*num_job大小的cell,其中每个cell存储的是num_op[i]*num_machine大小的数组 operation_time[i]存储的是工件i所有工序的可选加工机器以及加工时间,0表示不可加工

    对应到上面图中的例子:
    num_job = 6;
    num_machine = 6;
    num_op = [6 6 6 6 6 6];
    operation_time{1} = [
    0 0 1 0 0 0;
    3 0 0 0 0 0;
    0 6 0 0 0 0;
    0 0 0 7 0 0;
    0 0 0 0 0 3;
    0 0 0 0 6 0;
    ];
    operation_time{2-6}不再列出。operation_time{1}[i][j]表示工件1的第i道工序在第j台机器上的加工时间,0表示不可加工。


    3 优化算法求解

    3.1 编码方案

    参考高亮老师论文改进遗传算法求解柔性作业车间调度问题——机械工程学报的编码方案。可行解分成两部分,第一部分为机器分配编码,第二部分为工序加工顺序编码。编码长度为2*工序总数。

    机器分配编码按照工序的顺序来,第一个表示工序O11的机器分配,第二个数表示工序O12的机器分配,依此类推,如1.2节表格的一个可行解的机器分配可以从“[M1、M3、M5]->[M1、M2、M3]->[M1、M2、M3、M4、M5]->[M2、M3、M4、M5]->[M2、M4]->[M1、M3、M4、M5]”随机选为M3->M1->M2->M4->M2->M5,机器编码可以表示为3 1 2 4 2 5。这样编码的优势就是可以很容易设计出交叉变异操作方案,使得执行交叉变异操作之后得到的新解的机器编码是可行的。

    工序加工顺序编码使用工件表示,工件i第j次出现表示工序Oij。比如1.2节表格的一个可行解的工序加工顺序可以为O21->O22->O11->O23->O12->O13,工序编码可以表示2 2 1 2 1 1。这样编码的优势是把工件对加工顺序的约束隐含到了编码里面。

    3.2 适应度计算(目标函数)

    对于一个可行解,要计算总的完工时间,需要计算每个工件的当前加工时间,每个机器的当前加工时间。然后根据可行解,解码出工件加工顺序和机器安排,根据2.3小节获得的数据格式计算完工时间。

    主要的思路如下(细节不再给出):

    1. 初始化,每个工件的当前加工时间 = 0;每个机器的当前加工时间 = 0;
    2. 工件的当前工序完工时间 = max(工件上一道工序完工时间,当前工序对应加工机器的上一个任务完工时间)+对应机器对当前工序的加工时间;
    3. 机器的当前加工时间 = 工件的当前工序完工时间;

    3.3 可行解更新策略

    参考高亮老师论文改进遗传算法求解柔性作业车间调度问题——机械工程学报的更新策略。主要实现了GA(遗传算法)的选择、交叉和变异。

    3.3.1 选择

    采用锦标赛选择,K元锦标赛:从大小为N的种群中随机选取K个个体,将适应度最好的个体加入下一代。重复执行N次,获得N个个体。

    3.3.2 交叉

    当满足交叉概率时,执行交叉,重复N次判断。随机选择两个个体,具体交叉策略如下:

    对于机器编码,采用两点交叉,随机生成两个交叉点,交换两个个体位于交叉点内的基因。

    对于1.2节表格的两个可行解的机器编码,比如p1 = [3 1 2 5 4 1];p2 = [1 3 2 4 2 5];选取交叉点为2-4的话,交换p1和p2位于2-4之内的基因,得到两个子代s1 = [3 3 2 4 4 1];s2 = [1 1 2 5 2 5]。

    对于工序编码,采用基于工件的POX交叉,将工件分成两个互补的集合J1和J2,P1中在J1中的工件保留,在J2中的工件使用P2中在J2中的工件按顺序对应填充。

    1.2节的表格不适合解释这个交叉方案,我们提出一个新的问题:有4个工件待加工,工序数目为[2 2 2 1]。对应的两个可行解的工序编码,比如p1 = [3 1 2 4 2 1 3];p2 = [2 3 1 2 4 3 1]。J1={1,4},J2={2,3}。首先s1继承p1的J1编码,s2继承p2的J2编码,s1 = [- 1 - 4 - 1 -];s2 = [2 3 - 2 - 3 -]。用p2的J2编码填充s1的空位,同样方法填充s2。最终得到交叉后的两个子代s1 = [2 1 3 4 2 1 3];s2 = [2 3 1 2 4 3 1]。

    3.3.3 变异

    当满足变异概率时,执行变异,重复N次判断。当执行变异时,对于机器编码:随机选择一个变异位置,然后从该位置对应工序的可选加工机器集合中选择一台其他机器。对于工序编码:随机选择两个位置,交换对应的工序。举个例子:

    机器编码:p1 = [3 1 2 5 4 1];变异位置为2,位置3对应工序的可选加工机器为[1 2 3],变异后的解可能为s1 = [3 2 2 5 4 1]。

    工序编码:p1 = [3 1 2 4 2 1 3];变异位置为2和4,变异后的解为s1 = [3 4 2 1 2 1 3]。


    4 代码

    4.1 数据处理

    % 将fjs文件数据格式化
    function [ ] = dataReady(sfilepath,tfilepath)
    %DATAREAD 此处显示有关此函数的摘要
    % 此函数用于将fjs文件转换为格式化的mat文件,保存num_job、num_machine、num_op、operation_time
    % 加工时间为 -1 表示该工序不可在此机器上加工
    %   此处显示详细说明
    % sfilepath 表示源数据路径;tfilepath 表示处理后.mat存放路径
    
    
    % filepath = 'TextData\Monaldo\Fjsp\Job_Data\Brandimarte_Data\Text\Mk02.fjs';
    % 读取数据
    fidin=fopen(sfilepath);
    x = fscanf(fidin,'%f');
    
    % 获取工件数目、机器数目、每个工件的工序数目、每个工序在各台机器上的加工时间
    num_job = x(1); % 工件数目
    num_machine = x(2); % 机器数目
    num_op = zeros(1,num_job);  % 每个工件的工序数目
    operation_time = cell(1,num_job);   % 每个工序在各台机器上的加工时间
    
    k = 4;  % 下次开始读数据的下标,有时需改为3
    
    for i = 1:num_job
        num_op(1,i) = x(k); % 工件 i 的工序数目
        k = k + 1;
        jobi_operation_time = ones(num_op(1,i),num_machine)*-1; % 工件 i 的工序加工时间
        for j = 1:num_op(1,i)
            num_machine_opij = x(k); % 工件 i 的工序 j 可加工机器数目
            k = k + 1;
            for l = 1:num_machine_opij
                id_macnine_opij = x(k); % 机器编号
                k = k + 1;
                time_opij = x(k);   % 加工时间
                k = k + 1;
                jobi_operation_time(j,id_macnine_opij) = time_opij; % 工件 i 的工序 j 在机器 id_macnine_opij 上的加工时间
            end
        end
        operation_time{i} = num2cell(jobi_operation_time);
    end
    
    % 保存文件到tfilepath
    save(tfilepath,'num_job','num_machine','num_op','operation_time');
    end
    

    4.2 适应度计算

    % 计算适应度,此时为最大完工时间
    function [ cmax] = fitnessFun( x )
    %FITNESSOBJ 此处显示有关此函数的摘要
    % 假设x是可行解,x是一个2行to列的矩阵,to表示工序总数。x第一行表示工序加工顺序,x第二行表示机器分配情况
    % 第二行按O11,O12,O21,O22,O23这样的顺序分配机器,而非与第一行对应,即第一个机器对应第一个工序,而不是第一个要加工的工序
    %   此处显示详细说明
    
    % global num_job num_machine num_op operation_time
    global num_job num_machine num_op operation_time
    
    max_num_op = max(num_op);   % 工序最大数目 
    op_to_machine = zeros(num_job, max_num_op); % 工序映射到机器
    to = 0; % 工序总数
    for i = 1:num_job
        for j = 1:num_op(1,i)
            to = to + 1;
            op_to_machine(i,j) = to;
        end
    end
    cur_job_op = zeros(1,num_job);  % 当前各工件加工到第几个工序
    t_machine = zeros(1,num_machine);   % 各机器加工完一个工序的完工时间
    t_op = zeros(num_job,max_num_op);   % 各工序完工时间
    
    for i = 1:to
       id_job = x(1,i);   % x的第一行对应工件编号
       cur_job_op(1,id_job) = cur_job_op(1,id_job)+1;   % id_job个工件的当前加工工序加1
       id_op = cur_job_op(1,id_job);
       % 找到该工序对应的加工机器
       index_machine = op_to_machine(id_job,id_op);
       id_machine = x(2,index_machine);  % x的第二行对应机器分配情况
       % 更新完工时间,一个是机器,一个是工序
       if id_op == 1
           ftime = t_machine(1,id_machine)+cell2mat(operation_time{id_job}(id_op,id_machine));
           t_machine(1,id_machine) = ftime;
           t_op(id_job,id_op) = ftime;
       else
           ftime = max(t_op(id_job,id_op-1),t_machine(1,id_machine))+cell2mat(operation_time{id_job}(id_op,id_machine));
           t_machine(1,id_machine) = ftime;
           t_op(id_job,id_op) = ftime;
       end
    end
    cmax = 0;   % 最大完工时间
    for i=1:num_job
        cmax_jobi = t_op(i,num_op(1,i));    % 工件i的最大完工时间
        if cmax_jobi > cmax
            cmax = cmax_jobi;
        end
    end
    end
    

    4.3 GA相关的代码

    function [bestp,bestf,Convergence_curve] = GA(N,MaxFEs,lb,ub,dim,tran_fhd)
    % tran_fhd表示转换函数,将实数空间的解转换为可行解。x1也是与解的转换相关的参数,这里没有给出代码,
    % 初始化的时候可以修改为直接初始化为可行解,不经过转换,删掉tran_fhd相关的部分。
    %% 初始化
    global num_job num_machine num_op operation_time x1
    
    % 参数设置
    N = 200;
    pc = 0.8;
    pm = 0.01;
    k = 10; % k元锦标赛
    to = sum(num_op); % 工序总数
    MaxFEs = 20000;
    fitness = ones(1,N)*inf;
    bestf = inf;
    bestp = zeros(2,dim);
    Convergence_curve = [];
    it = 1;
    fes = 0;
    % 种群初始化
    X=initializationM(N,2,dim,ub,lb);
    for i=1:N
       X(:,:,i) =  tran_fhd(X(:,:,i));
    end
    
    %% 主循环 DE Main Loop
    while fes<MaxFEs
        % 计算适应度
        for i=1:N
            fitness(i) = fitnessFun(X(:,:,i));
            fes = fes+1;
            if fitness(i)<bestf
                bestf = fitness(i);
                bestp = X(:,:,i);
            end
        end
        
        % 选择 得到一群个体
        X = Selection(X,N,k,fitness);
        % 交叉 得到一群个体
        X = Crossover(X,N,pc,to,num_job);
        % 变异 得到一群个体
        X = Mutation(X,N,pm,to,num_job,num_op,operation_time);
        
        Convergence_curve(it)=bestf;
        it=it+1;
    end
    end
    
    function newX = Selection(X,N,k,fitness)
    newX = X;
    for i=1:N
        % 从N个中随机选k个,取最大,加进newX
        s = randperm(N,k);
        sx = X(:,:,s);
        sf = fitness(s);
        [~,sindex] = min(sf);
        newX(:,:,i) = sx(:,:,sindex);
    end
    end
    
    function newX = Crossover(X,N,pc,to,num_job)
    newX = X;
    for i=1:N
        if rand<=pc
            % 选两个个体
            s = randperm(N,2);
            r1 = s(1);
            r2 = s(2);
            % 交叉
            % 机器分配,两点交叉
            cpoint = randperm(to,2);
            cp1 = min(cpoint);
            cp2 = max(cpoint);
            newX(2,cp1:cp2,r1) = X(2,cp1:cp2,r2);
            newX(2,cp1:cp2,r2) = X(2,cp1:cp2,r1);
            % 工序顺序,pox交叉,工件分成两个集合,继承父代,继承母代
            % 工件分集合
            hfd = floor(num_job/2);% 划分点
            js=randperm(num_job);
            js1 = js(1:hfd);
            js2 = js(hfd+1:end);
            % 继承
            c1 = zeros(1,to);
            c2 = zeros(1,to);
            for j = 1:to
                if(ismember(X(1,j,r1),js1)==1)
                    c1(j) = X(1,j,r1);
                end
                if(ismember(X(1,j,r2),js2)==1)
                    c2(j) = X(1,j,r2);
                end
            end
            % 填充
            tc1 = c1;
            tc2 = c2;
            c1(find(tc1==0)) = tc2(find(tc2~=0));
            c2(find(tc2==0)) = tc1(find(tc1~=0));
            % 个体修改
            newX(1,:,r1) = c1;
            newX(1,:,r2) = c2;
        end
    end
    end
    
    function newX = Mutation(X,N,pm,to,num_job,num_op,operation_time)
    newX = X;
    for i=1:N
        if rand<=pm
            % 机器分配部分,选一个位置,从该位置可选机器选另一个机器
            r1 = randperm(to,1);
            top = 0;
            op_id = 0;
            for j = 1:num_job
                op_id = r1-top;
                top = top+num_op(j);
                if top>=r1
                    job_id = j;
                    break
                end
            end
            machine = cell2mat(operation_time{job_id});
            machine = find(machine(op_id,:)~=-1);
            ma_id = X(2,r1,i);
            if size(machine,2)>1
                machine(machine==ma_id) = [];
                r2 = randperm(size(machine,2),1);
                ma_id = machine(r2);
            end
            newX(2,r1,i) = ma_id;
            % 第二部分,随机选两个位置,互换
            s = randperm(to,2);
            r1 = s(1);
            r2 = s(2);
            newX(1,r1,i) = X(1,r2,i);
            newX(1,r2,i) = X(1,r1,i);
        end
    end
    end
    
    展开全文
  • 自己写的用遗传算法求解柔性作业车间调度问题,可直接运行,文件内含有10个FJSP基础算例,在help.cpp文件中修改算例文件名称即可运行其他算例。
  • 改进遗传算法解决柔性作业车间调度问题,田旻,刘人境,柔性作业车间调度问题是经典作业车间调度问题的深入和扩展,为生产过程中作业车间调度的资源受限问题提供了更加切实可行的方案。
  • 柔性作业车间调度问题中,以完工时间作为优化目标,编写的遗传算法代码,python语言。代码中套用了一个自己随机生成的实例进行运行验证,仅供参考学习。
  • 离散Jaya算法解决柔性作业车间调度问题
  • 分析生产车间的实际生产状况,建立了考虑工件移动时间的柔性作业车间调度问题模型。该模型考虑了以往柔性作业车间调度问题模型所没有考虑的工件在加工机器间的移动时间,使柔性作业车间调度问题更贴近实际生产,让...
  • 用灰狼优化算法求解柔性作业车间问题,其中问题的规模为8*8,代码类型为Matlab,编码方式为三维实数编码。
  • 针对不确定多目标柔性作业车间调度问题,将工序加工时间采用区间数表示,以区间最大完工时间和区间机器总负荷为优化目标,构建多目标区间柔性作业车间调度模型,并设计一种多目标进化优化算法对该模型进行求解....
  • 基于BOM的柔性作业车间调度方法研究,李盛,宋豫川,针对实际生产中工件间存在BOM关系的柔性作业车间调度问题,本文基于分而治之的思想提出一种求解该问题的分层-整体调度算法。建立�
  • 人工蜂群算法解决柔性作业车间调度问题,用Java写的。参考论文:陈少, 吉卫喜, 仇永涛, et al. 改进人工蜂群算法求解柔性作业车间调度问题[J]. 组合机床与自动化加工技术, 2018, No.531(05):166-169.
  • 针对“研产混线”中各类制造资源利用率低、非加工时间过长、调度难度大的问题,以生产中最紧缺的夹具资源为例,提出考虑装卸的柔性作业车间双资源调度问题.首先,以最小化完工时间和准结时间为目标建立该问题的数学优化...
  • 面向绿色制造的多目标柔性作业车间调度方法研究,吕文军,雷琦,针对现有绿色制造在柔性作业车间调度研究存在的不足,本文提出了一种面向绿色制造的柔性作业车间调度方法。该方法首先构建面向绿
  • 基于新型蛙跳算法的低碳柔性作业车间调度
  • 用c++写的遗传算法解决柔性作业车间调度问题,主要参考论文 张国辉, 高亮, 李培根, et al. 改进遗传算法求解柔性作业车间调度问题[J]. 机械工程学报, 2009, 45(7):145-151.
  • 随着全球化市场的普及和各行各业竞争的加剧,制造行业也在积极寻求创新与突破,为了解决制造行业普遍存在的订单处理过程繁琐,信息传递缓慢,质量监管不到位等问题,企业纷纷开始实行柔性作业车间调度进行管理。...
  • 以最小化任务完成时间为目标,建立了柔性作业车间人员配置及作业排序模型,并设计了蚁群—遗传混合优化算法进行求解。首先,根据求解问题特征,设计了蚁群—遗传协调优化的算法结构。其中,蚁群算法求解资源配置,...
  • 针对柔性作业车间多周期生产的设备和人力资源的协同分配问题,从成本的视角对其进行研究.综合考虑设备加工成本、人力成本、工件运输成本、库存成本、拖期成本以及外协成本等成本目标,构建考虑多成本约束的柔性作业...
  • 柔性作业车间调度问题研究-思考

    千次阅读 2019-11-21 09:40:55
    文章目录作业车间调度vs柔性作业车间调度深挖柔性作业车间调度算法层面:问题层面:融合层面:应用层面:结语 最近一段时间写了一些算法原理相关的文章,也得到了不少粉丝的关注,在这里先谢谢大家了。说到算法,...

    在这里插入图片描述

    获取更多资讯,赶快关注上面的公众号吧!

    最近一段时间写了一些算法原理相关的文章,也得到了不少粉丝的关注,在这里先谢谢大家了。说到算法,归根结底是要解决问题的,不解决问题的算法,就是皮不在无处依附的毛,就是没有嘴唇被冻坏的牙齿。正好今天也和一位来自南京航空航天大学的“爱学习的好孩子”探讨了一下专业问题,所以也是时候临幸一下这个古老的问题——车间调度问题。

    作业车间调度vs柔性作业车间调度

    调度问题是在实际工作中广泛应用的运筹学问题,可以定义为“在一定的约束条件下,把有限的资源在时间上分配给若干个任务,以满足或优化一个或多个性能指标”。调度的具体过程简述如下:在约束条件下以具体目标为导向,将特定任务分配给指定资源,并且针对同一资源上的任务进行排序,最终确定每个资源上各项任务的开始时间和结束时间。这类问题在生产作业计划、供应链管理、交通运输、航空航天、体育娱乐、医疗卫生和网络通讯等领域都有大量的应用,调度研究的重要性自然不言而喻。

    生产调度问题的研究起源于上世纪50年代,由于该问题具有重要的实用价值,吸引了大量国内外研究人员的关注,而车间调度问题又是生产调度问题中较早出现并被广泛研究的一类问题。

    作业车间问题(JSP)可以描述为:车间内有多个工件,每个工件有自己单独的工艺路线,工艺路线中包含多道工序,每道工序只能在一台机床上加工,机床在同一时刻只能加工一个工件,调度的目的是确定每道工序的开始加工时间和结束加工时间,以最优化一个或多个目标性能。

    而柔性作业车间调度问题(FJSP)是车间调度问题的更一般情况,每道工序可以有多台机床选择,从而降低工序对资源的竞争,随着车间具有相同功能机床的增加,此类问题的调度问题也越来越突出。

    但是大部分调度问题都是NP难问题,对于稍大规模的调度问题,想要在较短时间内得到最优解是非常困难的。

    深挖柔性作业车间调度

    随着研究人员对柔性作业车间调度问题的广泛研究,加之各种优化算法层出不穷,貌似能想到的点都已经出现在已发表的论文里了,想再在这个领域搞出点什么名堂好像有些难,但是别忘了,剧情往往都是在这开始有反转的,被沙子塞满的杯子还是可以倒点水进去的,个人觉得可以从以下四个层面入手。

    算法层面:

    第一个方面可以从算法,这是实现创新最直接的方法,这里我从三个角度分析。

    1. 提出一种全新的优化算法,该算法能比随机搜索的平均性能要好,并能给出数学上的收敛性证明,这样的算法已经有很多了,我在第十六章 群体智能优化算法总结中已经总结了群体智能优化,以及后面还要介绍的进化算法。这个角度虽然非常困难,但是一旦有成果就是比较大的成果。

    2. 对现有算法进行改进,使得算法在解决某一特定或某一类问题时变得比标准算法要好,比如张超勇提出了一种专门针对柔性作业车间调度问题的新的编码方式,张国辉改进了遗传算法传统的随机初始化方法,使得算法从较优的一代种群开始搜索。这个角度主要是考虑如何改进算法使其更能和具体的问题相结合;

    3. 混合不同的算法,以集众家之所长,发挥各自的优势,同时平衡算法的探索和利用能力,如遗传算法具有很强的全局搜索能力,可以结合模拟退火、变邻域、禁忌搜索等局部搜索算法,以跳出局部最优。这个角度是最容易想到和实现的,因此这样的论文也就被写烂了。

    问题层面:

    对于问题层面,主要就是指如何使问题更加符合实际,也就是要考虑更多的约束,否则太过简化的问题,算法得到的调度结果在实际车间中的可行度会非常低。根据我们实验室在航空航天制造车间多年摸索的经验,个人觉得实际要考虑的问题还是比较多的。

    1. 目标维度。车间生产除了要尽快地生产完工件(制造期最短),往往还要求机床利用率要高(利用率),同时又不能相差太大(负载均衡),所以目标之间往往是相互制约的,因此多目标的研究还是要比单目标研究的实际意义大一些的。对于多目标,一个研究的点就是如何去权衡这些冲突目标,目前较为流行的就是pareto支配解集,如果可能看看能不能给出不同的策略,另一个点就是随着绿色制造概念的兴起,制造车间也越来越重视环保相关的指标,因此可以对能耗、排放等也有了衡量,目前这方面的考虑,据我看最新的论文,明显有增多的势头。

    2. 时间维度。静态调度问题是指在调度时假设所有的工件均已就绪,而实际车间中,订单并不是一次性下的,因而投料也就会分不同批次,导致调度更像是对一个连续的过程进行优化,这方面可以考虑工件随机抵达。工厂接收订单后,客户也会修改交货期,交货期的变更也会对现有的生产计划造成很大的影响,这方面可以考虑交货期变更。对于新品生产,工艺往往处于试生产阶段,具有很大的不稳定性,工序加工时间往往取决于操作工人,导致实际加工工时与工时定额出入很大,因此工时不确定的调度也有现实意义。在加工车间中还存在这样的情况,由于两种工件的工艺要求不同,先加工A再加工B,和先加工B再加工A所需要的准备时间差别很大(注:在实际车间中,准备时间有可能37天,而加工时间只需12天,所以准备时间可不能像学术论文中那样忽略不计),所以就有了准备顺序依赖的问题。

    3. 机床维度。从机床角度考虑,最常见的应该就是机床故障,机床故障影响需要在其上加工的工件的开工时间,从而扰乱调度计划,最近开始研究的比较多的是将机床故障建模成一个过程,即不是瞬间故障,而是逐渐老化,在此过程中,机床的加工时间会发生变化,在学术上将这种现象称为恶化效应。现在有部分车间采购的高端机床具有两个或多个工作台,其中一个工作台在加工时,可以在其他闲置的工作台上装夹工件,从而节省准备时间,这就是多工作台调度。

    4. 工艺维度。柔性作业车间调度中每道工序可以有多台机床选择,这里的柔性体现在机床,因为机床功能类似,所有可以加工不同的工序,但其实有时工艺也可以是柔性的,不管按照哪条工艺路线加工,都可以加工出工件,这就是多工艺路线的调度问题。当选定了某一工艺路线并已经按照此路线进行加工,但加工过程中因为某些原因不得不更改工艺路线,这时就要考虑工艺变更对调度造成的影响。还有一种比较特殊的工艺就是装配工艺,其工艺路线是由多条分支并行加串行路径组合而成的,由此得到的调度问题就是装配调度问题,装配调度问题需要额外考虑不同装配件之间的约束关系,目前这方面的文章虽然有但是较少,并且一般都是针对实例进行求解。

    5. 工人维度。工人可能是车间中最不确定的了吧,人的心情也会阴晴圆缺,干活效率也会每天不尽相同(注:这里可能有人会想,都是自动化的数控机床,效率为啥还会受工人影响,这个问题其实比较复杂,以后有时间会针对这个问题单独写一篇文章,这里先透露一下,这个问题制约了我国航空制造业的效率),所以时间维度中的工时不确定很大一部分就是在于此。还有一方面,工人对加工过无数次的工件相当熟悉,所用时间也就相对较少,对于新品加工时间就较慢,所以对工人来说是有一个学习和适应的过程的,学术上将这个现象称为“学习效应”,这也是导致加工时间变化的原因。

    6. 物流维度。现在很多人都在提“无人车间“、“黑灯车间“、“智能车间“等,实现这个的前提是得有自动化的物流,传统的有传送带,现在更加智能的有EMS、AGV、RGV等,通过这些装备可以使调度更加准确,同时也增加了调度的复杂性,因为运输时间不能再忽略不计。之前我们实验室做过一个西安航空制造厂的项目,对一个400台机床的车间进行建模仿真,由于问题比较复杂,基本没用上什么优化的方法,目前也没看到有什么比较好的相关论文,所以这一块还是比较有价值的。

    7. 辅助资源维度。辅助资源包括刀具、夹具、量具等,这些资源也会影响调度,因为开始加工前这些辅助资源不准备好就会影响开工时间,同时对于数量比较少的辅助资源,还会存在竞争现象,因此调度过程中不仅要考虑机床还要考虑辅助资源,这就是著名的多资源调度。

    其实约束还有很多,在这里主要说了目前正处于研究火热阶段且问题比较实际的几点,以后有时间会再慢慢补充。

    融合层面:

    将已有的算法初次用到古老的问题其实也是一种创新,这也是这个层面要表达的核心思想。这就需要时刻关注本专业以外的其他领域,学习他们的方法和思想,并转化为可以应用到本领域,解决本领域问题的形式,如深度学习现在异常火热,可以考虑如何用深度神经网络求解调度问题,以及我目前正在研究的深度强化学习,如何表达调度特征,如何定义奖励等等。随之而来的困难就是要花费一定的时间是了解和学习其他专业的知识,这就是学科交叉所带来的机遇和挑战。

    应用层面:

    在应用层面,我的想法就是将调度和其他一些先进概念相结合,比如现在非常火的大数据、物联网、数字孪生。调度只有在精准的基础数据基础上才能保证鲁棒和可行,物联网实际上为准备调度数据提供了技术支持,如果车间内各种要素都可以被实时监控,那么再通过大数据相关技术手段,将这些杂乱冗余的数据变成有用有效的信息和知识,这实际上也是智能制造非常重要的一点。提到知识,一部分来源人的经验,如何将人根据多年工作经验做出的决策建模成一种数学表达,就可以初步解决工厂落地的问题,另一部分知识就是来源车间,这可以通过概率统计归纳总结出一定的规律。

    结语

    其实在机械制造领域,如果能解决一个实际问题其实就是很大的创新了,以上只是一些自己的看法,不能代表一定正确,希望能抛砖引玉,畅所欲言,同时也希望大家能够更多的提出问题,欢迎随时在公众号留言,一同探讨,一同学习,一同进步。

    展开全文
  • 具有总能耗约束的柔性作业车间调度问题研究
  • 柔性作业车间生产计划与调度集成优化求解策略
  • 针对柔性作业车间生产环境中机器故障的动态调度问题, 以最小最大完工时间和最小偏差为目标, 结合车间调度人员的经验建立多阶段人机协同动态调度策略. 在不同阶段该策略的调度人员可参与优化过程, 提高方案的可行性和...
  • OR-LIBRARY 作业车间调度标准算例:jobshop1.txt 流水车间调度标准算例:flowshop1.txt 柔性作业车间调度标准算例:fsp.html 其他:Optimization Test Functions and Datasets
    展开全文
  • 针对低碳柔性作业车间调度问题,提出一种基于新型优化机理的教学优化(TLBO)算法,以同时最小化总碳排放和平均延迟时间.利用3个串对问题的3个子问题单独编码,其主要步骤为教师的自学阶段和教学阶段,并运用多邻域搜索和...
  • 云计算环境下的模糊柔性作业车间调度方法.pdf
  • 将灰狼优化算法(GWO)用于柔性作业车间调度问题(FJSP),以优化最大完工时间为目标,提出一种混合灰狼优化算法(HGWO).首先,采用两段式编码方式,建立GWO连续空间与FJSP离散空间的映射关系;其次,设计种群初始化方法,保证...
  • 加工时间不确定的柔性作业车间调度问题已逐渐成为生产调度研究的热点。采用区间表示加工时间范围,利用时间Petri网建立区间柔性作业车间调度问题形式化模型,并运用网模型的状态类图进行可达性分析,计算出所有可行...
  • 通过对柔性作业车间调度问题(FJSP)进行分析,借鉴生物免疫机理提出一种求解柔性作业车间调度问题的免疫遗传算法(IGA)。该算法在保留基本遗传算法(SGA)随机全局搜索能力的基础上,通过抽取疫苗和接种疫苗等免疫...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 821
精华内容 328
关键字:

柔性作业车间