最优分配问题求解——拍卖算法

现在面临一个问题。

有三个人,A、B、C:

有三个物品,1、2、3:

需要将这三个物体分给三个人,每人一个。每个人对三个物品的喜好不同,要怎样分配才能让三个人的总满意度最高?


分配问题 广泛存在于生产和生活中。例如为一组工作人员分配任务,或者为作战小组分配进攻目标等等。在分配过程中,精明的分配者一定会实现某个目的,例如让每个工作人员充分发挥专长,最高质量地完成任务;或者为每个作战小组分配相距最近的进攻目标,最快速地结束战斗。怎样分配能实现这些目的,就是分配问题的解。


拍卖算法是用来解决这类问题的经典算法,灵感来自于经济活动中的拍卖过程,是一种能够在有限步计算中获得最佳分配的算法。

回到我们开始时的例子。A先生擅长球类运动,滑板也略有涉及,但是对在海浪里穿梭这项运动并不感冒。因此A先生最想要网球拍,有点想要滑板,完全不想要冲浪板。根据三个物品对于A先生的重要性,我们为这三项物品打分为4、2、0。在这个例子中,我们打分并没有复杂的规则:某人想要某件物品的愿望越迫切,打分越高。同样,其余两位也表达了自己的喜好。于是我们得到了下面这张图。

图中线上的数字表示某人对某物品的打分,也就是喜好。从物品的角度而言,线上的数字代表如果某一个物体被分配给了某个人,将会给这个人带来多少好处(即,价值 Value,文献中常用 \alpha_{ij}表示 j 物品分配给第 i 个人的价值)。

为了实现总体满意度最高的分配,三位先生坐在一起竞争物品的归属。按照商业原则,当我们和竞争对手想买同一件物品时,我们必须付比对手更多的钱(即,价格 Price,文献中常用 p_j表示 j 物品的价格),才能将物品据为己有。于是三位先生开始对物品报价。

在首次出价之前,三个物品的起拍价都是0。

A先生首先出价。对于A先生而言,目前三个物品的价格都是0。如果A先生选择购买1物品,那么花费0元购得4点的价值,A先生这笔交易的收益(即,净利润 Profit) 为 4-0=4


重要公式1: 收益计算公式 profit=value-price


A先生购买1、2、3三个物品的收益分别为4、2、0。算法为每个人赋予了自利性,即总是选择收益最高的物品,这也是算法最终得到最优解的重要保证。基于自利性,A先生选择了1物品,并对1物品报价,提高了它的价格。价格提高的幅度在\varepsilon\pi+\varepsilon之间,即每次报价最少比原来提高\varepsilon,最多比原来提高\pi+\varepsilon(增幅范围的意义和\pi的详细计算将在下文中阐述,本例中选取\varepsilon =0.3)。


重要公式2:报价计算公式 price_{old}+\varepsilon \leq price_{new} \leq price_{old}+\pi+\varepsilon


A先生将物品1的价格提高到2+\varepsilon,局面变成了下图。

B先生开始报价。他购买1、2、3三个物品的收益分别是 -1.3、3、1。由于A先生的提价,1物品的价格已经高于1物品能够提供给B先生的价值,因此B先生不会再考虑1物品。B先生选择了收益最高的2物品,并提升了它的价格至2+\varepsilon,如下图所示。

C先生开始报价。他购买1、2、3三个物品的收益分别是 0.7、0.7、2。根据自利性,C先生选择3物品,并修改3物品的价格为1.3+\varepsilon,如下图所示。

到此步为止,所有人都得到了分配,算法终止。分配结果中,总体满意度(喜好值的和)为4+3+2=9,是在所有分配方案中总体满意度最高的方案。


算法停止条件:当每个人都获得分配 或者 每个人购买所有物品的最大收益都不大于0。


还有一个疑问,我们应该如何控制报价的增长?

如果我们不限制报价增长幅度的下限,那么当两个人对同一物品展开竞价时,价格提升的会很慢,甚至完全没有提升,竞价将会永无止境的持续下去;

如果我们不限制报价增长幅度的上限,那么一次报价就可能使物品的价格超过价值,导致无法参与后续的拍卖。

因此我们限制报价增幅的上下限。


重要推论1:对于nn物品的分配,当价值 \alpha _{ij}(即图中横线上标注的数字)为整数时,若

\varepsilon < \frac{1}{n}

则算法结束时获得最优解。


在上例中,有3个人参与分配,n=3,因此我们选取 \varepsilon = 0.3 < \frac{1}{3}


重要公式3:如果除了当前要提价的 j 物品之外,没有其它能够提供正收益的物品,则

\pi = \alpha_{ij} - p_j

如果除了当前要提价的 j 物品之外,还有一个物品 k ,购买它产生的收益仅次于物品 j,则

\pi = \alpha_{ij} - p_j - ( \alpha_{ik} - p_k)


例如在第一步A先生提价的过程中,最高收益来自于1物品,收益为4。物品2也提供大于零的收益,为2,仅次于1物品提供的收益。由公式3可以得到

\pi = 4 - 0 - ( 2 - 0)=2

由于提价过程中给出的是一个范围,在设计算法时,一般采用上限值\pi + \varepsilon作为提价的幅度,因为提价的幅度越高,算法结束的越快。在许可的范围内取最大幅度,即可保证最优性,又可以加快算法速度。

扩展阅读:

拍卖算法的开山之作:

Dimitri P. Bertsekas, A Distributed Algorithm for the Assignment Problem, 1979

论文链接:http://web.mit.edu/dimitrib/www/Orig_Auction.pdf