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.xdnf.cn/news/1420109.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

vue2和vue3区别: 探索关键差异

vue2和vue3区别&#xff1a; 探索关键差异 Vue.js 作为流行的前端框架&#xff0c;其版本 3 带来了许多令人兴奋的改进和新功能。虽然 Vue 3 保持了与 Vue 2 的相似性&#xff0c;但也存在一些关键差异需要开发者注意。本文将通过表格形式&#xff0c;清晰地展现 Vue 2 和 Vue …

BGP基础

1.BGP概述 &#xff08;1&#xff09;AS IANA&#xff08;Internet Assigned Numbers Authority&#xff0c;因特网地址分配组织&#xff09;&#xff1a;IAB&#xff08;Internet Architecture Board&#xff0c;因特网体系委员会&#xff09;的下设组织。IANA授权NIC&#x…

HTTPS对于网站到底价值几何?

现在HTTPS基本上已经是网站的标配了&#xff0c;很少会遇到单纯使用HTTP的网站。但是十年前这还是另一番景象&#xff0c;当时只有几家大型互联网公司的网站会使用HTTPS&#xff0c;大部分使用的都还是简单的HTTP&#xff0c;这一切是怎么发生的呢&#xff1f; 为什么要把网站…

前端小程序调用 getLocation 实现地图位置功能,通过 纬度:latitude 经度: longitude 获取当前位置

1、首先登录一下 腾讯的位置服务 有账号就登录没账号就注册&#xff0c; 点击右上角的控制台点击左侧的应用管理 ---> 我的应用 ---->> 创建应用 1、创建应用 2、列表就会显示我们刚刚创建好的 key 3、点击添加 key 4、按照要求填写信息 我们用的是小程序 所以选择…

CentOS 8.5 安装配置 squid 6.9 代理服务器 Windows10 系统设置http代理 详细教程

1 下载地址: 官网下载 2 通过xftp等方式上传到服务器 #查看环境 [rootlocalhost ~]# cat /etc/redhat-release CentOS Stream release 8 [rootlocalhost ~]# uname -a Linux localhost.localdomain 4.18.0-552.el8.x86_64 #1 SMP Sun Apr 7 19:39:51 UTC 2024 x86_64 x86_6…

初始Java篇(JavaSE基础语法)(8)认识String类(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaSE 简单介绍&#xff1a;在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组或者字符指针&#xff0c;可…

日本率先研发成功6G设备,刺痛了谁?为何日本能率先突破?

日本率先研发成功6G设备&#xff0c;无线数据速率是5G的百倍&#xff0c;这让日本方面兴奋莫名&#xff0c;毕竟日本在科技方面从1990年代以来太缺少突破的创新了&#xff0c;那么日本为何如今在6G技术上能率先突破呢&#xff1f; 日本在1980年代末期达到顶峰&#xff0c;它的科…

Q1季度破壁机家电线上市场现状分析:静音降噪仍是主要购买需求

随着生活水平的提高和居民收入提升&#xff0c;破壁机作为日常食品加工的厨卫小家电逐渐受到关注。 而今年Q1季度&#xff0c;线上破壁机市场发展不如预期。根据鲸参谋数据显示&#xff0c;在线上电商平台&#xff08;京东天猫淘宝&#xff09;销量累计超过211万元&#xff0c…

从离线到实时:无锡锡商银行基于 Apache Doris 的数据仓库演进实践

作者&#xff1a;武基鹏&#xff0c;无锡锡商银行 大数据技术经理 编辑整理&#xff1a;SelectDB 技术团队 导读&#xff1a;为实现数据资产的价值转化以及全面数字化、智能化的风险管理&#xff0c;无锡锡商银行大数据平台经历从 Hive 离线数据仓库到 Apache Doris 实时数据仓…

企业破产重整:从“至暗时刻”到“涅槃重生”

今天我们不谈星辰大海&#xff0c;而是要潜入商业世界的深海区&#xff0c;探索那些濒临绝境的企业是如何借助“破产重整”的神秘力量&#xff0c;实现惊天大逆转的&#xff01; 一、破产重整&#xff0c;到底是个啥&#xff1f; 想象一下&#xff0c;企业像是一位远航的船长…

2024年,Web开发新趋势!

随着我们迈入新的一年&#xff0c;现在正是审视2024年网页开发领域开始流行哪些趋势的绝佳时机。回顾2023年的一系列更新&#xff0c;以下是来年一些热门话题的概览。 自主托管有回归的趋势 近些年&#xff0c;自主托管一直是网页开发者和公司托管其应用程序的默认方式。开发…

Redis-配置文件详解

Redis配置文件详解 units单位 配置大小单位&#xff0c;开头定义基本度量单位&#xff0c;只支持bytes&#xff0c;大小写不敏感。 INCLUDES Redis只有一个配置文件&#xff0c;如果多个人进行开发维护&#xff0c;那么就需要多个这样的配置文件&#xff0c;这时候多个配置 文…

vue3vue3vue3vue3vue3vue3vue3vue3vue3vue3vue3vue3

纯vue3的语法 一.创建&#xff08;基于vite&#xff09; 1.在指定目录下运行 npm create vuelatest 项目名称&#xff1a;英文小写下划线数字回车表示确定是、否 左右切换路由、pina、单元测试、端到端的测试、开启eslint控制代码质量 先选择no&#xff0c;学的时候自己手动…

Milvus Cloud:打造向量数据库的Airtable级体验

向量数据库Milvus Cloud是一种用于处理和存储向量数据的数据库,它通常用于机器学习、图像和视频检索、自然语言处理等领域。要将其升级为类似Airtable那样易用且一体化的系统,需要考虑以下几个关键方面: 1. 用户界面(UI)设计 Airtable之所以用户友好,很大程度上归功于其直…

wordpress主题 7B2 PRO主题5.4.2免授权直接安装

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 WordPress 资讯、资源、社交、商城、圈子、导航等多功能商用主题&#xff1a;B2 PRO 其设计风格专业且时尚&#xff0c;功能十分强大&#xff0c;包括多栏布局、自定义页面、强大的主…

电商购物系统商品数据结构设置

电商购物系统商品数据结构设置 如上图所示 , 该表为商品表关系的示意图 , 气质我们要溥仪一个电视购物系统要用到的知识那就是SPU和SKU 简单来说这两种就是不同的分类方式 , 我们在浏览淘宝等页面的时候也会遇见相同的情况如我们可以进行品牌的筛选 , 也可以进行商品价格的筛选…

AI办公自动化-用kimi批量重命名Word文档

文件夹里面有很多个word文档&#xff0c;标题里面都含有零代码编程&#xff0c;现在想将其替换为AI办公自动化。 在kimichat中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&am…

Idea入门:一分钟创建一个Java工程

一&#xff0c;新建一个Java工程 1&#xff0c;启动Idea后&#xff0c;选择 [New Project] 2&#xff0c;完善工程信息 填写工程名称&#xff0c;根据实际用途取有意义的英文名称选择Java语言&#xff0c;可以看到还支持Kotlin、Javascript等语言选择包管理和项目构建工具Mav…

掌握未来搜索的钥匙:深入解析 Milvus 向量搜索引擎的终极指南!

在大数据时代&#xff0c;向量搜索技术愈发重要。作为一个开源的向量相似性搜索引擎&#xff0c;Milvus 提供了基于向量的相似性搜索功能&#xff0c;广泛应用于机器学习、人工智能等领域。本文将深入介绍 Milvus 的基本概念&#xff0c;包括其介绍、主要作用、使用方法及注意事…

sql注入之bool盲注

目录 盲注步骤 1、进入靶场 2、如下图所示输入&#xff1f;id1‘ 判断此时存在注入点 3、判断列数 ​编辑 4、开始盲注 普通的python脚本 代码思想 结果 二分查找python脚本 二分查找算法思想简介 二分查找与普通查找的主要差距 代码思想 代码 结果​编辑 下面以…