第一类生产线平衡问题及其MATLAB实现

       生产线平衡问题是经典的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工序101.2
2工序210.8
3工序311.9
4工序411
5工序520.7
6工序63、41.1
7工序75、62.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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MATLAB代码顾问

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值