合租一个月租6000元的三室公寓,谁住主卧谁住次卧谁住客房?每人该付多少钱?
一份价格100元的寿司套餐里,有一个金枪鱼海胆手卷和一个蟹棒手卷,两人各选一个该如何分?
double date住酒店,都想住标间,但酒店只剩一套$200的标间和一套$600豪华双人间,这两对情侣都不愿意住这么贵的豪华双人间,但愿意给标间多付点钱,能否协商入住呢?
……
这些问题经过抽象变成下文的模型,还可以泛化,比如竞拍者可以是两个国家,形成基于比较优势的贸易模式,报价可以是生产率,也可以是负的生产时间。
可以用负的报价表示损失,比如在任务分配问题中,负数报价可以是时间消耗,也可以是要求分得的奖金。
若是对理论不感兴趣,可以直接跳到文末一个简单的在线实现方法
该算法的目的是把总价为的n个物品更有效的分配给n个人,实现效用最大化以及相对公平的分价。
n个竞拍者封闭报价,给出自己对n个物品的报价,反映n个物品对自己的效用(并不是“认为他人应为该物品付多少钱”,而是自己愿意为单独购买此物品所付的价格,与他人无关),形成报价矩阵
因此每行之和,即每个人的对所有物品的报价和,都等于原始n个物品的总价
(虚拟)卖家将挑选出最优报价组合,使报价组合的总价格
最高
其中代表矩阵中互不相同的n行,即n个不一样的人
物品1将分配给第个人
物品2将分配给第个人
......以此类推
n个物品原本的总价是固定的(比方说一个包含可乐、鸡翅、薯条、汉堡的套餐总价为30元)
显然,拍卖后卖家挑选的最优报价组合的总价格 (仅在所有人报价完全一致时取等)
由于本方案的目的是更好的分配物品,拍卖的卖家是虚拟的,无须盈利。所以我们要调整实际支出,使得所有人的实际支出和等于物品的原始总价。
此处给出两种方法,第一种熟悉的Normalize正则化基于效用的比例差异,第二种均匀返现基于效用的绝对值差异,绝对值差异在数学上会更严谨。但严谨程度都取决于竞拍人在报价反映自身效用时的想法。
已知为最优报价组合的总价格,
为n个物品原始价格总额。则设正则项
设第i个人在最优组合中被分配到了物品j, 则每个人调整后的实际支出为
显然,每个人的实际支出都将小于他对该物品的原报价
。因此,经过组合团购&拍卖交易后,每个人获得的效用增加了。
假设效用可以用货币来衡量。
设第j个物品给第i个人带来的效用(Utility)为,报价为
,那么假如报价即为此人购买该物品的支出,则购买物品j给第i个人带来的收益为
假设任何一个竞拍者,对所有物品的报价都真实反映了该物品对自己的效用,则所有物品给该竞拍者带来的收益都相等。即
又由式(1)可得 此式说明,由于对第i个人是固定的常数,那么他对不同物品的**报价**的**绝对值差异**,和不同物品给他带来的**效用**的**绝对值差异**,是相等的。 ### 总效用最大化 以下给出两种思路,证明该分配方案能使所有人得到的总效用最大化。(自然也是帕累托最优)已知报价组合的总价格为
又由式(2)可得
又由式(3)可知,在分配前已经是固定的了,
是一个常数,而
就是所有物品分配后给所有人带来的总效用。所以
。
因此最优报价组合在最大化报价组合的总额的同时,也使得总效用最大化。
还有另外一种证明思路,总共有个可行报价组合
,倘若每个人的支出和报价一致,那么无论怎样组合,第i个人获得的收益始终是
。
但最优报价组合能使报价之和最大,则虚拟卖家获得的“超额收益”
能达到最大,虚拟卖家的这部分收益是会全额返还给竞拍者的。
假如把超额收益均匀返现,则第i个人最终获得的实际收益为。所有物品原始价格
不变,则报价组合的总额
越大,每个人得到的收益越大。
其实除了效用最大化,还有两点需要证明,一是竞拍者为什么会严格根据物品带来的效用差异来报价,即从博弈论的角度证明这是竞拍者的最优策略。二是如何调整实际支出,即怎样把“超额收益”返还给竞拍者最合理(我个人是觉得normalize在物品价差较大时更合理)。
起初就如引子里所提,由于存在物品分配/分价上的不一致,我基于对拍卖的一些初浅认识,尝试琢磨出这么一套方案,随后意外发现可以数学上证明它能使效用最大化。
不过在我试图提交到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