这几天因一些项目工作,需要对竞拍算法进行学习。但百度了大部分资料都未找到一篇文章对此算法有着较为深入的介绍。在一番努力之下,终于找到了最初提出该算法的论文,本文内容主要结合该论文对竞拍算法进行分析。

竞拍算法简介

竞拍算法(Auction Algorithm)是一种用于解决分配问题的分布式算法,经相关文献查询,最早由麻省理工学院信息和决策系统实验室的Bertsekas(教授?)提出 1,于1988年发表于期刊Annals of Operations Research

顾名思义,竞拍算法本质就是模拟人类拍卖活动的过程,其算法流程就像拍卖一样,未经分配的投标人同时出价投标目标物,从而提高目标物价格,拍卖行获取所有投标人的出价信息,将目标物卖给出价最高的投标人。最终的结果应尽可能保证所有投标人和拍卖行的利益最大化。


问题的提出与基本数学模型

竞拍问题有许多不同的版本,其复杂度也不一样。按投标人数 N N N和竞拍商品数 M M M不同,主要可分为以下两大类:

  • N ≥ M N\geq M NM,投标人数大于商品人数,即存在部分投标人落标;
  • N < M N< M N<M,投标人数小于或等于商品人数,可能存在部分投标人投中多个标。

现实约束条件可能十分复杂,比如,某些投标人只中意部分部分商品,另一些投标人虽然对所有商品都有兴趣,但是其能容纳的商品数目却是有限的,像不同型号的货车送货就是一个类似的分配范例。对于第一类问题,如果规定每个投标人对所有商品都有意愿争取,且最多只能中标一件商品,则被称为单分配问题(single-assignment),当 N = M N=M N=M时,该问题被称为 完全分配(complete assignment) 问题,第二类问题被称为多分配问题(multiple assignment)。本篇博客只考虑单分配问题,后续有时间再研究下多分配问题。

问题提出

假设现有6个商品需要拍卖,有6个投标人来竞标。投标人对商品的估值如下表所示(注意,每个商品在不同投标人那里产生的价值是不同的):

表1: 不同商品对于投标人的价值

【商品价值】商品1商品2商品3商品4商品5商品6
投标人1¥11¥18¥11¥18¥33¥4
投标人2¥4¥34¥33¥32¥26¥23
投标人3¥3¥0¥27¥24¥14¥9
投标人4¥25¥15¥25¥23¥7¥26
投标人5¥30¥18¥34¥20¥17¥29
投标人6¥5¥35¥34¥4¥17¥28

每个投标人最多只能拍得一件商品,每件商品最终必须被拍卖,那么问题为:投标人该如何报价,拍卖行该如何分配商品给投标人,才能使得投标人和拍卖行的综合获益最大。

问题分析及数学建模

首先预定义一些基本变量,如下:

  • N N N:投标人数量,此处 N = 6 N=6 N=6;
  • M M M:商品数量,此处 M = 6 M=6 M=6;
  • I = { i 1 , i 2 , ⋯   , i N } I=\{i_1,i_2,\cdots,i_N\} I={i1,i2,,iN}:投标人集合;
  • J = { j 1 , j 2 , ⋯   , j M } J=\{j_1,j_2,\cdots,j_M\} J={j1,j2,,jM}:商品集合;
  • A ( 1 ) , A ( 2 ) , ⋯   , A ( N ) A(1),A(2),\cdots, A(N) A(1),A(2),,A(N):投标人感兴趣商品的集合,如果各投标人对所有商品都有兴趣,则有 A ( 1 ) = A ( 2 ) = ⋯ = A ( N ) = J . { A(1)=A(2)=\cdots=A(N)=J. } A(1)=A(2)==A(N)=J.
  • S = { { i s 1 , j s 1 } , { i s 2 , j s 2 } , ⋯   , { i s T , j s T } } S=\{\{i_{s1},j_{s1}\},\{i_{s2},j_{s2}\},\cdots,\{i_{sT},j_{sT }\}\} S={{is1,js1},{is2,js2},,{isT,jsT}}:分配情况集合;
  • W = { ω i j ∣ i ∈ I , j ∈ J } { W=\{\omega_{ij}|i\in I,j\in J\} } W={ωijiI,jJ};表示投标人 i {i } i对于商品 j {j } j的估价集合;
  • P = { p i j ∣ i ∈ I , j ∈ J } { P=\{p_{ij}|i\in I,j\in J\} } P={pijiI,jJ}:投标人 i i i对于商品 j j j的报价;
  • B = { b j ∣ j ∈ J } { B= \{b_j|j\in J\} } B={bjjJ}:各商品经一轮报价后,确定的竞标价;
  • F = { f i j ∣ i ∈ I , j ∈ J } { F=\{f_{ij}|i\in I,j\in J\} } F={fijiI,jJ}:投标人 i i i是否拍得商品 j j j的集合,是则 f i j = 1 f_{ij}=1 fij=1,否则 f i j = 0 f_{ij}=0 fij=0
  • G = { g i j ∣ i ∈ I , j ∈ J } { G=\{g_{ij}|i\in I,j\in J\} } G={gijiI,jJ}:投标人 i i i对于商品 j j j的净收益集合。

当分配方案为 S S S时,投标人总收益为:
∑ k = s 1 s T g i k j k = ∑ k = s 1 s T ( w i k j k − p i k j k ) (1) \sum_{k=s1}^{sT}g_{i_kj_k}=\sum_{k=s1}^{sT}(w_{i_kj_k}-p_{i_kj_k}) \tag{1} k=s1sTgikjk=k=s1sT(wikjkpikjk)(1)
每个投标人最多只能拍得一件商品,则有:
∑ j = 1 M f i j ≤ 1 , ∀ i ∈ I (2) \sum_{j=1}^{M}f_{ij}\leq 1,\forall i\in I \tag{2} j=1Mfij1,iI(2)

每件商品最终必须被拍卖,则有
T = M (3) T=M \tag{3} T=M(3)

结合(1-3),最终的优化模型应为:
max ∑ k = s 1 s T g i k j k s t . ∑ j = 1 M f i j ≤ 1 , ∀ i ∈ I T = M (4) \begin{aligned} &\text{max}\sum_{k=s1}^{sT}g_{i_kj_k}\\ st.&\sum_{j=1}^{M}f_{ij}\leq 1,\forall i\in I\\ &T=M \end{aligned} \tag{4} st.maxk=s1sTgikjkj=1Mfij1,iIT=M(4)
如果还需要考虑到拍卖行的收益,那么模型应当建立为:
max ∑ k = s 1 s T g i k j k + ∑ j M b j s t . ∑ j = 1 M f i j ≤ 1 , ∀ i ∈ I T = M (5) \text{max}\sum_{k=s1}^{sT}g_{i_kj_k}+\sum_{j}^{M}b_j\\ \begin{aligned} st.&\sum_{j=1}^{M}f_{ij}\leq 1,\forall i\in I\\ &T=M \end{aligned} \tag{5} maxk=s1sTgikjk+jMbjst.j=1Mfij1,iIT=M(5)

问题的解法

首先需要明确的是,投标人和拍卖行都期望获取最大的利益,因而不仅投标人之间存在冲突,投标人和拍卖行之间也存在冲突。比如在某一轮拍卖中,拍卖行期望将商品卖给出价高的人,但投标人对某一件商品可能有相同的出价,那么拍卖行此轮拍卖就不能确定商品该卖给谁,就需要投标人进行下一轮报价,投标人只要还有利可图,就会报一个更高的价格,直到PK掉自己的竞争对手。此外,投标人在意识到自己投标的商品利润较低时,也会考虑换另一个商品进行投标。总而言之,我们可以建立投标人的利益方程为:
π i = max j ∈ J { w i j − b j } (6) \pi_i= \text{max}_{j\in J} \{ w_{ij}-b_{j} \} \tag{6} πi=maxjJ{wijbj}(6)
即投标人 i i i了解到当前每个商品的投标价 b j b_j bj后,可通过公式(6)来计算自己的利益空间 π i \pi_i πi。为了分析投保人下一轮该如何合理的报价,Bertsekas教授提出了 ϵ − \epsilon- ϵ松弛互补 ϵ − \epsilon- ϵcomplementary slackness, ϵ − C S \epsilon-CS ϵCS 条件:

π i − ϵ = max ⁡ k ∈ A ( i ) { a i k − b k } − ϵ ⩽ w i j − b j ,  for each  ( i , j ) ∈ S (7) \pi_{i}-\epsilon=\max _{k \in A(i)}\left\{a_{i k}-b_{k}\right\}-\epsilon \leqslant w_{i j}-b_{j}, \text { for each }(i, j) \in S \tag{7} πiϵ=kA(i)max{aikbk}ϵwijbj, for each (i,j)S(7)
其中 ϵ { \epsilon} ϵ是一个大于0的常数,本质上是用于后续投标人报价更新幅度的,可取一个相对于表1中商品价值变化幅度较小的值,这样足以体现投保人以一个较小的幅度提高对商品的报价。
在拍卖刚开始的时候,我们可以令 b j = 0 , j ∈ J b_j=0,j\in J bj=0,jJ,即各投标人初始报价均为0元,同时先构造一个初始的分配情况 S S S满足式(7),注意,可能一些投标人的分配结果满足(7)式 ϵ − C S \epsilon-CS ϵCS条件后,另一些投标人就无法满足(7)式了,此时, S S S就是一个未完全分配的集合。比如,我们刚开始可以结合表1先按照(7)式依次从投标人1开始分配( ϵ \epsilon ϵ可取0.1):

【投标人编号】【对应商品编号】最大利益 π i = max j ∈ J { w i j − b j } \pi_i= \text{max}_{j\in J} \{ w_{ij}-b_{j} \} πi=maxjJ{wijbj} ϵ − C S \epsilon-CS ϵCS条件
投标人1商品5¥3332.9=32.9<=33
投标人2商品2¥3433.9=33.9<=34
投标人3商品3¥2726.9=26.9<=27
投标人4商品6¥2625.9=25.9<=26
投标人5商品3,和投标人3冲突
投标人6商品2,和投标人2冲突

因此,初始的分配情况为 S = { { 1 , 5 } , { 2 , 2 } , { 3 , 3 } , { 4 , 6 } } S= \{\{1,5\},\{2,2\},\{3,3\},\{4,6\}\} S={{1,5},{2,2},{3,3},{4,6}}。由于投标人5和投标人6未拍得期望商品,其它商品又不符合他们利益最大化要求,于是他们需要提高新一轮报价,再来一次竞标。另外已中标的投标人再下一轮竞标中会处于观望状态,不用考虑下一轮报价问题,只会旁观两个未中标的投标人报价。根据文献1,未中标的5和6下一轮报价采用如下方法计算:

  • 第一步,先计算本轮最优收益:

π i = g i j ∗ = max ⁡ k ∈ A ( i ) { a i k − b k } (8) \pi_i=g_{ij^*}=\max _{k \in A(i)}\left\{a_{i k}-b_{k}\right\} \tag{8} πi=gij=kA(i)max{aikbk}(8)
对于本文例题中5号和6号投标人,(8)式中的 j ∗ = 3 j^*=3 j=3 j ∗ = 2 j^*=2 j=2.

  • 第二步,计算次优收益:

g i j 1 ∗ = max ⁡ k ∈ A ( i ) , k ≠ j ∗ { a i k − b k } (9) g_{ij_1^*}=\max _{k \in A(i),k\neq j^*}\left\{a_{i k}-b_{k}\right\} \tag{9} gij1=kA(i),k=jmax{aikbk}(9)

  • 第三步,计算下一轮报价:

p i j ∗ = b j ∗ + g i j ∗ − g i j 1 ∗ + ϵ (10) p_{ij^*}=b_{j^*}+g_{ij^*}-g_{ij_1^*}+\epsilon \tag{10} pij=bj+gijgij1+ϵ(10)
其中, b j ∗ b_j^* bj是上一轮竞标中商品 j ∗ j^* j的最高报价,所以由式 ( 8 ) − ( 10 ) (8)-(10) (8)(10)可知下一轮中,必然有 p i j > b j ∗ p_{ij}>b_{j^*} pij>bj,保证了下轮竞标商品报价的提高,具体提高多少,就是看最优和次优之间相差的利润空间是多少。实际上新一轮报价中,对于投标人 i i i而言,最优商品的报价提升意味着利益降低,但次优商品报价未变,利益未变,可以预测到,如果未来一直无法竞标到最优商品,随着其报价的提升,最优选择会逐渐趋近于原次优商品,原次优商品会变得更具有吸引力。在文献中,(8)-(10)被称为竞标阶段(Bidding Phase)。

接下来就是拍卖行考虑将商品卖谁的问题了,也就是文献中提到分配阶段(Assignment Phase)。显然,拍卖行会将商品卖给出价最高的人:
b j : = max p i j (11) b_j:= \text{max} p_{ij} \tag{11} bj:=maxpij(11)

从(8-11)就是一个完整的算法迭代更新步骤。通过 MATLAB仿真 分析,最终的分配和报价结果为:

【投标人编号】商品编号最终报价商品估值净收益
1号投标人503333
2号投标人41.03231
3号投标人34.12722.9
4号投标人61.12624.9
5号投标人10.23029.8
6号投标人23.13531.9

对于完全分配问题,作者在文中分析了当取 ϵ < 1 N \epsilon<\frac{1}{N} ϵ<N1时,该算法能得到最优分配解。主要从以下三点考虑:

  • 如果一个商品已经分配了,那么它会一直保持分配状态,只是由于竞标价的迭代可能会不间断分给不同的投标人;
  • 如果一个商品未分配,那么它会一直保持为最初始最低的竞标价,而完全分配问题中,未分配的商品总会对应着一个未中标的投标人,所以随着其它商品竞标价的提升,未中标的投标人总会青睐该未分配的商品。

经过三十多年的发展,竞拍算法也衍生了许多其他算法,如基于一致性的竞拍方法(Consensus-Based Auction Approaches, CBBA),这是一种去中心化的分配方法,不需要拍卖行来集中分配。后续有时间再做深入分析。


  1. Bertsekas D P . The auction algorithm: A distributed relaxation method for the assignment problem[J]. Annals of Operations Research, 1988, 14(1):105-123. ↩︎ ↩︎

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐