最近在认真专研匹配算法,同学给推荐了这个算法,感觉不错。不过,先前有很多大神已经写过这个算法的介绍了,我这当晚辈的,迟迟不敢动笔怕班门弄斧。但是呢?如果有前辈看我写得一塌糊涂看不下去了给我指点一点两点,那就是真的赚到啦!
首先看看德高望重的David Gale老教授。Gale老教授研究的领域主要有数理经济学、博弈论和凸分析。
他在数理经济学中的主要贡献有:1.the existence of competitive equilibrium(竞争均衡的存在性);2.the solution of the n-dimensional Ramsey problem(n维拉姆齐定价,垄断厂商的定价) 3.the theory of linear programming and linear inequalities(线性模型和编程领域)
1962年的时候Gale和Lloyd Shapley撰写的关于 Stable Marriage Problem的论文是“the first formal statement and proof of a problem that has far-reaching implications in many matching markets”.原文链接如下:College admissions and the stability of marriage (with L.S. Shapley). American Mathematical Monthly 69 (1962), pp. 9–15 这个来自1962年的思想值得细细品味。
那么这个匹配是如何做到稳定的呢?
根据wikipedia上的算法介绍,上述算法可以进行如下编程,由于我是统计专业,所以暂时用R语言进行编程:
X_M<-matrix(rep(0,100),10,10) #站在男性视角的喜爱程度,X_M[i,j]代表第i个男生对第j个女生的喜欢程度
a<-1:10
for(i in 1:10){
X_M[i,]<-sample(a,10) #喜欢程度随机生成,以1-10的数字表示,数字越高,喜欢程度越大
}
X_M1<-X_M
X_F<-matrix(rep(0,100),10,10) #站在女性视角之上,原理同上
for(i in 1:10){
X_F[i,]<-sample(a,10)
}
X_F
X_F1<-X_F
match<-rep(0,10) #站在男性视角之上的匹配结果,初始为0向量,match[i]=j 代表第i个男生与第j个女生配对成功
while(length(which(match==0))!=0){
waitboy<-min(which(match==0))
i<-waitboy
max<-which.max(X_M[i,])#第i个男生最喜欢的女生编号
if(length(which(max==match))>0){ #呀,冲突了
preboy<-which(match==max)#姑娘的前男友
if(X_F[max,i]>X_F[max,preboy]){#如果姑娘的前男友被比下去了
match[i]<-max
match[preboy]<-0
}else{#如果姑娘的前男友胜利啦
X_M[i,max]<-0
}
}else{
match[i]<-max}
}
#总体匹配效果为:
fit1<-0
fit2<-0
for(i in 1:10){
fit1<-fit1+X_M1[i,match[i]]
fit2<-fit2+X_F1[match[i],i]}
结果展示:
X_M
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 8 10 1 5 6 3 4 7 9 2
[2,] 4 10 1 8 3 7 2 5 6 9
[3,] 8 3 1 9 5 2 10 6 4 7
[4,] 7 2 8 1 4 5 9 3 6 10
[5,] 3 9 2 10 6 4 5 7 1 8
[6,] 4 1 3 8 7 5 10 9 2 6
[7,] 4 3 10 2 5 1 7 8 6 9
[8,] 6 8 5 4 7 1 9 2 10 3
[9,] 2 6 9 8 7 5 4 1 3 10
[10,] 10 2 5 8 6 1 3 4 7 9
>
X_F
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 10 7 5 2 6 1 3 4 8 9
[2,] 2 6 4 7 5 1 3 10 8 9
[3,] 5 6 4 1 7 9 10 3 8 2
[4,] 3 9 4 1 2 7 5 6 10 8
[5,] 10 7 9 1 5 6 4 8 3 2
[6,] 8 5 2 10 9 6 4 3 1 7
[7,] 7 3 10 2 6 4 5 8 9 1
[8,] 7 2 5 3 1 9 10 4 6 8
[9,] 9 10 4 1 2 6 3 5 7 8
[10,] 6 5 8 7 10 3 1 9 4 2
>
match
[1] 1 9 7 6 10 8 3 2 4 5
> fit1
[1] 94
> fit2
[1] 63
1.这个默认的喜好排序能通过引入机器学习来自动进行呢?
2.好吧,如果是机器学习就用不到这个算法了
3.先站在男性视角考虑的结果是,男性的满意度比女性高很多(fit1>fit2),估计我只学到算法皮毛