遗传算法混合模拟退火算法求解带约束的流水线调度问题matlab代码
Posted 博主QQ2449341593
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了遗传算法混合模拟退火算法求解带约束的流水线调度问题matlab代码相关的知识,希望对你有一定的参考价值。
遗传算法混合模拟退火算法求解带约束的流水线调度问题
带约束(工序约束,开工时间约束,切换不同作业时间开销约束)的流水线调度问题介绍
在规划阶段,有不同的加工订单要安排在多条装配线上。许多零件制造商认为,首要目标是最小化这些订单的总加权延迟时间,次要目标是最小化最大完工时间。第一个目标确保客户满意,而第二个目标增加生产能力,无需进一步投资于昂贵的设备。调度问题的假设和约束如下:
基本假设
1、零件是分批生产的。每个批次由相同的零件组成,具有相同的准备时间和截止日期。批处理称为作业。对同一块板加工不同侧面(正面和背面)的工序视为不同工序。
2、只有在同一行上产生的上一个作业完成后才能开始新的作业,即不允许抢占。
3、装配线是不相关的,也就是说,不同的生产线完成同一项工作的过程时间是不同的。通过设备供应商提供的现有软件,可以很好地估算工艺时间。
4、为实际考虑,在生产环境中,背面作业(加工零件背面的作业)只能在相应的正面作业开始2小时后才能开始。2小时的时间是由调查的零件制造商规定的。
5、一个新的作业需要0.27小时(16分钟)的普通设置(过渡)时间(上传程序,调整组件馈线等),除非在同一条生产线上的正面作业之后再加工一个背面作业需要2h的特殊过渡时间;
基本约束
1、加工时间:每个零件在每一台装配线上的装配时间不同的
2、工序约束:个别零件加工有先后次序要求,先完成某一样才能完成另一样零件的加工
3、开工时间约束:个别零件尚未准备好,需要再一定时间后才能进行加工
4、切换不同作业时间开销约束:切换某种作业时需要较长的准备时间
模型建立
假设总共有n个工作在K条装配线上调度。引入了每条装配线开始的虚拟作业J0和每条装配线结束的虚拟作业Jn+1。[1]
具体模型介绍请查阅引用文献1
遗传算法
遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,不需要确定的规则就能自动获取和指导优化的搜索空间,自适应地调整搜索方向。
遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。
为了解决局部最优解问题, 1983年,Kirkpatrick等提出了模拟退火算法(SA)能有效的解决局部最优解问题。我们知道在分子和原子的世界中,能量越大,意味着分子和原子越不稳定,当能量越低时,原子越稳定。‘退火’是物理学术语,指对物体加温在冷却的过程。模拟退火算法来源于晶体冷却的过程,如果固体不处于最低能量状态,给固体加热再冷却,随着温度缓慢下降,固体中的原子按照一定形状排列,形成高密度、低能量的有规则晶体,对应于算法中的全局最优解。而如果温度下降过快,可能导致原子缺少足够的时间排列成晶体的结构,结果产生了具有较高能量的非晶体,这就是局部最优解。因此就可以根据退火的过程,给其在增加一点能量,然后在冷却,如果增加能量,跳出了局部最优解,本次退火就是成功的。
参数设置
%% Problem Definition
model=CreateModel(); %创建问题模型
CostFunction=@(q) MyCost(q,model); %适应度函数设置
nVar=model.nVar; % 问题的维度
VarSize=[1 nVar]; % 维度矩阵
%% GA Parameters
MaxIt = 500; %算法最大迭代次数
nPop=30; %种群数目
pc= 0.8; %交叉概率
pm=0.8; %变异概率
%% SA Parameters
MaxIt2=25; % Maximum Number of Inner Iterations
T0=10; % Initial Temperature
alpha=0.97; % Temperature Damping Rate
遗传代码
%% Initialization 初始化
empty_particle.Position=[];
empty_particle.Cost=[];
empty_particle.Sol=[];
particle=repmat(empty_particle,nPop,1);
GlobalBest.Cost=inf;
BestCost=zeros(MaxIt,1);
for i=1: nPop
%初始化种群
particle(i).Position= CreateRandomSolution(model);
%评价
[particle(i).Cost,particle(i).Sol] =CostFunction(particle(i).Position);
%更新全局 最优
if particle(i).Cost<GlobalBest.Cost
GlobalBest=particle(i);
end
end
for iter=1:MaxIt
particle = Select(particle,[particle(:).Cost]);
particle = Crossover(particle,pc);
particle = Mutation(particle,pm);
for i=1: nPop
%评价
[particle(i).Cost,particle(i).Sol] =CostFunction(particle(i).Position);
%更新全局 最优
if particle(i).Cost<GlobalBest.Cost
GlobalBest=particle(i);
end
end
x = GlobalBest;
for it2=1:MaxIt2
% Create Neighbor
xnew.Position=CreateNeighbor(x.Position);
[xnew.Cost, xnew.Sol]=CostFunction(xnew.Position);
if xnew.Cost<=x.Cost
% xnew is better, so it is accepted
x=xnew;
else
% xnew is not better, so it is accepted conditionally
delta=xnew.Cost-x.Cost;
p=exp(-delta/T);
if rand<=p
x=xnew;
end
end
% Update Best Solution
if x.Cost<=GlobalBest.Cost
GlobalBest=x;
end
end
BestCost(iter) = GlobalBest.Cost;
% Plot Solution
figure(1);
PlotSolution(GlobalBest.Sol,model);
pause(0.01);
disp(['iter = ' num2str(iter) ';BestCost = ' num2str(GlobalBest.Cost)]);
end
figure
plot(BestCost,'LineWidth',2);
xlabel('迭代次数');
ylabel('目标函数值');
结果展示
案例测试来源于引用文献1
代码下载https://www.cnblogs.com/matlabxiao/p/14883637.html
以上是关于遗传算法混合模拟退火算法求解带约束的流水线调度问题matlab代码的主要内容,如果未能解决你的问题,请参考以下文章
车间调度基于matlab模拟退火算法求解单约束车间流水线调度问题含Matlab源码 1457期
用Python实现基于遗传算法(GA)求解混合流水车间调度问题(HFSP)
车间调度基于遗传算法求解混合流水车间调度最优问题matlab源码
车间调度基于遗传算法求解混合流水车间调度最优问题matlab源码