柔性作业车间问题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算法描述为如下步骤:
主要代码
%% 种群初始化
% 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
主要代码
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
主要代码
% 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
主要代码
% 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
FJSP-ABC
使用ABC求解FJSP问题,这里随便使用MK01进行测试,算例可以随意调整(修改名称即可)
%% 算例载入
dictPath='Brandimarte_Data';
dataName='Mk01.fjs';
收敛曲线
甘特图
小结
未经改进的ABC求解MK01,Cmax大致能跑到44 45的样子
权利声明:
未经本人允许,本文所有内容禁止搬运,严禁盗图盗文!
代码传送门
本文代码及各种车间调度问题可咨询:
(1)扣扣:3249992049
(2)私信咨询 ~~