2024 年“泰迪杯”A 题:生产线的故障自动识别与人员配置--第四题(用遗传算法解决生产线排班问题--matlab代码)

问题背景:

        问题四:根据实际情况,现需要扩大生产规模,将生产线每天的运行时间从 8 小时增加 到 24 小时不间断生产,考虑生产线与操作人员的搭配,制定最佳的操作人员排班方案,要求满足以下条件:(1) 各操作人员做五休二,尽量连休 2 天; (2) 各操作人员每班连续工作 8 小时; (3) 班次时间:早班(8:00-16:00)、中班(16:00-24:00)、晚班(0:00-8:00); (4) 各工龄操作人员的人数比例与问题 3 中的比例相同; (5) 各操作人员的班次安排尽量均衡。

        已知问题三中原本每条生产线与相应操作人员对应如下:

1d2de51f364848f0a14ab40fd8795b69.png

问题分析:

        问题四为优化问题,考虑使用遗传算法,根据附件三给出的生产线与操作人员信息,无法将生产线与操作人员剥离开而单独讨论某条生产线或者某位操作人员的工作能力指标。因此,在本题中,固定生产线与相应工龄操作人员的搭配,即从理论上固定生产效率。那么,本题仅为优化问题中的排班问题,考虑如下约束条件:

1.每天10条线24小时工作;

2.一位操作人员每天工作8小时;

3.夜班之后必须至少休一天(考虑现实情况添加);

4.各操作人员上五休二,尽量连休;

5.各操作人员班次尽量均匀。

        其中,为了生产线的正常运行与操作人员身体健康,1-3为硬性约束,4-5为软约束,以此建立遗传算法优化模型,希望得到合理的排班表。考虑到24小时生产线不间断运营,并且要保证操作人员工龄比例与附件三相同,至少需要5组生产线操作人员,即50人,约定员工与产线有如下对应关系:

ff12e2b56570454893d849bb71cb0787.png

遗传算法排班:

        使用遗传算法进行排班,首先,需要确定染色体的编码,这里,每条染色体代表一个排班表,染色体中每两位二进制编码表示一种班型,对于一周7天,每天有操作人员50人,一条染色体由7×50条操作人员基因组成,每一个操作人员基因又由2位的班型基因(二进制编码)构成,因此,一条染色体由7×50×2位编码的基因组成。

pop = 50; %设定初始种群数量
length = 700; %种群基因编码长度,一周七天,每天50个排班人员,总共3种班型(用2位二进制编码表示)
gen = 500; %迭代次数
crossover_probablity = 0.9; %交叉概率     %交叉概率一般在0.6~0.9之间
variation_probablity = 0.1; %变异概率     %
initial_pop = round(rand(pop,length)); %生成初始种群%算法迭代m次
for m=1:gen%将每一代 染色体长度为700位的二进制种群 转化为50*7的矩阵(50人,一周7天)x = zeros(50,7,pop);for i = 1:size(initial_pop,1) %分别遍历排班表for j = 1:7  %遍历一周七天for k = 1:50 %遍历50个排班人员for l = 1:2 %二进制班型转换为十进制x(k,j,i) = initial_pop ( i,100*(j-1)+2*(k-1)+l ) * 2^(2-l) + x(k,j,i);   % 100是人数50×排班编码数2endend      end%%%%%确定每天每个班次不超过十人上班,若超过10人,按工龄比例随机保留10名员%%%%%工上班,其他人放假,且各工龄比例如题三for j=1:7for f = 0:2if sum(x(1:10,j,i)==f)>2     % 工龄1人数大于2w = find(x(1:10,j,i)==f);   % 获取上班的人索引n_geshu = size(w,1);ran_index = randperm(n_geshu);   % 生成随机索引 n_de = n_geshu - 2;  % 要改为休假的员工人数de_index = ran_index(1:n_de);  dey_index = w(de_index,:);  % 随机抽取放假人员索引x(dey_index,j,i) = 3; endif sum(x(11:20,j,i)==f)>2     % 工龄2人数大于2w = find(x(11:20,j,i)==f);  n_geshu = size(w,1);ran_index = randperm(n_geshu);   % 随机索引 n_de = n_geshu - 2; de_index = ran_index(1:n_de);dey_index = w(de_index,:);x(dey_index+10,j,i) = 3; endif sum(x(21:25,j,i)==f)>1     % 工龄3人数大于2w = find(x(21:25,j,i)==f);  n_geshu = size(w,1);ran_index = randperm(n_geshu);   % 随机索引 n_de = n_geshu - 1; de_index = ran_index(1:n_de);dey_index = w(de_index,:);x(dey_index+20,j,i) = 3; endif sum(x(26:35,j,i)==f)>2     % 工龄4人数大于2w = find(x(26:35,j,i)==f);   % 人索引n_geshu = size(w,1);ran_index = randperm(n_geshu);   % 随机索引 n_de = n_geshu - 2;  % 要取消的工作人数de_index = ran_index(1:n_de);dey_index = w(de_index,:);x(dey_index+25,j,i) = 3; endif sum(x(36:45,j,i)==f)>2     % 工龄5人数大于2w = find(x(36:45,j,i)==f);  n_geshu = size(w,1);ran_index = randperm(n_geshu);   % 随机索引 n_de = n_geshu - 2;  de_index = ran_index(1:n_de);dey_index = w(de_index,:);x(dey_index+35,j,i) = 3; endif sum(x(46:50,j,i)==f)>1     % 工龄6人数大于2w = find(x(46:50,j,i)==f);  n_geshu = size(w,1);ran_index = randperm(n_geshu);   % 随机索引 n_de = n_geshu - 1;  de_index = ran_index(1:n_de);dey_index = w(de_index,:);x(dey_index+45,j,i) = 3; endendend%%%!规定夜班后必是休息!for j = 1:6  %遍历一周前6天for k = 1:50 %遍历50个排班人员if x(k,j,i)==2x(k,j+1,i)=3;endendend%%%%%确定每天每个班次不低于十人上班,若低于,随机选取改工龄内休假的人排班for j=1:7for f = 0:2if sum(x(1:10,j,i)==f)<2     w = find(x(1:10,j,i)==f);   % 已经排班的人索引n_geshu = size(w,1);ww = find(x(1:10,j,i)==3);   % 休假人索引nj_geshu = size(ww,1);ran_index = randperm(nj_geshu);   % 随机索引 n_cre = 2 - n_geshu;  % 要由休假变上班的人数de_index = ran_index(1:n_cre);dey_index = ww(de_index,:);x(dey_index,j,i) = f; endif sum(x(11:20,j,i)==f)<2     % 工龄2w = find(x(11:20,j,i)==f);   n_geshu = size(w,1);ww = find(x(11:20,j,i)==3);   nj_geshu = size(ww,1);ran_index = randperm(nj_geshu);   % 随机索引 n_cre = 2 - n_geshu;  de_index = ran_index(1:n_cre);dey_index = ww(de_index,:);x(dey_index+10,j,i) = f; endif sum(x(21:25,j,i)==f)==0     % 工龄3一班次只需一人,所以如果无人上班,添加一人ww = find(x(21:25,j,i)==3);  n_geshu = size(ww,1);ran_index = randperm(n_geshu);   % 随机索引 n_de = 1;  de_index = ran_index(1);dey_index = ww(de_index,:);x(dey_index+20,j,i) = f; endif sum(x(26:35,j,i)==f)<2     % 工龄4w = find(x(26:35,j,i)==f);  n_geshu = size(w,1);ww = find(x(26:35,j,i)==3);  n_geshu = size(ww,1);ran_index = randperm(n_geshu);   % 随机索引 n_cre = 2 - n_geshu;  de_index = ran_index(1:n_cre);dey_index = ww(de_index,:);x(dey_index+25,j,i) = f; endif sum(x(36:45,j,i)==f)<2     % 工龄5w = find(x(36:45,j,i)==f);  n_geshu = size(w,1);ww = find(x(36:45,j,i)==3);  n_geshu = size(ww,1);ran_index = randperm(n_geshu);   % 随机索引 n_cre = 2 - n_geshu;  de_index = ran_index(1:n_cre);dey_index = ww(de_index,:);x(dey_index+35,j,i) = f; endif sum(x(46:50,j,i)==f)==0     % 工龄6ww = find(x(46:50,j,i)==3);  n_geshu = size(ww,1);ran_index = randperm(n_geshu);   % 随机索引 n_de = 1;  de_index = ran_index(1);dey_index = ww(de_index,:);x(dey_index+45,j,i) = f; endendendend%%%%%% 约束条件 %%%%%%约束1---  每天每班次上班十人,且工龄如题三比例  -------硬约束 --y1 = zeros(pop,7);%每天的适应值yy1 = zeros(pop,7);   % yy1,2,3表示早中晚班人员配置适应值yy2 = zeros(pop,7);yy3 = zeros(pop,7);yy4 = zeros(pop,7);   % yy4表示每天20人休息适应值--硬for i=1:size(initial_pop,1)for j=1:7yy1(i,j) = 1/((sum(x(1:10,j,i)==0)-2)^2 + (sum(x(11:20,j,i)==0)-2)^2 + (sum(x(21:25,j,i)==0)-1)^2 + (sum(x(26:35,j,i)==0)-2)^2 + (sum(x(36:45,j,i)==0)-2)^2 + (sum(x(46:50,j,i)==0)-1)^2 + 1);% 每个时间段的各年龄工人刚好和生产线匹配----早班,午班晚班类似yy2(i,j) = 1/((sum(x(1:10,j,i)==1)-2)^2 + (sum(x(11:20,j,i)==1)-2)^2 + (sum(x(21:25,j,i)==1)-1)^2 + (sum(x(26:35,j,i)==1)-2)^2 + (sum(x(36:45,j,i)==1)-2)^2 + (sum(x(46:50,j,i)==1)-1)^2 + 1);yy3(i,j) = 1/((sum(x(1:10,j,i)==2)-2)^2 + (sum(x(11:20,j,i)==2)-2)^2 + (sum(x(21:25,j,i)==2)-1)^2 + (sum(x(26:35,j,i)==2)-2)^2 + (sum(x(36:45,j,i)==2)-2)^2 + (sum(x(46:50,j,i)==2)-1)^2 + 1);yy4(i,j) = 1/((sum(x(1:10,j,i)==3)-4)^2 + (sum(x(11:20,j,i)==3)-4)^2 + (sum(x(21:25,j,i)==3)-2)^2 + (sum(x(26:35,j,i)==3)-4)^2 + (sum(x(36:45,j,i)==3)-4)^2 + (sum(x(46:50,j,i)==3)-2)^2 + 1);y1(i,j) = yy1(i,j) + yy2(i,j) + yy3(i,j) + yy4(i,j);endend%y1为每天的适应值(最大值为1),yw1为每周的适应值(理论最大值为7x4),此处为1for i=1:size(initial_pop,1)yw1(i,1) = sum(y1(i,:))/28;end%约束2-----   每人一周内上5休2  y2 = zeros(pop,7); %每人的适应值-硬 - 五休二y3 = ones(pop,k); %每人的适应值-软for i = 1:size(initial_pop,1) for k = 1:49y2(i,k) = 1/((sum(x(k,1:7,i)==3) - 2)^2 + 1);   %最大 1  %上五休二 y4(i,k) = 1/((sum(x(k,1:7,i)==3)-sum(x(k+1,1:7,i)==3))^2 +1); for j = 1:5  %遍历周一至周六if x(k,j,i) == 2    % 如果是放假--夜班后 % 若放一天就继续工作的惩罚函数y3(i,k) = y3(i,k) - 1/5 *( x(k,j+2,i)~=3 );   % 最大 1  尽量连休endendendend%y2,y3为每人的适应值(最大值为1),yr1,yr2为整个排班表的适应值(理论最大值为50),此处1for i=1:size(initial_pop,1)yr1(i,1) = sum( y2(pop,:) )/50;yr2(i,1) = sum( y3(pop,:) )/50;yr3(i,1) = sum( y4(pop,:) )/50;end% 权重凭感觉给的,实际应该考虑约束条件的重要性及达到约束的难易程度y = 0.8*yw1 +0.05*yr1 + 0.1*yr2 + 0.15*yr3;   %找到种群中的最优基因  [a,b] = max(y);  % a-单次迭代中最大y值; b-最大y的索引位置fit1=y/sum(y); %计算每个种群的适应度在总适应度里所占的比例fit2=cumsum(fit1); %累加%基因选择choose=sort(rand(pop,1)); %有序随机数序列k=1;i=1;while k<=popif choose(k)<fit2(i)  % 此处使用的是--轮盘赌选择法choosen_population(k,:)=initial_pop(i,:);k=k+1;elsei=i+1;endend%基因交叉--for i=1:2:pop-1if rand<crossover_probablitycrossover_length=round(rand*(length-1))+1; %基因交叉长度crossover_population(i,:)=[choosen_population(i,1:crossover_length),choosen_population(i+1,crossover_length+1:end)];crossover_population(i+1,:)=[choosen_population(i+1,1:crossover_length),choosen_population(i,crossover_length+1:end)];elsecrossover_population(i:i+1,:) = choosen_population(i:i+1,:);endend%基因变异variation_population=crossover_population; for i=1:popif rand<variation_probablityvariation_location=round(rand*(length-1))+1;variation_population(i,variation_location)=1-variation_population(i,variation_location);endendvariation_population(end,:)=initial_pop(b,:); %保留该次迭代中的最优种群initial_pop=variation_population; %经选择、交叉、变异后的种群作为下一代的初始种群,从而完成迭代best(m,1)=y(b); % 记录下第m代的最优函数值best(m,2) = yw1(b);  %记录第m代的最优适应值们best(m,3) = yr1(b);best(m,4) = yr2(b);best(m,5) = yr3(b);best_pop(:,:,m) = x(:,:,b);  % 记录下第m代的最优排班表
end%画图
y_smoothed = smooth(1:size(best,1),best(:,1), 0.5, 'loess');  %添加平滑曲线
figure;
plot(1:size(best,1),best(:,1),'-', 'LineWidth',1.2);hold on;
plot(1:size(best,1),y_smoothed,'-','color','red', 'LineWidth',1.2);hold on;
xlabel('迭代次数');
ylabel('适应值');
title('适应值变化曲线(排班一周)');

197f83306aef497882c99907b72d5c5c.png

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/691396.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vi\vim编辑器

root用户&#xff08;超级管理员&#xff09; 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中&#xff0c;拥有最大权限的账户名为&#xff1a;root&#xff08;超级管理员&#xff09; root用户拥有最大的系统操作权限&#xff0c;而普通…

手把手教你用 spacy3 训练中文NER

文章目录 模型文件下载训练模型准备数据转化成 doc_bin 格式模型训练配置生成初始配置补全完整配置 开始训练 测试模型参考文献 模型文件下载 https://github.com/explosion/spacy-models/releases?qzh&expandedtrue 简单测试一下ner效果&#xff0c;发现根本不能用 训…

二叉树的非递归遍历(c++)

前序 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/binary-tree-preorder-traversal/description/ 1---2---4---5--…

百度地图API 快速入门

一、创建一个应用 创建成功可以在应用程序中查看到自己的ak密钥 二、基本使用 2.1 显示地图 在static下创建demo1.html &#xff08;将密钥换成自己的就可以显示地图了&#xff09; 示例&#xff1a; <!DOCTYPE html> <html> <head><meta name"…

windows和 Linux 下通过 QProcess 打开ssh 和vnc

文章目录 SSHSSH验证启动SSH一、口令登录二、公钥登录通过Qprocess 启动ssh VNC Viewer简介通过QProcess启动vncViewer SSH Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的**安全网络协议**。它是专为远程登录会话(**甚至可以…

sscanf字符串解析

ATCIPSNTPTIME? //发生的指令 CIPSNTPTIME:Tue Oct 19 15:17:56 2021 //回复的数据 //接受数据缓存 char* recvStrBuf "CIPSNTPTIME:Tue Oct 19 15:17:56 2021"; char* weekStr; char* monthStr; int day,hour,minute,second,year; sscanf(recvStrBuf,""…

【计算机网络】计算机网络概述、计算机网络性能指标 习题1

0 1. 计算机网络可被理解为( )。 A.执行计算机数据处理的软件模块 B. 由自治的计算机互连起来的集合体 C.多个处理器通过共享内存实现的紧耦合系统 D. 用于共同完成一项任务的分布式系统 0 2.计算机网络最基本的功能是( )。 A.数据通信 B. 资源共享 C. 分布式处理 D. 信息综合…

保健品小程序商城线上经营的作用是什么

保健品涵盖酒水、醋、食品等多个类型&#xff0c;无论厂商还是经销商&#xff0c;手里的品牌和数量都比较多&#xff0c;由于特殊性&#xff0c;商家经营时需要找到目标客户&#xff0c;而市场中虽然有大量客户&#xff0c;但商家实际想要触达却并不容易。 渠道多样化&#xf…

情感感知OCR:整合深度学习技术提升文字识别系统的情感理解能力

摘要&#xff1a;随着深度学习技术的发展&#xff0c;文字识别&#xff08;OCR&#xff09;系统在识别准确率和速度上取得了长足的进步。然而&#xff0c;在处理文本时&#xff0c;仅仅依靠字符和词语的识别并不足以满足用户对信息的全面理解需求。本文提出了一种新颖的方法&am…

C++_红黑树的学习

1. 红黑树的概念 红黑树 &#xff0c;是一种 二叉搜索树 &#xff0c;但 在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是 Red 或 Black 。 通过对 任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍 &…

文本检测模型 DBNet 一种基于分割算法的模型 对每个像素点进行自适应二值化,并将二值化过程与网络训练相结合 可微分二值化模块 概率图

文本检测模型 DBNet DBNet文本检测模型是一种基于分割算法的模型,其优化之处在于对每个像素点进行自适应二值化,并将二值化过程与网络训练相结合。 传统的文本检测方法通常将二值化作为一个后处理步骤,与网络训练分开进行。而DBNet则提出了一种可微分的二值化方法,即将文…

Docker需要代理下载镜像

systemctl status docker查看docker的状态和配置文件是/usr/lib/systemd/system/docker.service vi /usr/lib/systemd/system/docker.service&#xff0c; 增加如下配置项 [Service] Environment"HTTP_PROXYhttp://proxy.example.com:8080" "HTTPS_PROXYhttp:…