人工蜂群算法ABC解决柔性作业车间调度问题FJSP

柔性作业车间问题FJSP

关于柔性作业车间的建模、描述、编解码等问题,大家可以移步我的另一篇博文,有比较详细的介绍:麻雀算法SSA解决柔性作业车间调度问题FJSP

直接简要说下人工蜂群算法ABC的主要步骤:

ABC算法

ABC简介

人工蜂群(Artificial Bee Colony,ABC)算法是一种群体智能优化算法,是20世纪以来最具有代表性的算法之一,其主要的优化思想来源于自然界中模仿蜜蜂的觅食行为。Karaboga于2005年提出了基本的人工蜂群算法ABC模型,用于求解多变量函数优化问题。
ABC主要特点是只需要对问题进行目标值大小的比较,通过每个蜜蜂个体的局部寻优行为,并且通过交流机制实现蜂群信息的共享。每一个单独个体向着更优的方向进化,最终个体的最优解可以在群体中使全局最优值突现出来,这种算法思想使ABC有着较快的收敛速度。整个蜂群系统由三个要素基本要素组成,分别是食物源(Food Source)、雇佣蜂(Employed Bee)和非雇佣蜂(Unemployed Bee),具体介绍
如下所述:
(1)食物源:食物源即为蜜源。在自然场景中,食物源的价值由运输距离和花蜜产量等多种因素共同决定。在优化问题中,食物源的优劣即可行解的好坏是用蜜源花蜜量的大小即适应度值来评价的。在ABC中,每一个食物源就是一个待求优化问题的可行解,是人工蜂群算法中所要处理的基本对象。
(2)雇佣蜂:雇佣蜂也叫引领蜂(Leader Bee),其与食物源的位置相对应,一个食物源对应一个引领蜂。在ABC中,食物源的个数与引领蜂的个数相等;引领蜂的任务是发现食物源信息并以一定的概率与跟随蜂分享;概率的计算即为人工蜂群算法中的选择策略,一般是根据适应度值以轮盘赌的方法计算。
(3)非雇佣蜂:非雇佣蜂分为跟随蜂(Follower Bee)和侦察蜂(Scout Bee)。跟随蜂根据引领蜂提供的蜜源信息来选择食物源,而侦察蜂是在蜂巢附近寻找新的食物源。在ABC中,跟随蜂依据引领蜂传递的信息,在食物源附近搜索新食物源,并进行贪婪选择。若一个食物源在经过次后仍未被更新,则此引领蜂变成侦察蜂,侦察蜂寻找新的食物源代替原来的食物源。

ABC主要步骤

根据上述描述,可以将原始的ABC算法描述为如下步骤:
step1
主要代码

%% 种群初始化
% Empty Bee Structure:Position --> 个体编码     Cost-->个体编码对应的目标函数值(Cmax)
empty_bee.Position = [];
empty_bee.Cost = [];

% Initialize Population Array
pop = repmat(empty_bee, nPop, 1);

% Initialize Best Solution Ever Found
BestSol.Cost = inf;

% Create Initial Population
for i = 1:nPop
    pop(i).Position = unifrnd(VarMin, VarMax, VarSize);
    pop(i).Cost = fitness(pop(i).Position, machineNum, jobNum, jobInfo, operaVec, candidateMachine);
    if pop(i).Cost <= BestSol.Cost
        BestSol = pop(i);
    end
end

step2
主要代码

for i = 1:nPop
        
        % Choose k randomly, not equal to i
        K = [1: i - 1 i + 1: nPop];
        k = K(randi([1 numel(K)]));
        
        % Define Acceleration Coeff.
        phi = a * unifrnd(-1, +1, VarSize);
        
        % New Bee Position
        newbee.Position = pop(i).Position + phi .* (pop(i).Position - pop(k).Position);
        
        % Apply Bounds
        newbee.Position = max(newbee.Position, VarMin);
        newbee.Position = min(newbee.Position, VarMax);

        % Evaluation
        newbee.Cost = fitness(newbee.Position, machineNum, jobNum, jobInfo, operaVec, candidateMachine);
        
        % Comparision
        if newbee.Cost <= pop(i).Cost
            pop(i) = newbee;
        else
            C(i) = C(i)+1;
        end
        
    end

step3
step3
主要代码

% Calculate Fitness Values and Selection Probabilities
    F = zeros(nPop, 1);
    MeanCost = mean([pop.Cost]);
    for i = 1:nPop
        F(i) = exp(-pop(i).Cost/MeanCost); % Convert Cost to Fitness
    end
    P = F/sum(F);
    
    % Onlooker Bees:跟随蜂
    for m = 1:nOnlooker
        
        % Select Source Site
        i = RouletteWheelSelection(P);
        
        % Choose k randomly, not equal to i
        K = [1:i-1 i+1:nPop];
        k = K(randi([1 numel(K)]));
        
        % Define Acceleration Coeff.
        phi = a*unifrnd(-1, +1, VarSize);
        
        % New Bee Position
        newbee.Position = pop(i).Position+phi.*(pop(i).Position-pop(k).Position);
        
        % Apply Bounds
        newbee.Position = max(newbee.Position, VarMin);
        newbee.Position = min(newbee.Position, VarMax);
        
        % Evaluation
        newbee.Cost = fitness(newbee.Position, machineNum, jobNum, jobInfo, operaVec, candidateMachine);
        
        % Comparision
        if newbee.Cost <= pop(i).Cost
            pop(i) = newbee;
        else
            C(i) = C(i) + 1;
        end
        
    end

step4
主要代码

% Scout Bees:侦察蜂
    for i = 1:nPop
        if C(i) >= L
            pop(i).Position = unifrnd(VarMin, VarMax, VarSize);
            pop(i).Cost = fitness(pop(i).Position, machineNum, jobNum, jobInfo, operaVec, candidateMachine);
            C(i) = 0;
        end
    end

step5-6

FJSP-ABC

使用ABC求解FJSP问题,这里随便使用MK01进行测试,算例可以随意调整(修改名称即可)

%% 算例载入
dictPath='Brandimarte_Data';
dataName='Mk01.fjs';

收敛曲线

迭代曲线

甘特图

甘特图

小结

未经改进的ABC求解MK01,Cmax大致能跑到44 45的样子

权利声明:

未经本人允许,本文所有内容禁止搬运,严禁盗图盗文!

代码传送门

本文代码及各种车间调度问题可咨询:
(1)扣扣:3249992049
(2)私信咨询 ~~

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值