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

  希望这些对现实业务的思考和代码实现,能对您的工作有所启发。不管咋说,活到老,学到老。拒绝躺平,一起卷起来!

快来关注本公众号 获取更多爬虫、数据分析的知识!

本文转载于网络 如有侵权请联系删除

相关文章

  • 把工作讲给家人听

    最近看了一本书《奈飞文化手册》,里面有一个故事,让我很受触动。作者把自己一个工作的规划分享给了他的母亲。结果他母亲听完之后,想了一会儿说:听起来糟糕透了。然后作者开始反思自己的表达方式,还有就是在将自己的工作目标传递给下属的过程中所用到的一些技巧和反馈。在之前的工作当中,我觉得只要把事情说清楚就可以了,关键的信息都知道具体的人就OK工作就已经合格了。但是,跟这些职业人来比较的话,其实差的还很多有许多地方细节需要提升思维也需要改变。职场中的沟通必不可少,虽然我处于行业对沟通能力要求在招聘需求中,排行并不是很高。只要不是沟通特别困难的人在求职过程中,就不会太强调这个能力,但是当我看完《奈飞文化手册》之后,给我的感触就是沟通能力是一个人整体职业能力的重要支撑。因为一个人的个人工作实力是有限的。如果想增加整体的工作产出,只能通过增加自身影响力去影响团队,获取更高的效率。这里面就涉及到沟通能力,当一个人可以通过自己的沟通能力去影响团队中的其他人是团队的整体效能提升那么他已然,就成为了这个团队中的实际领导者。《奈飞文化手册》这本书里提到了一个非常有意思的制度。奈飞公司允许员工在任何时候提出休假申请

  • IBASE category 01 component hierarchy

    CreatedbyJerryWangonSep17,2014CRM系统有如下hierarchy的IBASE:使用下列report打印所有的component:*&---------------------------------------------------------------------**&ReportZIBASE_READ_STRUCTURE*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*REPORTzibase_read_structure.PARAMETERS:idTYPEibib-ibaseOBLIGATORYDEFAULT'112455'.DATA:ls_headerTYPEibap_head1,lt_struc_tabTYPEibap_s

  • Zookeeper系列(3) —— Zookeeper 客户端与服务的常用命令

    Zookeeper的常用操作命令首先进入到Zookeeper的安装目录#首先进入到bin目录下 cd/usr/local/apache-zookeeper-3.6.1-bin/bin #查看bin目录下的文件 ll复制然后我们可以看见以下结果通过查看bin目录下文件,我们不难推测出Zookeeper有一个服务端和一个客户端。一想到客户端与服务端,我们就应该想到,先有服务端,然后使用客户端Zookeeper服务端的命令#启动Zookeeper服务端 ./zkServer.shstart #关闭Zookeeper服务端 ./zkServer.shstop #重启Zookeeper服务端 ./zkServer.shrestart #查看Zookeeper服务端版本 ./zkServer.shversion #查看Zookeeper服务器状态 ./zkServer.shstatus #使用指定文件夹下的配置文件启动zookeeper服务器 ./zkServer.sh--config/usr/local/apache-zookeeper-3.6.1-bin/confstart复制Zookeepe

  • 一文带你轻松搞懂事务隔离级别(图文详解)

    本文由SnailClimb和读者BugSpeak共同完成。事务隔离级别(图文详解)什么是事务?事务是逻辑上的一组操作,要么都执行,要么都不执行。事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。事物的特性(ACID)•原子性:事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;•一致性:执行事务前后,数据保持一致;•隔离性:并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的;•持久性:一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。并发事务带来的问题在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。•脏读(Dirtyr

  • 手写vue框架(一)

    不是所有事都能得偿所愿,但这未必是坏事……哈喽,各位宝宝周末过得愉快吗? 定义一个类 —vue用法如下letapp=newVue({ el:'#app', data:{ msg:'helloworld', deep:{ a:1, b:2 } } })复制那么我们首先要创建一个vue类:classVue{ constructor(options){ constvm=this; vm.$options=options; //... } }复制接下来进行数据劫持:classVue{ constructor(options){ constvm=this; vm.$options=options; //数据劫持 letdata=vm._data=options.data; observer(data); } }复制observer主要是对传入的数据进行过滤,看看是否需要进行劫持functionobserver(value){ if(!value||typeofvalue!=='object'){ return; } returnnew

  • matlab | 图像增强-模板处理

    图像加减对图片的像素值进行加减,在图片相加的时候为避免出现大于255的值,可以对两者图片进行加权处理。图片相减的时候,差值小于0时可以直接取0,当然也可以取绝对值。◆◆◆◆◆图片模糊常见的有均值滤波,加权滤波和中值滤波。模板大小会直接影响处理效果,对于图片边缘采取不处理或者新的模板进行处理。举例,中值滤波,边缘不处理functionnew_img=mid_smooth(img_path,template)%MEAN_SMOOTH此处显示有关此函数的摘要%此处显示详细说明img=imread(img_path);radius=floor(template/2);shape=size(img);new_img=img; fortunnel=1:ndims(img)forheight=radius+1:shape(1)-radiusforwidth=radius+1:shape(2)-radiusnew_img(height,width,tunnel)=0;pixel=zeros(template,template);fori=(-radius):radiusforj=(-radius):r

  • 【J2SE快速进阶】——Java中的equals和==的区别

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/43313353     我们都知道,Java中数据类型大体上可分为两类:基本数据类型和引用数据类型。equals和==都是用来比较数据与数据是否“相等”。基本数据类型的比较    基本数据类型之间的比较用“==”,用来判断它们的值是否相等。    示例代码:publicclassTest{ publicstaticvoidmain(String[]args){ inti1=9; inti2=9; booleanb1=true; booleanb2=true; charc1='c'; charc2='c'; System.out.println(i1==i2);//输出为true System.out.println(b1==b2);//输出为true System.out.println(c1==c2);//输出为true }

  • Jmeter(九)_获取JDBC响应做接口关联

    在之前的文章-参数关联中,留个一个小尾巴,这里补充一下http://www.cnblogs.com/Zfc-Cjk/p/8295495.html1:从sql表中将需要取的数据查出来2:我们需要把这个id为4451的数据从sql里面取出来,传到下一个sql里面,执行删除3:写一个接口的传参有些不同,变成了var_id_1。var_id是之前的sql中定义的变量,_1是取第一行数据。这个_1必填4:我们看一下执行结果。此处我们已经将4451这个id取出来,传入了下一个接口,并执行了删除操作你还在为找不到可练习的接口而烦恼吗?现在加入龙渊阁,我们手把手教你搭建属于自己的接口测试环境!

  • Kafka KRaft模式探索

    1.概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。其核心组件包含Producer、Broker、Consumer,以及依赖的Zookeeper集群。其中Zookeeper集群是Kafka用来负责集群元数据的管理、控制器的选举等。 2.内容 目前,Kafka在使用的过程当中,会出现一些问题。由于重度依赖Zookeeper集群,当Zookeeper集群性能发生抖动时,Kafka的性能也会收到很大的影响。因此,在Kafka发展的过程当中,为了解决这个问题,提供KRaft模式,来取消Kafka对Zookeeper的依赖。      上图是在未使用KRaft模式时,Kafka的一个架构,在做元数据管理、Controller的选举等都需要依赖Zookeeper集群。      在Kafka引入KRaft新内部功能后,对Zookeeper的依赖将会被取消。在KRaft中,一部分broker被指定为控制器,这些控制器提供过去由ZooKeeper提供的共识服务。所有集群元数据都将存储在Ka

  • 微服务的链路追踪

    1微服务架构下的问题 在大型系统的微服务化构建中,一个系统会被拆分成许多模块。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,可能是由不同团队开发、可能使用不同的编程语言来实现、可能部署在几千台服务器上,横跨多个不同的数据中心,也就意味着这种架构形式也会存在一些问题: 1️⃣如何快速的发现问题? 2️⃣如何判断故障影响范围? 3️⃣如何梳理服务依赖以及依赖的合理性? 4️⃣如何分析链路性能问题以及实时容量规划? 分布式链路追踪(DistributedTracing),就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达那台机器上、每个服务节点的请求状态等等。 目前业界比较流行的链路追踪系统如:Twitter的Zipkin,阿里的鹰眼,美团的Mtrace,大众点评的cat等,大部分都是基于Google发表的Dapper。Dapper阐述了分布式系统,特别是微服务架构中链路追踪的概念、数据展示、

  • spring validator参数校验

    参数校验 JavaAPI规范(JSR303)定义了Bean校验的标准validation-api,但没有提供实现。hibernatevalidation是对这个规范的实现,并增加了校验注解如@Email、@Length等。 SpringValidation是对hibernatevalidation的二次封装,用于支持springmvc参数自动校验。接下来,我们以spring-boot项目为例,介绍SpringValidation的使用。 引入依赖 如果spring-boot版本小于2.3.x,spring-boot-starter-web会自动传入hibernate-validator依赖。如果spring-boot版本大于2.3.x,则需要手动引入依赖: <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.1.Final</version> <

  • opencv笔记(二十二)——模板匹配 template matching

    模板匹配就是在给定一幅图像和一幅模板(一般模板比图像的尺寸小很多)的情况下,找到这个图像中最最相似于模板的位置,比如 第一幅是给定的图片,第二幅是模板,第三幅就是搜索到的匹配的位置。 这个搜索的过程,我没有在源码中求索,但是根据tutorial,应该是采用slidingwindow的方法,利用滑动的窗口,逐像素进行匹配。这个逐像素的意思,就是锚定某个像素之后,在这个像素的右边和下方,以template的宽度和高度的距离的范围内,进行模板与图像的相似度计算。 这种方法和行人检测中常用的方法类似。就是slidingwindow。   计算匹配度,即计算相似度的方法一般有以下六种: method=CV_TM_SQDIFF method=CV_TM_SQDIFF_NORMED method=CV_TM_CCORR method=CV_TM_CCORR_NORMED method=CV_TM_CCOEFF where method=CV_TM_CCOEFF_NORMED  第一种和第二种,是求得的结果越

  • 2019.6.24-2019.6.28(实训数据结构)3.数组编码求解问题

    2019.6.24-2019.6.28(实训数据结构)书籍:《数据结构项目实训教程》赵君喆,戴文华 5.5数组与广义表项目实训拓展 设有一个数组A:array[0..N-1],存放的元素为0~N-1(1<N<=10)之间的整数,且A[i]!=A[j],i!=j。 例如:当N=6时,有A=(4,3,0,5,1,2)。此时,数组A的编码定义如下: A[0]编码:0。 A[i]编码wei:在A[0],A[1],...,A[i-1]中比A[i]的值小的个数(i=1,2,...N-1)。 则数组A的编码为B=(0,0,0,3,1,2)。 要求如下: 给出数组A,利用C求解A的编码。 给出数组A的编码后,求出A中的原数据。 #include<iostream> #include<cstdio> #include<conio.h> #include<stdlib.h> #include<time.h> usingnamespacestd; inta[12],b[12]; voidswap(int*x,int*y){ int

  • Linux HugePage 特性

    HugePage,就是指的大页内存管理方式。与传统的4kb的普通页管理方式相比,HugePage为管理大内存(8GB以上)更为高效。本文描述了什么是HugePage,以及HugePage的一些特性。   1、Hugepage的引入   操作系统对于数据的存取直接从物理内存要比从磁盘读写数据要快的多,但是物理内存是有限的,这样就引出了物理内存与虚拟内存的概念。虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,这部分磁盘空间Windows下称之为虚拟内存,Linux下被称为交换空间(SwapSpace)。       对于这个大内存的管理(物理内存+虚拟内存),大多数操作系统采用了分段或分页的方式进行管理。分段是粗粒度的管理方式,而分页则是细粒度管理方式,分页方式可以避免内存空间的浪费。相应地,也就存在内存的物理地址与虚拟地址的概念。通过前面这两种方式,CPU必须把虚拟地址转换成物理内存地址才能真正访问内存。为了提高这个转换效率,CPU会缓存最近的虚拟内存地址和物理

  • 抖音副业的思考

    知识在任何时代都不会过时,我们可以打造知识ip,输出某个垂直领域的知识,吸引高针对性的粉丝,然后想办法变现!其中之一就是卖课程,卖知识!---虚拟产品,比实物更有价值!一本万利,没有成本!! 信息差也是知识的一种! 可以对现有知识的系统整理或者展示(展示给不知道的人),然后在抖音上传播 视频时代,要充分利用声音,视频,文字吸引访客,让他们意识到自己作品的和账号的价值 账号的关键首先是你能不能给用户提供价值!其次是表达方式能不能吸引人,直击痛点! 账号价值:满足好奇心,解压,治愈,满足虚荣心,提供解决实际问题的方法,满足幻想,个人魅力,传播美好的事物,放大生活中让人开心舒适的瞬间和小事,使人开心-搞笑,同情心,寻找心里的慰藉(比如做很多人想做又做不到的事),传播专业知识 6/11  关于减纪录片视频,每天估计要花费2到4个小时,我还是觉得太多时间了,我觉得要控制在2个小时以内,而且不会为没有素材发愁才可以 所以我想做拼接:就是拿已经很火的文案+自己找的视频(比如游戏,风景,影视剧热门场景等)+热门音乐==混合出一个视频,这样既能蹭热度,又不缺素材,文案方面就选感情类的/哲理故事

  • 如何把MobaXterm的终端光标改为竖线

    eidt现有session

  • linux工作管理

    linux工作管理相当于Windows系统的应用最小化,让其在后台运行。 1、如何把进程放入后台 1、&符号:在执行的命令后面加&符号(如tar-zcfetc.tar.gz/etc&放入后台在执行状态) 2、按ctrl+z:放入后台是暂停的  (ctrl+c是终止) 2、查看后台的工作 jobs  jobs-l:显示工作PID 备注: “+”号代表最近放入后台的工作,也是工作恢复是默认恢复的工作, “-”号代表倒数第二个放入后台的工作。 3、将后台暂停的工作恢复到前台执行 fg%工作号 参数:-%工作号。%可以省略,工作号和PID进程号不一样。工作号是指通过jobs命令查询结果前面的[1],[2]等 bg%工作号:将进程恢复到后台运行   4、  

  • 超好的webview学习资料

    http://download.csdn.net/detail/fire_fire_fire/4311279

  • UESTC_小panpan学图论 2015 UESTC Training for Graph Theory&lt;Problem J&gt;

    J-小panpan学图论 TimeLimit:3000/1000MS(Java/Others)   MemoryLimit:65535/65535KB(Java/Others) Submit Status 小panpan不会图论,所以图论专题他非常刻苦地学习图论。 今天他认真地学习了萌神的ppt,学习了一下Floyd算法,手持两把锟斤拷的他,口中疾呼烫烫烫,马上找了到OJ上找了道FLoyd的题: n个点,m边的无向连通图,无重边,无自环,每条边的长度都是1,求任意两点之间的最短距离 ——出题人acerlawson 小panpan想了想,写了段代码交了上去,他得到了AC! 出题人acerlawson看了一下小panpan的程序,发现他写了个错误的Floyd,他选了k个点出来,存在a[]数组里,核心代码如下: d[i][j]//i,j之间的最短距离 a[i]//小panpan事先选好的点 for(inti=1;i<=n;i++){ for(intj=1;j<=n;j++){ if(i==j) d[i][j]=0; el

  • 抽象类和接口

    抽象类本身并不能被引用,但是可以被作为父类继承 接口实在原有的继承上再去添加新的功能比如: abstractclassCar{ publicabstractvoidstart(); publicabstractvoidstop();}interfaceAlarm{ publicvoidsound();}classBydCarextendsCar{ @Override publicvoidstart(){ //TODOAuto-generatedmethodstub } @Override publicvoidstop(){ //TODOAuto-generatedmethodstub }}classAudiCarextendsCar{ @Override publicvoidstart(){ //TODOAuto-generatedmethodstub } @Override publicvoidstop(){ //TODOAuto-generatedmethodstub }}classLandRoverCarextendsCarimplementsAl

  • 凭此五点 这款信创传输系统就解决了安全传输的各种需求

    早在20世纪80年代,我国政府IT底层基础软硬件的自主创新提出了相关要求,但受制于国外巨头垄断关键技术,诸多系统性风险与安全隐患无力解决。自2018年以来,在中兴和华为等公司供应链危机的催化下,信创产业进入快速发展期,涵盖芯片等领域的相关政策密集出台。 信创产业,即信息技术应用创新产业,它与“863计划”“973计划”“核高基”一脉相承,是我国IT产业发展升级采取的长期计划。2020年是信创产业“元年”,“2+8”体系中全面升级自主创新信息产品,信创行业开始得到更多关注,信创产业推进进入了新的阶段。 信创最早落地于党政市场,近年来金融、电信、电力、交通等八大重点行业开始加快信创步伐。其中,金融安全是国家安全的重要组成部分,在目前的驱使下,需要考虑符合国产化趋势要求的文件传输安全产品,或是在已经采购的国产化服务器系统上,需要能预期适配的传输系统。那么在目前,什么样的文件传输系统能够满足国产化信创的趋势,并且符合各个重点行业对于数据安全的严格要求呢? Ftrans飞驰云联目前推出了《Ftrans SFT信创文件安全传输系统》,这是一款100%自主可控、全面适配信创环境、无缝增强

相关推荐

推荐阅读