stable_matching算法的java实现.

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;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值