Python根据Shapley值计算合作联盟的奖金最佳分配方案

董付国老师Python系列教材(累计印刷超过200次)推荐与选用参考

开学第一课:一定不要这样问老师Python问题

3000道Python习题免费在线练习

“Python小屋”1400篇历史文章分类速查表

董付国老师Python教学PPT汇总与题库分享

==============

版权声明:由于公众号后台规则问题,本文暂时无法设置原创标记,但仍属原创内容,微信公众号“Python小屋”坚持只发原创技术文章。

=============

推荐教材:

董付国编著.Python程序设计(第4版·微课版·在线学习软件版),ISBN:9787302663799,清华大学出版社,2024年6月出版(本书前3版印刷34次),定价69.8元,山东省普通高等教育一流教材,国家级特色专业、国家级一流本科专业“计算机科学与技术”配套教材,山东省一流本科课程“Python应用开发”配套教材,2019、2020、2021、2022年清华大学出版社畅销教材,2022、2023年清华大学出版社科技类最受高校欢迎奖

509bc1a28ca69bb5f376920e8b70d496.jpeg

7d2c024ecada3a6ac6b24fe58265c605.jpeg

de0bff40d831c0d772e1380d0b8ae21f.jpeg

图书内容:154个例题、140节微课视频(含课程思政),内容涉及Python基础、Office文件操作、GUI、图像处理、计算机图形学、音视频处理、数据分析与科学计算可视化、密码学、数据库、网络编程、多线程与多进程、逆向工程、Windows系统编程与安卓编程等领域。

页数:372

适用专业:计算机类所有专业

适用层次:研究生/本科/专科

配套资源:教学大纲、电子教案、课件、源码、数据文件、习题答案、题库,在线练习软件,支持课程思政,支持工程教育认证

适用学时:64/96/128

=============

问题描述:

在某些社会或经济活动中,多人(或公司、国家)结盟合作时通常能比单独活动时获得更大的收益,产生1+1>2的协同效应。同时也很显然,合理的利益分配方案对于这样的联盟能够长久持续是非常重要的。Shapley值是由美国经济学家L.S.Shapley在1953年提出的用于多人合作时利益分配的算法,该方法体现了各成员对联盟集体总收益的贡献程度,根据贡献大小进行利益分配,避免了平均主义,更加公平、合理。

某工厂马上就要下班的时候,突然来了一车零件需要在半小时内完成卸货,时间紧任务重,于是值班组长紧急安排张、刘、赵三个人加班卸货。这一车零件共有600个,半小时张一个人干活的话能卸100个、刘一个人干活的话能卸120个、赵一个人干活的话能卸50个;如果张、刘一起干活的话能卸260个,张、赵一起干活的话能卸350个,刘、赵一起干活的话能卸330个;三个人一起干活正好可以卸完600个。为了奖励三个人,组长给了2000块钱,如果按贡献大小分配的话每个人应该拿多少奖金呢?

假设张率先发起合作的邀请,先邀请刘加入再邀请赵加入,此时刘的贡献(即刘加入前后团队卸货能力的差)为260-100=160,赵的贡献为600-260=340;如果张先邀请赵再邀请刘,此时赵的贡献为350-100=250,刘的贡献为600-350=250。重复上面的过程,计算每个人率先发出邀请以及不同邀请顺序中每个人的贡献,得到下面的矩阵,左边一列表示不同发起人和邀请顺序。

              张      刘       赵

张刘赵    100    160     340

张赵刘    100    250     250  

刘张赵    140    120     340

刘赵张    270    120     210

赵张刘    300    250     50

赵刘张    270    280     50

然后对矩阵计算纵向平均值得到每个人的Shapley值,根据每个人Shapley值占比来计算和分配奖金。按照这个规则,得到张、刘、赵三人的Shapley值分别为196.66666667、196.66666667、206.66666667,按占比分配2000奖金的话三人分别得到655.56、655.56、688.89。

函数func()接收一个字典data和一个整数money作为参数,data字典中存放了不同组合的卸货能力,money表示总奖金,要求返回一个字典表示每个人应得奖金数量(人名顺序和data中相同),奖金数额保留2位小数,忽略因为四舍五入产生的误差,剩余的几分钱交工,多发的几分钱由组长补上。

参考代码:

e115ec7ff86a9f6873d9b1fa69b82e6e.png

运行结果:

9da432ba4df4c6999c18a2d159c1f1f8.png

=================

温馨提示:

关注微信公众号“Python小屋”,在公众号后台发送消息“大事记”可以查看董付国老师与Python有关的重要事件;发送消息“教材”可以查看董付国老师出版的Python系列教材(已累计印刷超过200次)的适用专业详情;发送消息“历史文章”可以查看董付国老师推送的超过1400篇原创技术文章;发送消息“会议”可以查看近期董付国老师的培训安排;发送消息“微课”可以查看董付国老师免费分享的超过700节Python微课视频;发送消息“课件”可以查看董付国老师免费分享的Python教学资源;发送消息“小屋刷题”可以下载“Python小屋刷题神器”,免费练习3857道客观题和784道编程题,题库持续更新;发送消息“编程比赛”了解Python小屋编程大赛详情。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shapley是一种用于衡量参与者对于合作联盟产生的价的方法。在联盟中,每个参与者都会对最终结果产生影响,而Shapley的目的就是为了量化每个参与者对于最终结果的贡献。以下是一个Python实现Shapley的例子: ```python from itertools import permutations def shapley_value(player, coalition, v): """ player: 参与者 coalition: 联盟 v: 获胜联盟对应的价 """ n = len(player) total = 0 for perm in permutations(player): for i in range(n): if perm[i] not in coalition: break else: s1 = coalition.union({perm[i]}) s2 = coalition.union({perm[i], perm[i+1]}) if i < n-1 else s1 total += (v[s1] - v[s2]) / math.comb(n, i+1) return total ``` 其中,`player`是参与者的列表,`coalition`是联盟的集合,`v`是一个字典,其中键表示联盟的集合,表示对应联盟的价。 例如,如果有4个参与者(A、B、C和D),则`player`应该是`["A", "B", "C", "D"]`,如果有一个联盟`{"A", "B"}`,并且它对应的价为10,则`v`应该是`{frozenset({"A", "B"}): 10}`。 以下是一个使用示例: ```python player = ["A", "B", "C", "D"] v = { frozenset(): 0, frozenset({"A"}): 2, frozenset({"B"}): 3, frozenset({"C"}): 5, frozenset({"D"}): 7, frozenset({"A", "B"}): 10, frozenset({"A", "C"}): 13, frozenset({"A", "D"}): 15, frozenset({"B", "C"}): 17, frozenset({"B", "D"}): 20, frozenset({"C", "D"}): 22, frozenset({"A", "B", "C"}): 25, frozenset({"A", "B", "D"}): 30, frozenset({"A", "C", "D"}): 32, frozenset({"B", "C", "D"}): 35, frozenset({"A", "B", "C", "D"}): 40 } coalition = {"A", "B"} print(shapley_value(player, coalition, v)) ``` 输出结果应为:`7.5`。这表示在该联盟中,参与者A和参与者B各自对于最终结果的贡献为7.5。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值