基本定义
Matching: A matching S = { ( m , w ) ∣ m ∈ M and w ∈ W } S = \{(m, w) | m \in M \text{ and } w \in W\} S={(m,w)∣m∈M and w∈W}, where each m m m and w w w appears in at most one pair in S S S.
Perfect Matching: A perfect matching S ′ = { ( m , w ) ∣ m ∈ M and w ∈ W } S' = \{(m, w) | m \in M \text{ and } w \in W\} S′={(m,w)∣m∈M and w∈W}, where each m m m and w w w appears in exactly one pair in S ′ S' S′.
Preference: Each man m ∈ M m \in M m∈M ranks all the women. We say " m m m prefers w w w to w ′ w' w′" if m m m ranks w w w higher than w ′ w' w′. Similarly, each woman w ∈ W w \in W w∈W ranks all the men.
Instability: An instability with respect to S S S: ( m , w ′ ) ∉ S (m,w') \notin S (m,w′)∈/S, but m m m prefers w ′ w' w′ to his partner and w ′ w' w′ prefers m m m to her partner.
Stable Matching: A matching
S
S
S is stable if
\quad\quad\quad\quad\quad\quad
1.
S
S
S is perfect
\quad\quad\quad\quad\quad\quad
2. no instability with respect to
S
S
S
Valid Partner: A woman w w w is a valid partner of a man m m m if there is a stable matching that contains pair ( m , w ) (m,w) (m,w).
Best Valid Partner:
w
w
w is the best valid partner of
m
m
m if
\quad\quad\quad\quad\quad\quad
1.
w
w
w is a valid of
m
m
m
\quad\quad\quad\quad\quad\quad
2.
∀
w
′
>
w
\forall w'>w
∀w′>w,
m
m
m and
w
′
w'
w′ is not a valid partner
Denote
b
e
s
t
(
m
)
best(m)
best(m)
w ′ > w w'>w w′>w indicates m m m ranks w ′ w' w′ higher than w w w.
伪代码
- Initially all m ∈ M m\in M m∈M and w ∈ W w \in W w∈W are free
- While ∃ m \exist m ∃m who is free and hasn’t proposed to any woman
- \quad\quad Choose such a man m m m
- \quad\quad Let w w w be the highest-ranked woman in m m m's preference list to whom m m m has not yet proposed
- \quad\quad If w w w is free then
- \quad\quad\quad\quad ( m , w ) (m,w) (m,w) become engaged
- \quad\quad Else ( w w w is currently engaged to m ′ m' m′)
- \quad\quad\quad\quad If w w w prefers m ′ m' m′ to m m m then
- \quad\quad\quad\quad\quad\quad m m m remains free
- \quad\quad\quad\quad Else ( w w w prefers m ′ m' m′ to m m m)
- \quad\quad\quad\quad\quad\quad ( m , w ) (m,w) (m,w) become engaged
- \quad\quad\quad\quad\quad\quad m ′ m' m′ becomes free
- \quad\quad\quad\quad Endif
- \quad\quad Endif
- Endwhile
- Return the set S S S of engaged pair
GS算法定理
定理1:在 w w w 获取第一个 proposal 之后, w w w 将一直有配偶。她得到的配偶会越来越好 (in terms of her preference list)。
定理2: m m m propose 的配偶越来越差 (in terms of his preference list)。
定理3:GS 算法在至多
n
2
n^2
n2 次 iterations 之后终止。
证明:
令
P
(
t
)
P(t)
P(t) 为
{
(
m
,
w
)
∣
m
has proposed to
w
}
\{(m,w)| m \text{ has proposed to } w \}
{(m,w)∣m has proposed to w}
∵
\because
∵ 每次循环男人向不同的女人求婚
∴
∣
P
(
t
+
1
)
∣
>
∣
P
(
t
)
∣
\therefore |P(t+1)|>|P(t)|
∴∣P(t+1)∣>∣P(t)∣
一共最多有
n
2
n^2
n2 个男女配对。
定理4:如果在算法运行过程中
m
m
m 是 free 的,那么存在一个
m
m
m 还没有propose 过的
w
w
w 。
证明:(反证法)
假设在一个时刻
m
m
m is free but has already proposed to every women. 由定理1可知每一个女人都有配偶。
∵
\because
∵ the engaged pairs form a matching
n
×
n
n \times n
n×n
∴
\therefore
∴ there are
n
n
n engaged men at this point
矛盾
定理5:程序终止时 return 的 set
S
S
S 是一个 perfect matching。
证明:
The set of engaged pairs always forms a matching.
假设这个算法在终止的时候存在一个 free man
m
m
m. 那么,这个男人
m
m
m 肯定向所有女人都求过婚,否则 while loop 不会结束。
与定理4矛盾
定理6:GS 算法 return a set of pairs
S
S
S. 这个集合
S
S
S 是 stable matching。
证明:(反证法)
假设集合
S
S
S 中存在 instability,即
∃
(
m
,
w
)
,
(
m
′
,
w
′
)
∈
S
\exist (m,w), (m', w') \in S
∃(m,w),(m′,w′)∈S
m
m
m 更喜欢
w
′
w'
w′ 且
w
′
w'
w′ 更喜欢
m
m
m。
由算法代码可知,
m
m
m 最后 propose 的
w
w
w。
若
m
m
m 在之前没有向
w
′
w'
w′ propose 过,那么
m
m
m 更喜欢
w
w
w。(矛盾)
若
m
m
m 在之前有向
w
′
w'
w′ propose 过,那么
m
m
m 被
w
′
w'
w′ 拒绝过,因为
w
′
w'
w′ 更喜欢
m
′
′
m''
m′′。
∵
m
′
\because m'
∵m′ 是
w
′
w'
w′ 最终的配偶
∴
m
′
′
=
m
′
\therefore m''=m'
∴m′′=m′ 或
m
′
>
m
′
′
>
m
m'>m''>m
m′>m′′>m (矛盾)
因此得出结论,
S
S
S 是 stable matching。
定理7:令
S
∗
=
{
(
m
,
b
e
s
t
(
m
)
)
:
m
∈
M
}
S^* = \{ (m, best(m)) : m\in M\}
S∗={(m,best(m)):m∈M} ,every execution of the GS Algorithm results in the set
S
∗
S^*
S∗。【所有execution(choose free man的顺序不同)得到同一个配对】
证明:(反证法)
假设一个G-S算法的 execution
ϵ
\epsilon
ϵ 得到一个 matching
S
S
S。
其中
∃
m
∈
S
\exist m \in S
∃m∈S,
m
m
m 的配偶不是
b
e
s
t
(
m
)
best(m)
best(m) [not best valid pair]。
这说明,
m
m
m 在之前被一个 valid partner
w
w
w 拒绝过。
假设
m
m
m 是第一个被 valid partner 拒绝的男人。
因为
m
m
m propose in decreasing order of preference,
m
m
m 被
w
=
b
e
s
t
(
m
)
w=best(m)
w=best(m) 拒绝。
w
w
w 拒绝
m
m
m 有两种可能:
(1)
w
w
w 更喜欢现在的配偶
(2)
w
w
w 跟
m
m
m 配对之后有更喜欢的配偶出现
均形成配对
(
w
,
m
′
)
(w, m')
(w,m′) ,其中
m
′
>
m
m'>m
m′>m
∵
\because
∵
(
m
,
w
)
(m,w)
(m,w)是 valid pair
∴
\therefore
∴ 存在一个 stable matching
(
m
,
w
)
∈
S
′
(m,w)\in S'
(m,w)∈S′。假设在
S
′
S'
S′中,
(
m
′
,
w
′
)
(m', w')
(m′,w′)。
∵
m
\because m
∵m 是第一个被valid partner
w
w
w 拒绝的男人
∴
m
′
\therefore m'
∴m′ 在这之前没有被valid partner 拒绝过
m
′
m'
m′ propose in decreasing order 且
w
′
w'
w′ 是
m
′
m'
m′ 的一个valid partner。
因此对于
m
′
m'
m′,
w
>
w
′
w>w'
w>w′。
但是前面我们已经证明:对于
w
w
w,
m
′
>
m
m'>m
m′>m。
∴
\therefore
∴
(
m
′
,
w
′
)
(m', w')
(m′,w′) 是一个 unstable pair
这与前面假设
S
′
S'
S′ 矛盾
定理8:在一个 stable matching
S
∗
S^*
S∗ 中,所有女人的配偶都是 worst valid partner。
证明:(反证法)
假设
(
m
,
w
)
∈
S
∗
(m,w) \in S^*
(m,w)∈S∗ 其中
m
m
m 不是
w
w
w 的 worst valid partner。
那么存在一个 stable matching
(
m
′
,
w
)
∈
S
′
(m', w) \in S'
(m′,w)∈S′,其中
m
′
<
m
m'<m
m′<m。
假设在
S
′
S'
S′ 中
(
m
,
w
′
)
(m, w')
(m,w′).
∵
w
\because w
∵w 是
m
m
m 的best valid partner,
w
′
w'
w′ 是
m
m
m 的 valid partner
∴
\therefore
∴ 对于
m
m
m,
w
>
w
′
w>w'
w>w′
发现
(
m
,
w
)
∈
S
′
(m, w)\in S'
(m,w)∈S′ 是一个unstable pair
与前面假设
S
′
S'
S′ stable 矛盾
代码实现思路
算法时间复杂度 O ( n 2 ) O(n^2) O(n2),以下是代码思路:
parameter:
MenPref[m, i] denote
i
t
h
i^{th}
ith woman on man
m
m
m's preference list
WomenPref[w, i] denote
i
t
h
i^{th}
ith man on woman
w
w
w's preference list
以下四个操作 O ( 1 ) O(1) O(1):
- 找到一个 free man
- 对于一个男人 m m m,找到一个他没有求过婚的女人
- 知道一个女人 w w w 是否已经有配对,且这个配偶是谁
- 对于一个女人 w w w 和两个男人 m , m, m, m ′ m' m′,知道女人更喜欢谁
需要用到的数据结构:
-
∀ m \forall m ∀m, an array Next[m] is the position of the next woman he will propose to on his list. (初始:Next[m]=1)
*每次 propose MenPrefs[m, Next[m]]
Next[m]++ -
∀ w \forall w ∀w,an array Current[w] 是女人 w w w 现在的配偶。
-
生成一个 n × n n \times n n×n array Ranking[w, m]
row 是女人(按序号),column 是男人(按序号),entry是此男 人在女人那里的 ranking。
*每次只需要compare Rank[w, m] 与 Rank[w, m’]即可