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文件夹,然后启用插…...

npm无法安装node-sass 的问题
安装 node-sass 的问题呈现:4.9.0版本无法下载 Downloading binary from https://github.com/sass/node-sass/releases/download/v4.9.0/win32-x64-72_binding.node Cannot download "https://github.com/sass/node-sass/releases/download/v4.9.0/win32-x64-…...

springboot 引入第三方bean
如何进行第三方bean的定义 参数进行自动装配...

安装Nginx
如果没有gcc环境,需要安装gcc yum install gcc-c安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel工作目录 mkdir /opt/nginx && cd /opt/nginx下载安装包 wget http://nginx.org/download/nginx-1.32.1.tar.gz解压安装包…...

爬虫工具you-get
you-get是一个简单易上手的爬虫小工具,可以从网络中爬取多媒体信息,包括图片、音频和视频。you-get的github项目地址为:https://github.com/soimort/you-get 一、安装 以下为相关依赖,需要分别安装: Python 3 (必须…...

hal_stm32_RTC函数
1设置当前时间: 调用 HAL_RTC_SetTime 来设置小时、分钟、秒和亚秒。 调用 HAL_RTC_SetDate 来设置年、月、日和星期。 HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format); HAL_StatusTypeDef HAL_RTC_SetDat…...

【大数据·Hadoop】从词频统计由浅入深介绍MapReduce分布式计算的设计思想和原理
一、引入:词频统计问题 假如我们有一亿份文档,需要统计这一亿份文档的词频。我们会怎么做,有以下思路 使用单台PC执行:能不能存的下不说,串行计算,一份一份文档读,然后进行词频统计࿰…...

win10建立共享文件夹和ipad共享文件
win10端设置 查看自己的局域网IP 在任意地方新建一个文件夹 打开文件夹的属性,点到共享的地方 点击高级共享 然后点击应用,确认 再回到之前哪个地方,点击共享 把Everyone的权限改为读取/写入 最后点击共享就欧克了 失败的可能原因 ipad端设置 然后回出现一个要输入用户名和…...

手机在网状态多方面重要性
手机在网状态的重要性体现在多个方面,它是现代社会中人们保持联系、获取信息以及进行日常活动不可或缺的一部分。以下是一些关于手机在网状态重要性的详细解释: 通信联系: 手机是在现代社会中进行通信联系的主要工具。当手机处于在网状态时&…...

Multitouch for Mac:手势自定义,提升工作效率
Multitouch for Mac作为一款触控板手势增强软件,其核心功能在于手势的自定义和与Mac系统的深度整合。通过Multitouch,用户可以轻松设置各种手势,如三指轻点、四指左右滑动等,来执行常见的任务,如打开应用、切换窗口、滚…...

IDEA创建springboot项目时不能选择java 8或者java 11等等版本的问题,解决方案
文章目录 1. Project JDK 和 Java 的区别2. 没有 java 8 或 java 11 等版本2.1 方案一2.2 方案二2.3 方案三 1. Project JDK 和 Java 的区别 我们在利用 idea 创建 spring boot 项目时,会有以上两个选项,这两个选项有什么区别? 答ÿ…...