python如何利用算法解决业务上的【分单问题】
分单是很多企业日常工作中非常典型的一项内容,它非常复杂,但同时又极为重要,如何合理的分单是企业管理中一个很重要的课题。
之所以说分单很复杂,是因为影响单据该分给谁,分多少量这个事儿本身就有太多的影响因子;一旦管理者在分单的公平性上出现大的问题,厚此薄彼了,往大了讲,员工的做事积极性有可能都会被挫伤。
简单列举几类:
1、员工的技能矩阵;
2、员工的出勤数据;
3、各种类型单据的SPT(标准作业时间);
4、员工手中已有的单据量;
5、不同类型单据量的分布情况;
6、某种类型的单据不够分时,该优先分给谁;
7、每次单据的来件数量、来件的类型高度不确定;
8、当某种类型给某些员工少分了一些数量,如何在另外一些类型上尽量多分他一些,使得每个人分到的总量尽可能均衡;
9、单据的黑白名单策略(某些类型,某些申请人提的优先不分给哪些人,优先分给哪些人);
10、某个单据被被驳回过,如何在第二次分单时优先分给当初的处理人;
11、某些人可以同时处理两个环节,如何保证他不处理同一个单据的前后两个环节,避免内控管理失效;
12、多个领单小组共享某些流程端口,如何区分单据优先分给哪个组;
13、如何保证每个人能处理能力范围内的尽可能多的类型的单据,以确保员工的能力得到充分锻炼;
……
您瞅瞅,我觉没撒谎,这可一点都不简单。偏偏在小爬我的实际业务中,就被要求解决这么头疼的问题。但是你以为小爬我这就怕了?NO NO NO,需求越有挑战,小爬越高兴。
先说说如何解决每个人分配的单据量不均衡的问题,其中一种思路:我们把总单据量基于业务类型分成N组,然后基于每个员工能处理的业务类型和当天的出勤情况,找到能处理每种业务类型的人员列表,假设是M个人。我们可以利用算法,每次分单前将人员列表的顺序随机打乱,那么每次分单时,每个人都有一定概率出现在队列末尾,也就是单据不够分给他的情况,最终只要我们把N组类型的单据都分完时,大家的概率总体上是均衡的,不过概率的事儿没人能说它绝对公平。
下面这段代码,就可以完美地打乱某个列表的顺序,让它彻底重排:
import random
def shuffle_list(lst):
'''将列表的顺序随机打乱,得到一个新的列表'''
new_lst = lst[:] # 复制原列表,否则会影响原列表
random.shuffle(new_lst) # 打乱顺序
return new_lst
可是它依然不是绝对公平的,没法保证每个人分到的单据量尽可能一样多,因为它只是在模拟扔色子,寄希望于概率均匀分布。如何保证大家的数量相对公平呢?
我们不妨利用python的字典,存储每个人(key)已经分到的单据号的列表合集,把列表作为字典的Value。当我们在对某种类型的N个单据分给M个人时,就好比是发扑克牌,但是又不能简单去按顺序发牌,而是看谁手上的牌少,就优先把剩余的牌发给它,这样手上牌少的人,总是能被照顾,直到最后大家手上发到的牌数接近。如何知道这个特殊的字典中,到底哪个Key的牌最少(列表的长度最短)呢?您不妨参考下下面的算法。
def get_Dic_shortest_key(keyList,my_dict):
'''根据输入的字典,字典的键对应的值都是一个列表,如果哪个键对应的列表的长度最短,则返回该键'''
shortest_key = None
shortest_length = float('inf')
for key, value in my_dict.items():
if key in keyList and len(value) < shortest_length:
shortest_key = key
shortest_length = len(value)
# Return the key with the shortest list value
return shortest_key
有了上面的算法,我们也就解决了每次的发牌优先分给谁的问题,怎么把牌发完到对的人手上,就不是个问题了,代码示例如下:
def seperate_list(lst,personList, personFormNumber_dic):
"""
将一个列表拆分成n个子列表组成的二维列表,要求每个子列表元素的长度尽可能接近
:param lst: 待分配的单据号列表
:param personList: 可以参与此次分单的人员列表
:param personFormNumber_dic:字典结构,每个人key手上已有的单据列表value
:return: personFormNumber_dic 返回这个字典(每个人手上的单据清单)
"""
m = len(lst)
for i in range(m): # 从后往前遍历列表
targetPerson=""
targetPerson=get_Dic_shortest_key(personList,personFormNumber_dic)
for random_element in lst:
personFormNumber_dic[targetPerson].append(random_element)
lst.remove(random_element)
break
return personFormNumber_dic
希望这些对现实业务的思考和代码实现,能对您的工作有所启发。不管咋说,活到老,学到老。拒绝躺平,一起卷起来!
快来关注本公众号 获取更多爬虫、数据分析的知识!

python如何利用算法解决业务上的【分单问题】的更多相关文章
- 解决resteasy上传表单文件名乱码
Dubbo在2.6版本后合并了dubbox的resteasy代码后,可以支持rest风格的接口发布,但是在使用form表单上传文件的时候,获取的文件名称是乱码. 下面通过对源码分析一下原因,并提供一种 ...
- JAVAEE——BOS物流项目09:业务受理需求分析、创建表、实现自动分单、数据表格编辑功能使用方法和工作单快速录入
1 学习计划 1.业务受理需求分析 n 业务通知单 n 工单 n 工作单 2.创建业务受理环节的数据表 n 业务通知单 n 工单 n 工作单 3.实现业务受理自动分单 n 在CRM服务端扩展方法根据手 ...
- 完整数据分析流程:Python中的Pandas如何解决业务问题
开篇 作为万金油式的胶水语言,Python几乎无所不能,在数据科学领域的作用更是不可取代.数据分析硬实力中,Python是一个非常值得投入学习的工具. 这其中,数据分析师用得最多的模块非Pandas莫 ...
- 如何解决Python脚本在Linux和Windows上的格式问题
python是一种对缩进有严格要求的语言, Python脚本可以使用非常多的工具进行编写,笔者在Linux系统使用JEdit进行Python脚本编写,由于在Linux编写脚本比较痛苦,比如想一眼看出相 ...
- xsank的快餐 » Python simhash算法解决字符串相似问题
xsank的快餐 » Python simhash算法解决字符串相似问题 Python simhash算法解决字符串相似问题
- Python开发——利用正则表达式实现计算器算法
Python开发--利用正则表达式实现计算器算法 (1)不使用eval()等系统自带的计算方法 (2)实现四则混合运算.括号优先级解析 思路: 1.字符串预处理,将所有空格去除 2.判断是否存在括号运 ...
- SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题——Jason niu
%SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题——Jason niu X = [16.4700 96.1000 16.4700 94.4400 20.0900 92.5400 2 ...
- 史上最详细的C语言和Python的插入排序算法
史上最详细的C语言和Python的插入排序算法插入排序原理:所谓插入排序,就像我们在打牌(斗地主)时,整理我们自己手中自己的牌一样,就像是2,1,3,9,J,K,5,4,这四张牌.我们要把它其中的几张 ...
- Python数据结构与算法--算法分析
在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...
- 02_利用numpy解决线性回归问题
02_利用numpy解决线性回归问题 目录 一.引言 二.线性回归简单介绍 2.1 线性回归三要素 2.2 损失函数 2.3 梯度下降 三.解决线性回归问题的五个步骤 四.利用Numpy实战解决线性回 ...
随机推荐
- BootstrapBlazor + FreeSql ORM 实战 Table 表格组件维护多表数据 - OneToOne
OneToOne 垂直扩展表字段是很常见的方法, 主表存商品资料, 分表存每个客户对应商品的备注和个性化的价格等等, 本文使用Blazor一步步实现这个简单的需求. 1. 基于实战 10分钟编写数据库 ...
- Docke 使用与详解1 --Tomcat
一.Docker容器案例使用 --Tomcat安装与使用 1.Tomcat 安装 --docker tomcat镜像官网 1>使用docker pull tomcat拉取镜像,默认拉取最新版本: ...
- [ACM]Uva839-Not So Mobile(树状天平)
在输入过程中同时进行数据处理,代码简洁,效率较高 #include<iostream> #include<cstdio> using namespace std; bool s ...
- vim使用教程(最简单最全面的教程)
本教程是vimtutor的原版内容.这是我读过最简单最全面的vim教程. 偶仅仅是优秀内容的搬运工,放在此处便于查阅,方便学习,版权归原作者所有. 注意:每一节的命令操作将会更改本文.推荐您复制本文的 ...
- IIS 部署.NET CORE 项目 出现 HTTP 错误 500.19 - Internal Server Error
当出现这个错误时是因为服务器上没有.NET CORE对应的SDK以及运行时文件,我的.NET CORE版本是2.2,下载的就是2.2对应的文件. 附上.NET CORE2.2版本的下载链接 下载 .N ...
- SpringBoot 缓存注解的使用
最近比较忙,没时间更新了.上一篇文章我说了如何使用Redis做缓存,文末我稍微提到了SpringBoot对缓存的支持.本篇文章就针对SpringBoot说一下如何使用. 1.SpringBoot对缓存 ...
- Smt贴片换料口诀及注意事项
Smt贴片换料口诀及注意事项 一.Smt贴片送料口诀 1.若飞达没料,机器报警,操作员根据机器的提示消警 2.取出缺失飞达料,把用完的料盘取下 3.把备好的物料与换下来的料盘核对,确认无误装飞达 4. ...
- 随手记:linux校准时间
记录一下校准时间操作的执行步骤: 首先使用 date 查看当前时间是否准确 校准时间命令 ntpdate cn.pool.ntp.org 如果没有权限: sudo -i 会出现输入密码,直接输入密码即 ...
- 在Vue中使用键盘事件,回调函数被执行两次
暂时先不考虑v-for的key,查看下面的代码 <template> <div> <form @submit.prevent="addTask"> ...
- OpenAI-GPT
操作系统:CentOS 7.6 安装依赖软件 进入 root 账号: sudo -i 安装部署 ChatGPT 必备的软件,并且启动 nginx : yum install git nginx -y ...