stable matching 算法在实际中有很多应用,比如,约会配对,申请导师等等,下面给出这个算法的java实现.
package com;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
public class Algrithm {
/**
* @param args
*/
static File boy_file = new File("\\home\\usr\\boys_rankings.txt");
static File girl_file = new File(""\\home\\usr\\girls_rankings.txt");static HashMap<String,String> hashmap=new HashMap<String,String>();
static final int M=200;
static int t;
public static void main(String[] args) {
CreateHashMap(boy_file,"B");//创造Boy的哈希表
CreateHashMap(girl_file,"G");//创造Girl的哈希表
int partnerB[]=new int[M];
int partnerG[]=new int[M];
for(int s=0;s<M;s++)
{partnerB[s]=-1;
partnerG[s]=-1;
}
int m;
while(true)
{
for(int s=0;s<M;s++)
{
if(partnerB[s]!=-1)
System.out.print("B"+s+"配对的是"+"G"+partnerB[s]+" ");
else
System.out.print("B"+s+"现在还没有配对的人 ");
}
System.out.println("");
for(int s=0;s<M;s++)
{
if(partnerG[s]!=-1)
System.out.print("G"+s+"配对的是"+"B"+partnerG[s]+" ");
else
System.out.print("G"+s+"现在还没有配对的人"+" ");
}
if((m=isNull(partnerB))<0)
break;
int i=0;
for(;i<M;i++)
{
String possG=BoyLoveGirl(m,i);
int trial=Integer.parseInt(possG.replace("G", ""));//心仪的女孩的号码
System.out.println("B"+m+"心仪的是:G"+trial);
if(partnerG[trial]==-1)
{
System.out.println("G"+trial+"还没有对象,默认接受B"+m+"的请求");
partnerG[trial]=m;partnerB[m]=trial;//配对成功
System.out.println("B"+m+"中执行的次数为:"+(i+1));
break;
}
else
{
int indexB=partnerG[trial];//正在和女孩配对的男孩
int p,q;
p=getIndex(trial,m);//现在申请的男生的位置
q=getIndex(trial,indexB);//正在配对的男生的位置
if(p<q)
{
System.out.println("B"+m+"更适合G"+trial+",B"+indexB+"被淘汰");
partnerB[indexB]=-1;partnerB[m]=trial;partnerG[trial]=m;
System.out.println("B"+m+"中执行的次数为:"+(i+1));
break;
}
else
{
System.out.println("B"+m+"被G"+trial+"拒绝");
//不做任何操作
}
}
}
}
System.out.println("最终配对结果为:");
for(int i=0;i<M;i++)
{
System.out.println("B"+i+"配对的是:"+"G"+partnerB[i]);
}
}
private static void CreateHashMap(File file,String sex)
{
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
String tempString = null;
int line = 0;
// 一次读入一行,直到读入null为文件结束
while((tempString = reader.readLine()) != null) {
// 显示行号
int t;
System.out.println(t=tempString.indexOf(": "));
tempString=tempString.substring(t+2)+" 0";
System.out.println("line " + line + ": " + tempString);
String Line=sex+line;
System.out.println(Line);
hashmap.put(Line, tempString);
line++;
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (reader != null)
reader.close();
System.out.println("读取结束");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private static int isNull(int arr[])
{
int n=-1;
for(int i=0;i<arr.length;i++)
{
if(arr[i]==-1)
{
n=i;
break;
}
}
System.out.println("现在空的人是:"+n);
return n;
}
private static int getIndex(int g,int b)
{ String Girl="G"+g;
String BoyRanks=hashmap.get(Girl);
String Boys[]=BoyRanks.split(" ");
String Boy="B"+b;
int i;
for( i=0;i<M;i++)
{
if(Boys[i].equals(Boy))
break;
}
System.out.println("B"+b+"在女生G"+g+"的位置为"+i);
return i;
}
private static String BoyLoveGirl(int m,int n)//m为Boy的号码,n为Girl在Boy心中的位置
{
String Boy="B"+m;
String GirlRanks=hashmap.get(Boy);
String Girls[]=GirlRanks.split(" ");
String possGirl=Girls[n];//心仪的Girl;
return possGirl;
}
}