生产线平衡问题是经典的N-P问题, 我们常用遗传算法或粒子群算法等智能算法予以求解. 生产线平衡问题是一种有顺序约束的装配问题, 目标函数一般是工作站数量最小化或生产节拍最小化或最大化平衡率或平滑指数.
生产线平衡问题的模型为: 有N个作业工序, 各作业工序的时间为Ti(图中圆圈上部的数字), 无回路的有向图G规定了N个工序的装配顺序约束(举例如下图所示). 图G中箭头所指为工序之间的紧前约束, 也即箭头起点的工序完成后才能开始箭头终点的工序. 第一类生产线平衡问题就是基于以上模型, 寻找一个划分, 将N个工序划分为m个有序子集(每个子集称为一个工位), 使得满足G的同时, 最小化m.
图G
该模型的假设如下:
(1)各作业工序Ti的时间已知且是确定的。
(2)每一个作业工序不可以再分配给两个工位,且需要是不能再分割的最小作业单元。
(3)作业工序时间不超过工位的时间。
(4)作业工序中的最大时间不可以大于装配线的节拍时间,即式(2-2)
(5)装配线可以完成装配过程的每一项作业。
(6)不准许并行的工作站在装配线上同时存在。
对以上问题, 我们可以采用经典智的能算法遗传算法来求解.
根据图G, 我们构造以下的数据表作为程序的格式化输入数据. 并存到Excel中.
编号 | 工序 | 紧前工序 | 时间/min |
1 | 工序1 | 0 | 1.2 |
2 | 工序2 | 1 | 0.8 |
3 | 工序3 | 1 | 1.9 |
4 | 工序4 | 1 | 1 |
5 | 工序5 | 2 | 0.7 |
6 | 工序6 | 3、4 | 1.1 |
7 | 工序7 | 5、6 | 2.5 |
然后我们采用自然数排序编码给定一个工序的顺序, 比如
主程序代码如下:
%% 遗传算法优化生产线平衡
clc;close all;clear all;warning off;%清除变量
rand('seed', 100);
randn('seed', 100);
format long g;
global T N CT opernumber premat;
[adata,bdata,cdata]=xlsread('数据.xls');
opernumber=size(premat,1);
CT=3;%生产节拍
N=5;
% 遗传算法参数
popsize=10;%遗传算法种群数
maxgen=50;%遗传算法迭代次数
PM=0.2;%变异概率
PC=0.7;%交叉概率
%% 遗传算法主程序
%性能跟踪
tracemat=zeros(maxgen,2);
gen=0;
Chrom=genChrome(popsize,opernumber);% 建立种群
Value=decodingFun(Chrom,popsize);%解码染色体
[vmin,indexmin]=min(Value);
bestValue=vmin;%记录函数的最优值
bestChrom=Chrom(indexmin,:);% 记录函数的最优染色体
%% 遗传算法主循环
%进度条
wait_hand = waitbar(0,'run……', 'tag', 'TMWWaitbar');
while gen<=maxgen
%% 遗传算子
FitnV=ranking(Value);% 分配适应度值
Chrom=select('sus',Chrom,FitnV,1);% 选择
Chrom=mutationGA(Chrom,popsize,PM,opernumber);% 种群变异,2点互易的变异
Chrom=crossGA(Chrom,popsize,PC,opernumber);% 种群交叉,2点交叉
Value=decodingFun(Chrom,popsize);% 解码染色体
%% 计算最优
[vmin,indexmin]=min(Value);
gen=gen+1;
%% 记录最优
if bestValue>vmin
bestValue=vmin;%记录函数的最优值
bestChrom=Chrom(indexmin,:);% 记录函数的最优染色体
end
tracemat(gen,1)=bestValue;
tracemat(gen,2)=mean(Value);
waitbar(gen/maxgen,wait_hand);%每循环一次更新一次进步条
end
delete(wait_hand);%执行完后删除该进度条
% 显示结果
disp('遗传算法优化得到的最优值');
bestValue
disp('遗传算法优化得到的染色体');
bestChrom
figure;
plot(tracemat(:,1),'r-','linewidth',1);
legend({'最优解'},'fontname','宋体');
xlabel('迭代次数','fontname','宋体');
ylabel('工作站数量','fontname','宋体');
title('遗传算法优化迭代曲线','fontname','宋体');
% 输出结果
x=bestChrom;
[y,Rcell]=myfun(x);
times=zeros(N,1);
for j=1:N
% 计算时间
disp(['第',num2str(j),'个工位对应的工序编号为:']);
Rcell{j}
end
outcell={'工作站ID','分配的工序ID'};
tempcell=cell(N,2);
for i=1:N
tempcell{i,1}=num2str(i);
tempcell{i,2}=num2str(Rcell{i,1});
end
outcell=[outcell;
tempcell];
xlswrite('分配结果.xls',outcell);
set1=[];
for j=1:N
set1=[set1,Rcell{j}];
end
g2=unique(set1)
%% 画均衡图
title201='遗传算法优化得到的生产线平衡图';
drawBalancedfun(Rcell,N,T,title201);
程序运行结果如下:
遗传算法优化得到的最优值
bestValue =
1.39598657703005
遗传算法优化得到的染色体
bestChrom =
7 1 2 6 3 5 4
第1个工位对应的工序编号为:
ans =
1 2
第2个工位对应的工序编号为:
ans =
3 5
第3个工位对应的工序编号为:
ans =
4 6
第4个工位对应的工序编号为:
ans =
7
第5个工位对应的工序编号为:
ans =
空矩阵: 1×0
g2 =
1 2 3 4 5 6 7
>>
需要讨论的可以加QQ1579325979