优化问题|文化基因算法求解分布式柔性作业车间调度问题

问题描述

在智能制造日益发展的背景下,企业生产模式逐步从单一工厂制造转变为多工厂协同的分布式制造。该模式能够有效地减少规模效应,实现资源的合理配置,进而降低成本和提高生产效率。在此背景下的分布式柔性作业车间调度问题(Distributed flexible job shop scheduling problem,DFJSP)被众多学者广泛关注和研究,DFJSP 是传统柔性作业车间与分布式车间调度问题的一个结合。

分布式柔性作业车间调度(Distributed FJSP,DFJSP)主要包含工序序列机器的选择工厂的选择三个子问题。首先将𝑛个工件分配到不同的工厂当中,然后在每个工厂为工件选择可加工的机器以及确定工件的加工顺序。该问题的主要目标是通过调整工件在哪个工厂加工、工件序列的排序以及工件选择哪台机器加工,从而实现最小化最大完工时间的目标。

分布式柔性作业车间系统示意图

模型构建

DFJSP 可描述如下:给定的 n n n个加工工件,在 N f N_f Nf个工厂中加工,每个工厂有 m f m_f mf台机床。每个工件 i i i可选择在任一工厂加工。并且,每个工件 i i i包含
n i n_i ni道工序,工序 O i , j O_{i,j} Oi,j可选在工厂 f f f中的 m i , j , f m_{i,j,f} mi,j,f个加工机床上加工。

DFJSP 的假设条件如下:

(1)所有工件、机器以及工厂在零时刻都可用;

(2)每个机器在同一时刻只能处理一个工序;

(3)工件在加工处理过程中不能被中断;

(4)工件的所有工序都按照预先设定好的顺序,不允许提前或者推后;

(5)一个工件只能在一个工厂中处理,同时一个工序只能在一台机器处理;

(6)不考虑机器故障和准备时间;

参数变量:

数学模型:

算法思路

文化基因算法(Memetic ALgorithm),由Mpscato在1989年提出的。文化基因算法是一种基于种群的全局搜索和基于个体的局部启发式搜索的结合体,可以简单理解为:Memetic = GA + Local Search。其中,局部搜索算子可以根据不同的策略进行设计,比如常用的爬山机制、模拟退火、贪婪机制、禁忌搜索等。

基因编码

针对 DFJSP,目前主要有4种离散编码方法。

1)基于工件序列的编码(SJS),编码中只包含工件序列,工序排序、机器选择以及工厂选择 3 个子问题都在解码过程中分别通过相应的规则确定;

2)基于工序序列的编码(SOP),SOP 中只包含工序序列,用来确定工序的先后顺序,工厂选择以及机器选择在解码过程中同样通过规则方法进行确定;

3)基于工序和工厂序列的编码(SGP),SGP中包含工序排序和工厂选择序列,机器选择在解码中通过当前最大完工时间最小化的规则(MCM)确定。MCM 规则如下:从工序序列的第一个工序开始,依次将其安排到使所在工厂当前最大完工
时间最小的机床上。

4)第四种编码包含工序序列、机器序列和工厂序列,为全解空间编码。

本篇推文中所用MA算法采用第四种编码方式,即基因编码包含工序序列、机器序列和工厂序列。

编码方式示意:

初始化过程中,随机产生每道工序的生产顺序,随后根据工序序列,在每个工序的可选加工工厂集合中随机选择一个加工工厂,最后在对应的加工工厂随机选择可加工的机器。

交叉算子

对工件序列采用基于工序的交叉算子(precedence operation crossover,POX)进行编码,对机器和工厂序列采用一般交叉算子(universial crossover,UC)编码。

function [PopulationTs_new,PopulationFs_new,PopulationMs_new] = CrossOver(PopulationTs,PopulationFs,PopulationMs,P_c,numOfPopulation,numOfTasks,numOfSubTasks)

%1.工厂选择和机器选择序列交叉算子:UX交叉
PopulationFs_new = zeros(numOfPopulation,numOfSubTasks);
PopulationMs_new = zeros(numOfPopulation,numOfSubTasks);
for i = 1:numOfPopulation
    FS_ind = PopulationFs(i,:);
    MS_ind = PopulationMs(i,:);
    K1 = randi(numOfPopulation);
    FSparent_1 = FS_ind;
    FSparent_2 = PopulationFs(K1,:);
    MSparent_1 = MS_ind;
    MSparent_2 = PopulationMs(K1,:);%得到两个父代个体
    P = rand(1);
    if P <= P_c
        K2 = randi(numOfSubTasks);
        random_list = randperm(numOfSubTasks);
        UX_list = random_list(1,1:K2);
        L_UX_list = length(UX_list);
        for k = 1:L_UX_list
            FS_value(1,k) = FSparent_2(1,UX_list(k));
            FSparent_1(1,UX_list(k)) = FS_value(1,k);
            MS_value(1,k) = MSparent_2(1,UX_list(k));
            MSparent_1(1,UX_list(k)) = MS_value(1,k);
        end
        PopulationFs_new(i,:) = FSparent_1;
        PopulationMs_new(i,:) = MSparent_1;
    else
        PopulationFs_new(i,:) = FS_ind;
        PopulationMs_new(i,:) = MS_ind;
    end
end


%2 工序序列交叉算子:POX交叉
PopulationTs_POX = PopulationTs(:,:);
PopulationTs_new = zeros(numOfPopulation,numOfSubTasks);
for n = 1:numOfPopulation
    TS_ind = PopulationTs_POX(n,:);
    TS_K1 = randi(numOfPopulation);
    TSparent_1 = TS_ind;
    TSparent_2 = PopulationTs_POX(TS_K1,:);%得到两个父代个体
    P = rand(1);
    if P <= P_c
        TS_list = randperm(numOfTasks);
        TS_K1 = randi(numOfTasks);
        POX_list1 = TS_list(1,1:TS_K1);
        POX_list2 = TS_list(1,TS_K1 + 1:numOfTasks);
        judge1 = zeros(1,numOfSubTasks);
        judge2 = zeros(1,numOfSubTasks);
        for m = 1:numOfSubTasks
            T1 = TSparent_1(1,m);
            T2 = TSparent_2(1,m);
            A0 = find(POX_list1 == T1);
            B0 = find(POX_list2 == T2);
            A = length(A0);
            B = length(B0);
            if A == 0
                judge1(1,m) = 0;
            else
                judge1(1,m) = 1;
            end
            if B == 0
                judge2(1,m) = 0;
            else
                judge2(1,m) = 1;
            end
        end
        index1 = find(judge1 ~= 0);
        index2 = find(judge2 ~= 0);
        index3 = find(judge1 == 0);
        L1 = length(index1);
        L2 = length(index2);
        child_TS = zeros(1,numOfSubTasks);
        for o = 1:numOfSubTasks
            for q = 1:L1
                TS_value1 = TSparent_1(1,index1(1,q));
                child_TS(1,index1(1,q)) = TS_value1;
            end
            for p = 1:L2
                TS_value2 = TSparent_2(1,index2(1,p));
                child_TS(1,index3(1,p)) = TS_value2;
            end
        end
        PopulationTs_new(n,:) = child_TS;
    else
        PopulationTs_new(n,:) = TS_ind;
    end
end

end

结果展示

参考文献

[1]唐红涛,李悦,王磊.模糊分布式柔性作业车间调度问题的求解算法[J].华中科技大学学报(自然科学版),2022,50(06):81-88.DOI:10.13245/j.hust.220610.

[2]张建林.多目标优化算法研究及其在分布式柔性作业车间调度中的应用[D].兰州理工大学,2022.DOI:10.27206/d.cnki.ggsgu.2022.001458.

[3]孟磊磊,张彪,任亚平,等.求解分布式柔性作业车间调度的混合蛙跳算法[J].机械工程学报,2021,57(17):263-272.

若有运筹优化建模及算法定制需求,欢迎联系我们私聊沟通

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本文介绍了使用Matlab实现多目标灰狼优化算法(Multi-Objective Grey Wolf Optimizer,MOGWO)来求解柔性作业车间调度问题(Flexible Job-Shop Scheduling Problem,FJSP)的方法。 1. 柔性作业车间调度问题 柔性作业车间调度问题是指在一台机器上,需要安排多个作业在多个工序上进行加工,每个作业需要在不同的工序上进行加工,每个工序需要一定的时间和资源,同时需要考虑不同的约束条件(如最早开始时间、最迟完成时间、作业间的优先关系等),目标是最小化完成所有作业的总时间或最小化机器的空闲时间。 2. 多目标灰狼优化算法 多目标灰狼优化算法是基于灰狼优化算法(Grey Wolf Optimizer,GWO)的多目标优化版本。该算法模拟了灰狼社会的行为,通过抓住“alpha”、“beta”和“delta”三个主导灰狼的行为来优化目标函数。多目标灰狼优化算法可以同时优化多个目标函数。 3. 求解柔性作业车间调度问题 求解柔性作业车间调度问题的过程可以分为以下几个步骤: (1)编写目标函数:将FJSP问题转化为目标函数,将多个目标函数合并成一个多目标函数。 (2)确定参数:确定算法的参数,如灰狼个数、最大迭代次数、交叉率等。 (3)初始化灰狼群体:根据问题的特性,初始化灰狼群体。 (4)灰狼优化过程:根据多目标灰狼优化算法,进行灰狼优化过程。 (5)结果分析:分析灰狼优化的结果,得到最优解。 4. Matlab实现 在Matlab中,可以使用以下代码实现MOGWO算法求解FJSP问题: % FJSP问题的目标函数 function f = FJSP(x) % x为决策变量,即作业的加工顺序 % 定义多个目标函数 f(1) = 计算完成所有作业的总时间 f(2) = 计算机器的空闲时间 % 将多个目标函数合并成一个多目标函数 f = [f(1) f(2)] end % MOGWO算法 function [bestx, bestf] = MOGWO(f, lb, ub, MaxIt, nPop, nObj, pCrossover, pMutation) % f为目标函数,lb和ub为决策变量的上下界,MaxIt为最大迭代次数,nPop为灰狼个数,nObj为目标函数个数,pCrossover和pMutation分别为交叉率和变异率 % 初始化灰狼群体 X = repmat(lb, nPop, 1) + rand(nPop, nObj).*(repmat(ub-lb, nPop, 1)); % 迭代优化过程 for it = 1:MaxIt % 计算适应度 F = zeros(nPop, nObj); for i = 1:nPop F(i,:) = f(X(i,:)); end % 更新最优解 [bestf, idx] = min(F); bestx = X(idx,:); % 更新灰狼位置 for i = 1:nPop % 计算灰狼位置 A = 2*rand(nObj,1)-1; C = 2*rand(nObj,1); D = abs(C.*bestx - X(i,:)); X1 = bestx - A.*D; % 交叉和变异 mask = rand(nObj,1) < pCrossover; X2 = X1; X2(~mask) = X(i,~mask); mask = rand(nObj,1) < pMutation; X3 = X2; X3(mask) = lb(mask) + rand(sum(mask),1).*(ub(mask)-lb(mask)); % 更新灰狼位置 X(i,:) = X3; end end end % 测试 % 假设有10个作业,每个作业需要在3个机器上进行加工 nJob = 10; nMachine = 3; % 初始化上下界 lb = zeros(1, nJob*nMachine); ub = ones(1, nJob*nMachine); % 假设最大迭代次数为100,灰狼个数为50,目标函数个数为2 MaxIt = 100; nPop = 50; nObj = 2; % 假设交叉率为0.8,变异率为0.3 pCrossover = 0.8; pMutation = 0.3; % 调用MOGWO算法求解FJSP问题 [bestx, bestf] = MOGWO(@FJSP, lb, ub, MaxIt, nPop, nObj, pCrossover, pMutation); % 输出结果 disp('Best Solution:'); disp(bestx); disp('Best Objective:'); disp(bestf);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eternal1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值