【PFJSP问题】基于自适应双种群协同鸡群算法ADPCCSO求解置换流水车间调度问题PFSP附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。
🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室
👇 关注我领取海量matlab电子书和数学建模资料
🍊个人信条:做科研,博学之、审问之、慎思之、明辨之、笃行之,是为:博学慎思,明辨笃行。
🔥 内容介绍
一、引言
置换流水车间调度问题(PFSP)是一类经典的组合优化问题,在制造业等领域有着广泛应用。该问题旨在确定工件在各机器上的加工顺序,以优化诸如最大完工时间(makespan)等性能指标。由于 PFSP 是 NP - 难问题,随着问题规模的增大,传统精确算法求解效率极低。因此,启发式和元启发式算法成为解决 PFSP 的常用方法。鸡群算法(CSO)作为一种新兴的元启发式算法,具有概念简单、易于实现等优点,但也存在易早熟收敛等不足。本文提出的自适应双种群协同鸡群算法(ADPCCSO),通过引入双种群结构和自适应策略,旨在提高鸡群算法在求解 PFSP 问题时的性能。
二、置换流水车间调度问题(PFSP)
PFSP 问题描述
四、自适应双种群协同鸡群算法(ADPCCSO)
双种群结构
种群划分:ADPCCSO 将鸡群分为两个种群,即探索种群和开发种群。探索种群侧重于在解空间中进行广泛的搜索,以发现潜在的优质区域;开发种群则专注于对已发现的优质区域进行深入挖掘,以提高解的质量。两个种群独立进化,但定期进行信息交流,实现协同优化。
种群初始化:在初始化阶段,两个种群分别随机生成一定数量的个体(解)。为了增加种群的多样性,探索种群的个体在解空间中分布更为分散,而开发种群的个体相对集中在解空间的某些区域。例如,可以通过调整随机数生成的范围来控制个体的分布。
自适应策略
自适应参数调整:ADPCCSO 引入自适应策略来动态调整算法参数。对于探索种群,随着进化代数的增加,逐渐减小公鸡位置更新公式中的 φ 值,使得探索种群的搜索范围逐渐缩小,从全局搜索转向局部搜索。对于开发种群,随着进化代数的增加,适当增大母鸡位置更新公式中的 r1 和 r2 值,增强开发种群对局部区域的挖掘能力。通过这种自适应调整,算法能够在不同的进化阶段更好地平衡全局搜索和局部搜索能力。
种群规模自适应调整:根据两个种群的进化情况,动态调整种群规模。如果探索种群在一段时间内没有发现更好的解,说明当前搜索区域可能潜力有限,适当减小探索种群规模,将更多资源分配给开发种群。反之,如果开发种群陷入局部最优,无法进一步提高解的质量,则适当增大探索种群规模,扩大搜索范围。
协同机制
信息交流方式:两个种群定期进行信息交流。每隔一定代数,从探索种群中选择适应度较好的个体(如排名前 k% 的个体),将其引入开发种群,同时从开发种群中选择适应度较差的个体(如排名后 k% 的个体),替换为探索种群中的个体。这种信息交流方式使得探索种群发现的优质解能够传递到开发种群进行进一步优化,同时开发种群中较差的个体被探索种群的新个体替代,保持种群的多样性。
协同优化过程:通过双种群结构、自适应策略和协同机制,ADPCCSO 在进化过程中,探索种群不断在解空间中寻找新的优质区域,开发种群对这些区域进行深入开发。两个种群相互协作,共同朝着全局最优解进化,有效避免了单一鸡群算法容易出现的早熟收敛问题。
⛳️ 运行结果
📣 部分代码
function func_plot(func_name)
[LB,UB,Dim,F_obj]=Get_F(func_name);
switch func_name
case 'F1'
x=-100:2:100; y=x; %[-100,100]
case 'F2'
x=-100:2:100; y=x; %[-10,10]
case 'F3'
x=-100:2:100; y=x; %[-100,100]
case 'F4'
x=-100:2:100; y=x; %[-100,100]
case 'F5'
x=-200:2:200; y=x; %[-5,5]
case 'F6'
x=-100:2:100; y=x; %[-100,100]
case 'F7'
x=-1:0.03:1; y=x %[-1,1]
case 'F8'
x=-500:10:500;y=x; %[-500,500]
case 'F9'
x=-5:0.1:5; y=x; %[-5,5]
case 'F10'
x=-20:0.5:20; y=x;%[-500,500]
case 'F11'
x=-500:10:500; y=x;%[-0.5,0.5]
case 'F12'
x=-10:0.1:10; y=x;%[-pi,pi]
case 'F13'
x=-5:0.08:5; y=x;%[-3,1]
case 'F14'
x=-100:2:100; y=x;%[-100,100]
case 'F15'
x=-5:0.1:5; y=x;%[-5,5]
case 'F16'
x=-1:0.01:1; y=x;%[-5,5]
case 'F17'
x=-5:0.1:5; y=x;%[-5,5]
case 'F18'
x=-5:0.06:5; y=x;%[-5,5]
case 'F19'
x=-5:0.1:5; y=x;%[-5,5]
case 'F20'
x=-5:0.1:5; y=x;%[-5,5]
case 'F21'
x=-5:0.1:5; y=x;%[-5,5]
case 'F22'
x=-5:0.1:5; y=x;%[-5,5]
case 'F23'
x=-5:0.1:5; y=x;%[-5,5]
end
L=length(x);
f=[];
for i=1:L
for j=1:L
if strcmp(func_name,'F15')==0 && strcmp(func_name,'F19')==0 && strcmp(func_name,'F20')==0 && strcmp(func_name,'F21')==0 && strcmp(func_name,'F22')==0 && strcmp(func_name,'F23')==0
f(i,j)=F_obj([x(i),y(j)]);
end
if strcmp(func_name,'F15')==1
f(i,j)=F_obj([x(i),y(j),0,0]);
end
if strcmp(func_name,'F19')==1
f(i,j)=F_obj([x(i),y(j),0]);
end
if strcmp(func_name,'F20')==1
f(i,j)=F_obj([x(i),y(j),0,0,0,0]);
end
if strcmp(func_name,'F21')==1 || strcmp(func_name,'F22')==1 ||strcmp(func_name,'F23')==1
f(i,j)=F_obj([x(i),y(j),0,0]);
end
end
end
surfc(x,y,f,'LineStyle','none');
end
