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) 各操作人员的班次安排尽量均衡。
已知问题三中原本每条生产线与相应操作人员对应如下:

问题分析:
问题四为优化问题,考虑使用遗传算法,根据附件三给出的生产线与操作人员信息,无法将生产线与操作人员剥离开而单独讨论某条生产线或者某位操作人员的工作能力指标。因此,在本题中,固定生产线与相应工龄操作人员的搭配,即从理论上固定生产效率。那么,本题仅为优化问题中的排班问题,考虑如下约束条件:
1.每天10条线24小时工作;
2.一位操作人员每天工作8小时;
3.夜班之后必须至少休一天(考虑现实情况添加);
4.各操作人员上五休二,尽量连休;
5.各操作人员班次尽量均匀。
其中,为了生产线的正常运行与操作人员身体健康,1-3为硬性约束,4-5为软约束,以此建立遗传算法优化模型,希望得到合理的排班表。考虑到24小时生产线不间断运营,并且要保证操作人员工龄比例与附件三相同,至少需要5组生产线操作人员,即50人,约定员工与产线有如下对应关系:

遗传算法排班:
使用遗传算法进行排班,首先,需要确定染色体的编码,这里,每条染色体代表一个排班表,染色体中每两位二进制编码表示一种班型,对于一周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('适应值变化曲线(排班一周)');

相关文章:
2024 年“泰迪杯”A 题:生产线的故障自动识别与人员配置--第四题(用遗传算法解决生产线排班问题--matlab代码)
问题背景: 问题四:根据实际情况,现需要扩大生产规模,将生产线每天的运行时间从 8 小时增加 到 24 小时不间断生产,考虑生产线与操作人员的搭配,制定最佳的操作人员排班方案,要求满足以下条件&am…...
资产公物仓管理系统|实现国有资产智能化管理
1、项目背景 资产公物仓管理系统(智仓库DW-S201)是一套成熟系统,依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 项目设计原则 方案对公物仓资…...
实用的 Google Chrome 命令
以下是一些实用的 Google Chrome 命令: chrome://version - 显示 Chrome 浏览器的详细信息,包括版本号、用户代理和命令行参数等。 chrome://flags - 打开 Chrome 实验性功能页面,可以启用或禁用各种实验性功能。请注意,这些功能…...
动态规划算法:⼦数组、⼦串系列(数组中连续的⼀段)
例题一 解法(动态规划): 算法思路: 1. 状态表⽰: 对于线性 dp ,我们可以⽤「经验 题⽬要求」来定义状态表⽰: i. 以某个位置为结尾,巴拉巴拉; ii. 以某个位置…...
2010年认证杯SPSSPRO杯数学建模D题(第一阶段)服务网点的分布全过程文档及程序
2010年认证杯SPSSPRO杯数学建模 D题 服务网点的分布 原题再现: 服务网点、通讯基站的设置,都存在如何设置较少的站点,获得较大效益的问题。通讯基站的覆盖范围一般是圆形的,而消防、快餐、快递服务则受到道路情况和到达时间的限…...
docker-compose 安装ZLMediaKit,ffmpeg、VLC实现推流并播放
1、目录(创建conf文件夹,777权限) 二、docker-compose.yml version: "3.9"services:zlmediakit:image: zlmediakit/zlmediakit:mastercontainer_name: zlmediakitprivileged: true# 指定加载配置# command: /opt/media/bin/MediaS…...
|Python新手小白中级教程|第二十八章:面向对象编程(类定义语法私有属性类的继承与多态)(4)
文章目录 前言一、类定义语法二、私有方法和私有属性1.私有属性2.私有方法 三、类“继承”1.初识继承2.使用super函数调用父类中构造的东西 四、类“多态”1.多态基础2.子类不同形态3.使用isinstance函数与多态结合判断类型 总结 前言 大家好,我是BoBo仔吖…...
vue项目基于WebRTC实现一对一音视频通话
效果 前端代码 <template><div class"flex items-center flex-col text-center p-12 h-screen"><div class"relative h-full mb-4 fBox"><video id"localVideo"></video><video id"remoteVideo">…...
web 基础之 HTTP 请求
web 基础 网上冲浪 就是在互联网(internet)上获取各种信息,进行工作,或者娱乐,他的英文表示surfing the Internet,因 “surfing”d的意思是冲浪,即成为网上冲浪,这是一种形象说法, 也是一个非…...
嵌入式 - GPIO编程简介
An Introduction to GPIO Programming By Jeff Tranter Wednesday, June 12, 2019 编者按:本 2019 年博客系列是 ICS 最受欢迎的系列之一,现已更新(2022 年 12 月),以确保内容仍然准确、相关和有用。 本博客是 Integr…...
8种区块链开发者必须知道的顶级编程语言!
我来问你一个问题:请说出一种技术,它以去中心化、不可篡改和透明性等核心特征席卷了全球。 这个问题的答案是,当然是区块链,它在近些年进入大家的视野并颠覆了工商业,没有任何其他技术能够做到这一点。 预计从2020年…...
十三、Redis哨兵模式--Sentinel
上一篇介绍了Redis中的主从复制。我们知道Redis主从中一般只有主节点对外提供写操作,如果主节点发生故障,为了保证Redis的可用性,这时就要在可用的slave节点中,挑选一个作为主节点。这种切换操作如果是人为的操作,那么…...
[力扣题解]1005. K 次取反后最大化的数组和
题目:1005. K 次取反后最大化的数组和 思路 贪心法; 用绝对值大小排序,自己写一个比较函数, static bool compare(int a, int b) {return abs(a) > abs(b); }注意这样写出来是降序排列; 代码 class Solution {…...
Web UI自动化测试--PO模式
没有PO实现的测试用例的问题: 重用性低:登录功能重复可维护性差:数据和代码混合可读性差:元素定位方法杂乱(id、xpath、css混杂)可读性差:不易识别操作的含义(特别是css和xpath语法)可维护性差:如果某个元素的属性改了,你要更改多次PO(Page Object Model)页面对象模型…...
Python进阶之-反射机制详解
✨前言: 什么是反射? Python中的“反射”是一个编程术语,它指的是程序在运行时能够检查和操作其自身状态的能力,特别是通过名称(通常是字符串)来访问对象的属性、方法和其他组成部分。这种机制允许代码动态…...
day05-面向对象内存原理和数组
day05 面向对象内存原理和数组 我们在之前已经学习过创建对象了,那么在底层中他是如何运行的。 1.对象内存图 1.1 Java 内存分配 Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域…...
从头理解transformer,注意力机制(下)
交叉注意力 交叉注意力里面q和KV生成的数据不一样 自注意力机制就是闷头自学 解码器里面的每一层都会拿着编码器结果进行参考,然后比较相互之间的差异。每做一次注意力计算都需要校准一次 编码器和解码器是可以并行进行训练的 训练过程 好久不见输入到编码器&…...
ORA-609频繁出现在alert.log,如何解决?
ORA-609就alertlog中比较常见的一个报错,虽然并没有太大的影响,但是频繁的出现在alert log也是很让人厌烦的事情,本文介绍如何排查解决ORA-609问题。 1.ORA-609官方定义 could not attach to incoming connection Cause Oracle process cou…...
JVM 类加载机制
JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程。 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的 java.lang.class 对…...
亲测-wordpress文章实时同步发布修改删除多个站点的WP2WP插件
一款将wordpress文章同步到其他WordPress网站的插件,通过这款插件,可以保持不同博客之间文章发布、修改、删除的同步。 安装步骤: 主站和分站都要上传这个插件 1.把插件上传到wp-content\plugins解压出来wp2wp文件夹,然后启用插…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
