目的:出于外界不可抗力因素,某公司需要给部分奖金过高的员工进行奖金压缩

条件:

1.规定了一个压缩区间,压缩后的奖金必须在此区间内

2.压缩前a>b,则压缩后a>b

3.压缩后,同一个人今年的奖金尽量比去年的要高

原始数据

bonus_2020_dict = {    # 2020年的奖金'a': 117800,'b': 115800,'c': 47360,'d': 51500,'e': 0,'f': 99348,'g': 0,'h': 104348,'i': 117466,'j': 58999,'k': 0,'l': 11754
}bonus_2021_dict = {    # 2021的奖金'a': 127980,'b': 187955,'c': 112450,'d': 104048,'e': 96059,'f': 104473,'g': 113087,'h': 149459,'i': 138412,'j': 164352,'k': 100891,'l': 104219,
}top_limit = 134540    # 压缩后的最大值
down_limit = 67270    # 压缩后的最小值

解决思路:


思路一

一开始想的是拟合一条直线来实现,也最简单,

假设斜率K,常数B,使得 max(bonus_2021) * K + B = top_limit,

得出所有人的压缩后奖金 = bonus_2021 * K + B

但是我以 1% 的精度遍历了(0~1)的斜率,发现没有任何一个 K 和 B 的组合能够同时满足三个条件

看来问题没那么简单…

重新定义区间

上一种方案的错误,是压缩后的值低于了2020年的值,就是压缩过多了,重新观察条件3压缩后,同一个人今年的奖金尽量比去年的要高,发现:

真实的区间并非是: down_limit ~ top_limit

应该是: max(down_limit , bonus_2020) ~ min(top_limit, bonus_2021)

通过一张图更加直观的展示:

a 点压缩后的取值区间其实很小,只在 117800 ~ 127980 之间, 也就是说,a点的压缩空间其实只有 127980 -117800 =10180 中的一部分

这一部分取多少呢? 可以设一个简单的公式:

压缩值 = 可压缩空间 * 压缩比

压缩比 = 1 - bonus_2021 / max(bonus_2021)

于是编写代码:

max_2021 = bonus_2021_dict[max(bonus_2021_dict,key=lambda x:bonus_2021_dict[x])]
zip_bonus_dict = {}
for k,bonus_21 in bonus_2021_dict.items():# 重新定义区间now_down_limit = max((down_limit, bonus_2020_dict[k]))now_top_limit = min((top_limit, bonus_21))limit = now_top_limit - now_down_limit# 获取压缩后的奖金zip_bonus = round(now_top_limit - limit * (1 - bonus_21 / max_2021))zip_bonus_dict[k] = zip_bonus

我按照bonus_2021的升序排列数据

通过图片可以明显观察到 zip_bonus2 这根中间蓝色的线不是单调递增的,这说明违背了条件二:压缩前a>b,则压缩后a>b

原因分析:

因为 f 点的2020年奖金过高,导致 f 点今年的下限很高

而 f 点旁边的 c,g 点 2020年的奖金都比较低,可压缩空间的下限就低,在压缩比与f 点差不多的情况下,就会出现压缩后,奖金反而比f点更低的情形.

那么怎么解决呢?

就是让 c,g 继承 f 的下限!

进而扩展到所有的点,将他们按照升序排列后,后一个点可以继承前一个点的下限

代码如下:

bonus_2021_list = list(bonus_2021_dict.items())
bonus_2021_list.sort(key=lambda x: x[1])  # 将2021年奖金按照升序排列
max_2021 = bonus_2021_list[-1][1]
now_down_limit = down_limit  # 该值为每一个点的下限zip_bonus_dict = {}
for bonus_21_tuple in bonus_2021_list:k = bonus_21_tuple[0]bonus_21 = bonus_21_tuple[1]# 将上一个点的下限加入选择now_down_limit = max((down_limit, now_down_limit, bonus_2020_dict[k]))# 上限的选择方式不变now_top_limit = min((top_limit, bonus_21))limit = now_top_limit - now_down_limitzip_bonus = round(now_top_limit - limit * (1 - bonus_21 / max_2021))zip_bonus_dict[k] = zip_bonus

结果如下图:

新增的黄色线条满足了所有条件.

最后

这种算法最后不会被真实的需求所采纳,因为其中关键一点在于当前人员的奖金数额与之前一个人的去年奖金有关系,这种关系在实际看来是非常离谱的事情

总的来说,这种算法解决了数学上的问题,或许某一天会应用在其它的实际问题上也说不定,所以还是在此记录一下

2022/3

关于奖金压缩的一种算法相关推荐

  1. 主宰这个世界的10种算法

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 译者:claudio jandan.net/2014/05/31/ ...

  2. 每个开发人员都应该学习的 10 种算法

    文章目录 1.二分查找 2. 选择.冒泡和插入排序 3. 快速排序和合并排序 4. 霍夫曼编码 5.广度优先搜索 6. 深度优先搜索 7.梯度下降 8. Dijkstra 算法 9. Diffie-H ...

  3. 【图像隐写】基于LSB+DWT+DCT三种算法实现图像和音频水印嵌入提取含Matlab源码

    1 简介 基于LSB+DWT+DCT三种算法实现图像和音频水印嵌入提取. 1.1 LSB算法 根据LSB算法简单易实现的特点,结合在图像置乱技术中很好特性的Arnold变换.利用变化产生影子图像.通过 ...

  4. 腾讯AI开源框架Angel 3.0重磅发布:超50万行代码,支持3种算法,打造全栈机器学习平台...

    出品 | AI科技大本营(ID:rgznai100) [导语]2019年8月22日,腾讯首个AI开源项目Angel正式发布3.0版本.Angel 3.0尝试打造一个全栈的机器学习平台,功能特性涵盖了机 ...

  5. 总结2021面试中的常见14种算法套路

    ‍‍‍ 点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨机器学习爱好者社区 编辑丨极市平台 导读 曾在 Fac ...

  6. Drug Target Review | 开发一种算法来预测药物性肝损伤

    Elsevier和FDA之间合作将提出一种算法,用于准确预测药物诱发的肝损伤.Drug Target Review调查了该毒理学项目将为药物发现行业带来的好处. 确保候选药物进行毒性分析是药物开发过程 ...

  7. 独家 | 决策树VS随机森林——应该使用哪种算法?(附代码链接)

    作者:Abhishek Sharma 翻译:陈超 校对:丁楠雅 本文长度为4600字,建议阅读20分钟 本文以银行贷款数据为案例,对是否批准顾客贷款申请的决策过程进行了算法构建,并对比了决策树与随机森 ...

  8. 爱因斯坦谜题解答(三种算法比较)

    爱因斯坦谜题:     在一条街上有颜色互不相同的五栋房子,不同国籍的人分别住在这五栋房子力,每人抽不同品牌的香烟,喝不同的饮料,养不同的宠物.已知如下情况: 1.  英国人住红色房子里. 2.  瑞 ...

  9. 人脸识别种族偏见:黑黄错误率比白人高100倍 | 美官方机构横评189种算法

    赖可 发自 亚龙湾 量子位 报道 | 公众号 QbitAI 没错,美国人脸识别系统最爱的是:白人中年男性 其他非裔.亚裔族群,识别率就没那么高了. 这周四,美国NIST发布的研究报告给出了这样的结果. ...

最新文章

  1. 嫦娥“挖土”归来有多难?看看中国首颗返回式卫星的故事
  2. 中国AI芯片产业发展白皮书:未来三年年均增长率超50%
  3. python循环捕捉异常_python异常捕捉以及处理
  4. Java面向对象之多态解析、final关键字
  5. python 图片生成视频_python--通过cv2多张图片生成视频
  6. Python机器学习全流程项目实战精讲(2018版)
  7. vs添加系统环境变量不识别_项目经验不重样!3个基于SpringBoot 的图片识别处理系统送给你...
  8. matlab中sum函数的使用
  9. html教程:网页字体的设置
  10. PMBOK(第六版) 学习笔记 ——《第十三章 项目相关方管理》
  11. Wifi流程机制分析:WiFi的启动
  12. java自习_java 自习室 day 24
  13. 前端背景图放置_如何在css中添加背景图?
  14. VGG网络讲解——小白也能懂
  15. 恢复出厂设置android手机号码,安卓手机恢复出厂设置会怎么样?
  16. 孩子数学成绩不好怎么办_小孩子数学差怎么办
  17. 智慧服务型政务平台规划方案(ppt)
  18. 每日作业 - JavaSE第2天
  19. 富士通代理Quad SPI铁电FRAM存储器MB85RQ4M
  20. 论文利器 || 复制PDF有换行?全自动帮你合并,还能自动翻译,论文+++

热门文章

  1. 政务大数据资源平台项目可研方案(ppt可编辑)
  2. 16、爬取知乎大v张佳玮的文章“标题”、“摘要”、“链接”,并存储到本地文件...
  3. 奶牛易物小组 Alpha冲刺
  4. Web前端开发,必须规避的8个错误点!
  5. 如何聪明地拒绝领导给自己安排的不想做的工作?
  6. 所有初始化参数说明(转)
  7. 由百度基础面面试想到的和总结的
  8. EO、DTO、ViewModel的区别
  9. 国家开放大学2021春1133文献检索题目
  10. JS前端去掉emoji表情和Java后台处理emoji表情方法