柔性作业车间
有关于柔性作业车间(FJSP)的问题描述、数学模型、编码解码,请移步我的另一篇博文:麻雀算法SSA解决柔性作业车间调度问题FJSP
下面我们直接进入 帝国竞争算法
帝国竞争算法 ICA
ICA 是一种基于帝国主义和殖民主义竞争的通用搜索算法,于 2007 年提出,该算法模拟帝国主义和殖民主义的社会历史现象,其主要步骤为初始帝国构建、殖民国家(Imperialist)与殖民地的同化和革命以及帝国竞争等行为。目前,该算法已广泛应用于科学理论和工程实践上。
ICA 可以分为初始帝国的构建、同化、革命以及帝国竞争等主要过程。
初始帝国构建
同化
革命和互换
帝国竞争
帝国竞争示意图:
ICA算法求解FJSP问题
部分代码
IAC.m
function ICA_Result = ICA(machineNum, jobNum, jobInfo, operaVec, candidateMachine)
disp('ICA 算法运行中....................');
%% ICA算法部分
nVar = 2 * sum(operaVec); % 自变量维度
VarSize = [1 nVar]; % Decision Variables Matrix Size
VarMin = -jobNum; % 自变量下界
VarMax = jobNum; % 自变量上界
MaxIt = 100; % 最大迭代次数
nPop = 100; % 种群规模
nEmp = 10; % Number of Empires/Imperialists
alpha = 1; % Selection Pressure
beta = 1.5; % Assimilation Coefficient
pRevolution = 0.20; % Revolution Probability
mu = 0.2; % Revolution Rate
zeta = 0.2; % Colonies Mean Cost Coefficient
global ICASettings;
ICASettings.MaxIt = MaxIt;
ICASettings.nPop = nPop;
ICASettings.nEmp = nEmp;
ICASettings.alpha = alpha;
ICASettings.beta = beta;
ICASettings.pRevolution = pRevolution;
ICASettings.mu = mu;
ICASettings.zeta = zeta;
global ProblemSettings;
ProblemSettings.nVar = nVar;
ProblemSettings.VarSize = VarSize;
ProblemSettings.VarMin = VarMin;
ProblemSettings.VarMax = VarMax;
%% Initialization
% Initialize Empires
emp = CreateInitialEmpires(machineNum, jobNum, jobInfo, operaVec, candidateMachine);
% Array to Hold Best Cost Values
curve = zeros(MaxIt, 1);
%% ICA Main Loop
for it = 1:MaxIt
% Assimilation
emp = AssimilateColonies(emp, machineNum, jobNum, jobInfo, operaVec, candidateMachine);
% Revolution
emp = DoRevolution(emp, machineNum, jobNum, jobInfo, operaVec, candidateMachine);
% Intra-Empire Competition
emp = IntraEmpireCompetition(emp);
% Update Total Cost of Empires
emp = UpdateTotalCost(emp);
% Inter-Empire Competition
emp = InterEmpireCompetition(emp);
% Update Best Solution Ever Found
imp = [emp.Imp];
[~, BestImpIndex] = min([imp.Cost]);
BestSol = imp(BestImpIndex);
% Update Best Cost
curve(it) = BestSol.Cost;
% Show Iteration Information
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(curve(it))]);
end
%% Results
ICA_Result.BestCost = BestSol.Cost;
ICA_Result.BestPosi = BestSol.Position;
ICA_Result.curve_min = curve;
[~, ICA_Result.machineTable] = fitness(ICA_Result.BestPosi, machineNum, jobNum, jobInfo, operaVec, candidateMachine);
end
运行结果
迭代曲线
甘特图
写在最后
本文系本人原创,未经本人允许,严禁盗图、盗文!如需完整MATLAB代码,私戳博主~ ~,亦或(扣)博主 3249992049 ~ ~