Stable Match:Gale-Shapley algorithm(Implementation)
Programing:
Implement Gale-Shapley algorithm of the Stable Matching Problem in your favorite language, and give the matching result of attached ranking data (boys rankings.txt and girls rankings.txt), supposing that the ranking is sorted from high to low.
这是一道经典的算法题,下面是该算法的伪代码:
1: for m = 1 to M do
2: partner[m] = NULL
3: end for
4: for w = 1 to W do
5: partner[w] = NULL
6: end for
7: while TRUE do
8: if there is no man m such that partner[m] = NULL then
9: return;
10: end if
11: select such a man m arbitrarily;
12: w= the first woman on m′s list to whom m have not yet proposed;
13: if partner[w] == NULL then
14: partner[w] = m; partner[m] = w;
15: else if w prefers m to state[w] then
16: partner[ partner[w] ] = NULL; partner[w] = m; partner[m] = w;
17: else
18: ; //do nothing means simply rejecting m;
19: end if
20: end while
根据该伪代码,使用java做如下实现,对stable match问题感兴趣的同学可以试试,挺好玩的。
点击(此处)折叠或打开
-
public class GaleShapleyAlgorithm {
-
public static final int numberOfPairs = 200;
-
public static String boysRank[][] = new String[numberOfPairs][numberOfPairs+1];//保存男生对女生的兴趣度排序
-
public static String girlsRank[][] = new String[numberOfPairs][numberOfPairs+1];//保存女生对男生的兴趣度排序
-
public static String partnerM[][] = new String[numberOfPairs][2];//保存男生对女生的匹配结果
-
public static String partnerW[][] = new String[numberOfPairs][2];//保存女生对男生的匹配结果
-
// 初始化boysRank二维数组和partnerM二维数组
-
public static void boysRank(String boysRank1[][]){
-
int numberOfMan = boysRank1[0].length-1;
-
for(int i=0; i<numberOfMan; i++){
-
for(int j=0; j<numberOfMan+1; j++){
-
boysRank[i][j] = boysRank1[i][j];
-
}
-
}
-
for(int i=0; i<partnerM.length; i++){
-
partnerM[i][0] = boysRank[i][0];
-
partnerM[i][1] = "null";
-
}
-
}
-
// 初始化girlsRank二位数组和partnerW二维数组
-
public static void girlsRank(String girlsRank1[][]){
-
int numberOfW = girlsRank1[0].length-1;
-
for(int i=0; i<numberOfW; i++){
-
for(int j=0; j<numberOfW+1; j++){
-
girlsRank[i][j] = girlsRank1[i][j];
-
}
-
}
-
for(int i=0; i<partnerW.length; i++){
-
partnerW[i][0] = girlsRank[i][0];
-
partnerW[i][1] = "null";
-
}
-
}
-
-
//stable match:Gale-Shapley-Algorithm具体实现
-
public static void stableMatch(){
-
while(true){
-
if(ifPartnerNull(partnerM)){
-
break;
-
}
-
for(int i=0; i<partnerM.length; i++){
-
// 尚未配对的男生
-
if(partnerM[i][1].equals("null")){
-
// 寻找配对伴侣
-
for(int j=1; j<boysRank[0].length; j++){
-
// 第j个女生是 该男生尚未求婚的第一个女生,向j求婚
-
if(!boysRank[i][j].equals("null")){
-
int index = searchArray(partnerW,boysRank[i][j]);
-
// 女生j尚未配对
-
if(partnerW[index][1].equals("null")){
-
partnerM[i][1] = boysRank[i][j];
-
partnerW[index][1] = partnerM[i][0];
-
boysRank[i][j] = "null"; // 求过婚 则设置null
-
break;
-
}
-
// 女生j已经配对,但是她更喜欢男生i
-
else if(ifWPerferM(index,partnerW[index][1],partnerM[i][0])){
-
int oldManindex = searchArray(partnerM,partnerW[index][1]);
-
partnerM[i][1] = boysRank[i][j];
-
partnerW[index][1] = partnerM[i][0];
- boysRank[i][j] = "null"; // 求过婚 则设置null
-
// 被踢掉的男生的 partner设置为null
-
partnerM[oldManindex][1] = "null";
-
break;
-
}
-
else{
-
boysRank[i][j] = "null";
-
break;
-
}
-
}
-
}
-
}
-
}
-
}
-
}
-
// 判断女生是更喜欢当前求婚男生还是更喜欢已经配对的男生
-
public static boolean ifWPerferM(int womanIndex,String man, String perferMan){
-
int manIndex = -1;
-
int perferManIndex = -1;
-
for(int i=1; i<girlsRank[0].length; i++){
-
if(girlsRank[womanIndex][i].equals(man)){
-
manIndex = i;
-
}
-
if(girlsRank[womanIndex][i].equals(perferMan)){
-
perferManIndex = i;
-
}
-
}
-
if(perferManIndex < manIndex){
-
return true;
-
}else{
-
return false;
-
}
-
}
-
// 查询特定值在二维数组中的位置
-
public static int searchArray(String array[][],String value){
-
int index= -1;
-
for(int i=0; i<array.length; i++){
-
if(array[i][0].equals(value)){
-
return i;
-
}
-
}
-
return index;
-
}
-
// 是否有某位男生或者女生还没有配对
-
public static boolean ifPartnerNull(String partner[][]){
-
for(int i=0; i<partner.length; i++){
-
if(partner[i][1].equals("null")){
-
return false;
-
}
-
}
-
return true;
-
}
-
public static void main(String[] args) throws IOException {
-
// TODO Auto-generated method stub
-
String girlsRankFilePath = "F:\\ Assignm1\\data-200pairs\\girls_rankings.txt";
-
String boysRankFilePath = "F:\\ Assignm1\\data-200pairs\\boys_rankings.txt";
-
String boysRank1[][] = TxtFileOp.readTxtFile(boysRankFilePath);
-
boysRank(boysRank1);
-
String girlsRank1[][] = TxtFileOp.readTxtFile(girlsRankFilePath);
-
girlsRank(girlsRank1);
-
stableMatch();
-
TxtFileOp.writeToTxt(partnerM, "partnerM.txt");// 将结果写入文件
-
TxtFileOp.writeToTxt(partnerW, "partnerW.txt");
-
}
- }
男生对女生的兴趣度排序数据:

女生对男生的兴趣度排序数据:

算法最终输出结果文件:

