【Python】计算最少排班人数(1)

news2024/12/26 0:18:37

需求背景:

某工作24小时需要人员,单个班次为8或9小时,需要根据每小时需要的人数、不同的班次计算最低需要的人数。

每小时需要的人数举例:

班次类型:

问题分析:

1、需要各个时段的人员数大于等于需要的人数

2、为了减少计算量,可以先设置每次时段各个班次的人数不大于时段的所需人数,比如8:00-8:59时段,需要4个人,那覆盖这个时段的每中班次顶多也就4个人

程序设计:

1、采取穷举法计算所有情况,并计算满足需求的方案里,需要人数最少得方案

2、为了减少计算量,先随机一定量的方案(比如100种),求这些方案里最小所需人数(X),穷举时大于X的方案直接跳过不验证

3、根据全天时段里需要人数的最大值,小于该值的方案直接跳过不验证,比如上方截图中,16:00-16:59时段需要人数最多(40人),那么低于40的肯定无法满足需求,直接不验证

部分关键代码及方法:

班次类型设置:
ban_list=[
    '常班1(8:00-17:00)',
    '常班2(10:00-19:00)',
    '常班3(11:00-20:00)',
    '晚班1(12:00-21:00)',
    '晚班2(14:00-23:00)',
    '小夜1(16:00-01:00)',
    '小夜2(18:00-03:00)',
    '大夜1(20:00-05:00)',
    '小夜2(23:00-08:00)',
    '早班(06:00-15:00)',
]
ban_hour=[
    [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1],
    [1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1],
    [1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1],
    [1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0],
]
验证排班是否满足需求:
def check(need,do):
    #小时所需人数(24长度的list)+实际人数(24长度的list)
    if_can=1
    for i in range(len(need)):
        if do[i]<need[i]:
            if_can=0
    return if_can
随机方案选取:
def ran_choice(l,cnt):
    ran_l=[]
    x=[]
    for j in range(cnt):
        for i in range(len(l)):
            x.append(random.randint(a=0,b=l[i]))
        ran_l.append(x)
        x=[]
    return ran_l

ran=hc_random.ran_choice(ban_type_max,int(max_hc)*10)
记录满足需求的方案
def sele(hc_list,need,banci):
    hc_list_yes=[]
    if_enough=0
    for i in range(len(hc_list)):
        does=do_hc(banci,hc_list[i])
        if_enough=check(need, does)
        if i%1000000==0:
            print(i)
        if if_enough==1:
            hc_list_yes.append(hc_list[i])
        if_enough = 0
    return hc_list_yes
每个班次最大人数下,所需人力
def ban_max(need,l):
    ban_cnt=0
    ban_maxhc=[]
    for i in range(len(l)):
        for j in range(len(l[i])):
            if l[i][j]!=0:
                ban_cnt=max(ban_cnt,need[j]/l[i][j])
        ban_maxhc.append(ban_cnt)
        ban_cnt=0
    return ban_maxhc
所有方案列举记录,但不记录高于随机选取方案人数的方案和低于最高时段需求人数的方案:
def all_(max_hc,hour_sel,cur_y_idx=0,l_tmp=[],l_res=[]):
    ban_t=len(max_hc)-1
    for x_idx in range(int(max_hc[cur_y_idx])+1):
        l_tmp.append(x_idx)
        if cur_y_idx == ban_t:
            if  sum(l_tmp)>=int(hour_sel[0]) and min(l_tmp)>=int(hour_sel[1]) and sum(l_tmp)<=int(hour_sel[2]):
                l_res.append([*l_tmp])
        else:
            all_(max_hc,hour_sel, cur_y_idx+1, l_tmp, l_res)
        l_tmp.pop()
    return l_res

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

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

相关文章

CV中的Attention机制:SENet

paper: Squeeze-and-Excitation Networks paper link:https://arxiv.org/pdf/1709.01507.pdf repo link:GitHub - hujie-frank/SENet: Squeeze-and-Excitation Networks 摘要&#xff1a; 卷积神经网络&#xff08;CNNs&#xff09;的核心构建块是卷积算子&#xff0c;它使…

微信小程序map视野发生改变时切换定位点

<!--地图--> <view><map id"myMap" style"width: 100%; height: 300px;" latitude"{{latitude}}" longitude"{{longitude}}"scale"{{scale}}" markers"{{markers}}" controls"{{controls}}&q…

OpenCV-Python:图像平滑操作

目录 图像平滑基础 本文目标 2D卷积 图像模糊&#xff08;图像平滑&#xff09; 平均模糊 高斯模糊 中值模糊 双边滤波 图像平滑基础 在尽量保留图像原有信息的情况下&#xff0c;过滤掉图像内部的噪声&#xff0c;这一过程称为对图像的平滑处理&#xff0c;所得的图像…

排序算法之三:希尔排序

希尔排序基本思想 希尔排序法又称缩小增量法 希尔排序法的基本思想是&#xff1a;先选定一个整数&#xff0c;把待排序文件中所有记录分成个组&#xff0c;所有距离为的记录分在同一组内&#xff0c;并对每一组内的记录进行排序。然后&#xff0c;取&#xff0c;重复上述分组…

ThingsBoard 前端项目轮播图部件开发

前言 ThingsBoard 是目前 Github 上最流行的开源物联网平台&#xff08;14.6k Star&#xff09;&#xff0c;可以实现物联网项目的快速开发、管理和扩展, 是中小微企业物联网平台的不二之选。 本文介绍如何在 ThingsBoard 前端项目中开发轮播图部件。 产品需求 最近接到产品…

C++并查集

1.并查集概念 1.1.并查集定义 在一些应用问题中&#xff0c;需要&#xff1a; 将 n 个不同的元素划分成一些不相交的集合开始时&#xff0c;每个元素自成成为一个集合然后按一定的规律&#xff0c;将归于同一组元素的集合合并期间需要反复用到查询某个元素归属于那个集合的算…

python利用requests库进行接口测试的方法详解

前言 之前介绍了接口测试中需要关注得测试点&#xff0c;现在我们来看看如何进行接口测试&#xff0c;现在接口测试工具有很多种&#xff0c;例如&#xff1a;postman,soapui,jemter等等&#xff0c;对于简单接口而言&#xff0c;或者我们只想调试一下&#xff0c;使用工具是非…

迈入数据结构殿堂——时间复杂度和空间复杂度

目录 一&#xff0c;算法效率 1.如何衡量一个算法的好坏&#xff1f; 2.算法效率 二&#xff0c;时间复杂度 1.时间复杂度的概念 2.大O的渐进表示法 3.推导大O的渐进表示法 4.常见时间复杂度举例 三&#xff0c;空间复杂度 一&#xff0c;算法效率 数据结构和算法是密…

【产品】Axure的基本使用(二)

文章目录 一、元件基本介绍1.1 概述1.2 元件操作1.3 热区的使用 二、表单型元件的使用2.1 文本框2.2 文本域2.3 下拉列表2.4 列表框2.5 单选按钮2.6 复选框2.7 菜单与表格元件的使用 三、实例3.1 登录2.2 个人简历 一、元件基本介绍 1.1 概述 在Axure RP中&#xff0c;元件是…

如何使用透明显示屏

透明显示屏的使用主要取决于具体的应用场景和需求。以下是一些常见的使用透明显示屏的方法&#xff1a; 商业展示&#xff1a;透明显示屏可以作为商品展示柜&#xff0c;通过高透明度、高分辨率的屏幕展示商品细节&#xff0c;吸引顾客的注意力。同时&#xff0c;透明显示屏还可…

人工智能基本常识:让深度学习技术更加人性化

近年来&#xff0c;人工智能技术日臻成熟。现在&#xff0c;许多产品和服务都依靠人工智能技术实现自动化和智能化&#xff0c;因此它与我们的日常生活息息相关。无论是为我们带来各种便利的家用设备&#xff0c;还是我们一直在使用的产品制造方式&#xff0c;人工智能的影响无…

【算法题】智能成绩表(js)

总分相同按名字字典顺序。 解法&#xff1a; function solution(lines) {const [personNum, subjectNum] lines[0].split(" ").map((item) > parseInt(item));const subjects lines[1].split(" ");const classMates [];let results [];for (let i…

C++笔记:动态内存管理

文章目录 语言层面的内存划分C语言动态内存管理的缺陷new 和 delete 的使用了解语法new 和 delete 操作内置类型new 和 delete 操作自定义类型 new 和 delete 的细节探究new 和 delete 的底层探究operator new 和 operator new[]operator delete 和 operator delete[] 显式调用…

2023快速上手新红利项目:短剧分销推广CPS

短剧分销推广CPS是一个新红利项目&#xff0c;对于新手小白来说也可以快速上手。 以下是一些建议&#xff0c;帮助新手小白更好地进行短剧分销推广CPS&#xff1a; 学习基础知识&#xff1a;了解短剧的基本概念、制作流程和推广方式。了解短剧的市场需求和受众群体&#xff0c…

wpf devexpress如何使用AccordionControl

添加一个数据模型 AccordionControl可以被束缚到任何实现IEnumerable接口的对象或者它的派生类&#xff08;例如IList,ICollection&#xff09; 如下代码例子示范了一个简单的数据模型使用&#xff1a; using System.Collections.Generic;namespace DxAccordionGettingStart…

zabbix精简模板

一、监控项目介绍 linux自带得监控项目比较多&#xff0c;也不计较杂&#xff0c;很多监控项目用不到。所以这里要做一个比较精简得监控模版 二、监控模板克隆 1.搜索原模板 2.克隆模板 全克隆模板&#xff0c;这样就和原来原模板没有联系了&#xff0c;操作也不会影响原模…

软件测试基础知识+面试总结(超详细整理)

一、什么是软件&#xff1f; 软件是计算机系统中的程序和相关文件或文档的总称。 二、什么是软件测试&#xff1f; 说法一&#xff1a;使用人工或自动的手段来运行或测量软件系统的过程&#xff0c;以检验软件系统是否满足规定的要求&#xff0c;并找出与预期结果之间的差异…

UI设计中的肌理插画是什么样的?

肌理插画本质也和扁平插画差不多&#xff0c;相较扁平插画&#xff0c;肌理插画的层次感、细节更多&#xff0c;也会更立体生动。 肌理插画风格没有描边线&#xff0c;画面轻快&#xff0c;通过色块的明暗来区分每个元素&#xff0c;有点像色彩版的素描&#xff0c;但更简单&a…

一个人全干!之后台管理中的搜索区域的展开收缩组件。

后台管理系统中大多数都有列表的搜索&#xff0c;那么用户的需求又需要必要时收缩搜索区域&#xff0c;需要时再展开。 而且怪的是他还需要一些部分不可收缩&#xff0c;不需要的地方才收缩。使用v-if来解决吧又不咋美观&#xff0c;我们还需要一个简单的动画效果。我们先写一…