jokerkeny / MultiItem-Auction-Assignment

多物品拍卖(最优分配算法)An auction solution to assign multiple items for people

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

合租一个月租6000元的三室公寓,谁住主卧谁住次卧谁住客房?每人该付多少钱?
一份价格100元的寿司套餐里,有一个金枪鱼海胆手卷和一个蟹棒手卷,两人各选一个该如何分?
double date住酒店,都想住标间,但酒店只剩一套$200的标间和一套$600豪华双人间,这两对情侣都不愿意住这么贵的豪华双人间,但愿意给标间多付点钱,能否协商入住呢?
……
这些问题经过抽象变成下文的模型,还可以泛化,比如竞拍者可以是两个国家,形成基于比较优势的贸易模式,报价可以是生产率,也可以是负的生产时间。
可以用负的报价表示损失,比如在任务分配问题中,负数报价可以是时间消耗,也可以是要求分得的奖金。

若是对理论不感兴趣,可以直接跳到文末一个简单的在线实现方法

多物品拍卖(最优分配算法)

该算法的目的是把总价为的n个物品更有效的分配给n个人,实现效用最大化以及相对公平的分价。

理论步骤

封闭报价

n个竞拍者封闭报价,给出自己对n个物品的报价,反映n个物品对自己的效用(并不是“认为他人应为该物品付多少钱”,而是自己愿意为单独购买此物品所付的价格,与他人无关),形成报价矩阵

其中第1行即第1个人对n个物品的报价。
...以此类推

因此每行之和,即每个人的对所有物品的报价和,都等于原始n个物品的总价

物品分配

(虚拟)卖家将挑选出最优报价组合,使报价组合的总价格最高
其中代表矩阵中互不相同的n行,即n个不一样的人
物品1将分配给第个人
物品2将分配给第个人
......以此类推

实际支出

n个物品原本的总价是固定的(比方说一个包含可乐、鸡翅、薯条、汉堡的套餐总价为30元)
显然,拍卖后卖家挑选的最优报价组合的总价格 (仅在所有人报价完全一致时取等)

由于本方案的目的是更好的分配物品,拍卖的卖家是虚拟的,无须盈利。所以我们要调整实际支出,使得所有人的实际支出和等于物品的原始总价。

此处给出两种方法,第一种熟悉的Normalize正则化基于效用的比例差异,第二种均匀返现基于效用的绝对值差异,绝对值差异在数学上会更严谨。但严谨程度都取决于竞拍人在报价反映自身效用时的想法。

Normalize正则化

已知为最优报价组合的总价格,为n个物品原始价格总额。则设正则项

设第i个人在最优组合中被分配到了物品j, 则每个人调整后的实际支出为

均匀返现

虚拟卖家把超额利润均分给所有n个竞拍者,即

最终效果

显然,每个人的实际支出都将小于他对该物品的原报价。因此,经过组合团购&拍卖交易后,每个人获得的效用增加了。

数学证明

假设效用可以用货币来衡量。 设第j个物品给第i个人带来的效用(Utility)为,报价为,那么假如报价即为此人购买该物品的支出,则购买物品j给第i个人带来的收益为

假设任何一个竞拍者,对所有物品的报价都真实反映了该物品对自己的效用,则所有物品给该竞拍者带来的收益都相等。即

记为

因竞拍者对n个物品报价之和为原本的总价是固定的,易得

又由式(1)可得

此式说明,由于

对第i个人是固定的常数,那么他对不同物品的**报价**的**绝对值差异**,和不同物品给他带来的**效用**的**绝对值差异**,是相等的。 ### 总效用最大化 以下给出两种思路,证明该分配方案能使所有人得到的总效用最大化。(自然也是帕累托最优)

证明1:

已知报价组合的总价格为

其中是1到n的一个排列,表示第个物品分配给

又由式(2)可得

又由式(3)可知,在分配前已经是固定的了,是一个常数,而就是所有物品分配后给所有人带来的总效用。所以

因此最优报价组合在最大化报价组合的总额的同时,也使得总效用最大化。

证明2:

还有另外一种证明思路,总共有可行报价组合,倘若每个人的支出和报价一致,那么无论怎样组合,第i个人获得的收益始终是
最优报价组合能使报价之和最大,则虚拟卖家获得的“超额收益”能达到最大,虚拟卖家的这部分收益是会全额返还给竞拍者的。
假如把超额收益均匀返现,则第i个人最终获得的实际收益为。所有物品原始价格不变,则报价组合的总额越大,每个人得到的收益越大。

其实除了效用最大化,还有两点需要证明,一是竞拍者为什么会严格根据物品带来的效用差异来报价,即从博弈论的角度证明这是竞拍者的最优策略。二是如何调整实际支出,即怎样把“超额收益”返还给竞拍者最合理(我个人是觉得normalize在物品价差较大时更合理)。

Reference

起初就如引子里所提,由于存在物品分配/分价上的不一致,我基于对拍卖的一些初浅认识,尝试琢磨出这么一套方案,随后意外发现可以数学上证明它能使效用最大化。

不过在我试图提交到github时,搜了搜现有的repo,发现该问题经过假设抽象后,就成了Assignment Problem,并有成熟的算法如Hungarian algorithm来求解该模型的最优化问题。

一个简单的在线实现方法

step 1:每个人准备好自己的报价写进自己私人的google sheet

step 2:过3分钟,大家一起公开自己的报价sheet的只读sharelink。(由于google sheet的修改记录是可见的,可验证3分钟内不存在报价变动。)

step 3:在google colab里打开本repo的auction.ipynb(也可直接点击https://colab.research.google.com/github/jokerkeny/MultiItem-Auction-Assignment/blob/master/auction.ipynb),输入报价并运行。当然也可以直接下载auction.py或auction.ipynb在本地运行。

其中step1 & 2是用于可靠的封闭报价的,sharelink得一起公开,否则存在事先准备好多个googlesheet的作弊漏洞。
如果没法使用google服务,可用加密的excel代替,随后公开密码。 如果在现实中当面报价,Step 1 & 2可直接用纸笔封闭报价代替。

Written with StackEdit.
Convert to github markdown by readme2tex

About

多物品拍卖(最优分配算法)An auction solution to assign multiple items for people


Languages

Language:Jupyter Notebook 58.5%Language:Python 41.5%