Gale-Shapely 匹配算法

老师说要用map

GG

这个算法的匹配思想很简单:

就是男士从最喜欢的女士开始表白

如果女士没有被配对,就在一起,如果女士配对了,看之前配对的男士和当前的男士哪个更优

一直进行到所有人都匹配了为止

package GSFianl;

public class Quee {
	public Node head;
	public Node tail;
	public Node pointer;
	public int size;
  public Quee(){
	   head=new Node();
	  tail=head;
	  size=0;
  }
  public void Add(String name)
  {
	  Node node=new Node(name);
	  tail.LinkNext(node);
	  tail=node;
	  size++;
  }
  public void Mov()
  {
	  head.LinkNext(head.next().next());
	  size--;
	 
  }
}
class Node{
	Node next;
	String value;
	public Node()
	{
		
	}
	public Node(String value){
		this.value=value;
	}
	 public void LinkNext(Node next) {  
	        this.next = next;  
	    }  
	public Node next()
	{
		return this.next;
	}
	public String value()
	{
		return this.value;
	}
}

package GSFianl;
import java.util.*;
public class Human {
   public String name;//名字
   public ArrayList<String>map_expect=new ArrayList<String>();//偏好表
   public String company="";//当前约会对象
   public boolean isFree=true;//是否自由,初始为自由
   public int rank=0;//求婚求到第几个人
   //方法
   public void date (String name)//与女孩配对
   {
	   company =name;
	   isFree =false;
	}
   public void part(String name )//与女孩分手
   {
	   company ="";
	   isFree =true;
	   rank++;
   }
}
class MatchingProcessing{
	public ArrayList<String> map_men;		
	public ArrayList<String > map_women;
	public  MatchingProcessing()
	{
	}
	public void Matching()
	{
		 map_men =new ArrayList<String>();
		 map_women =new ArrayList<String>();
	   Scanner input=new Scanner(System.in);
	   System.out.println("请输入对数"); 
	   int n=input.nextInt();
	   input.nextLine();
	   Human[] man=new Human[n];
	   for(int i=0;i<n;i++)
	   {
	      System.out.println("请输入男士的姓名");
	      man[i]=new Human();
	      man[i].name=input.nextLine();
	      map_men.add(man[i].name);
	      System.out.println("请输入男士喜爱的女士");
	      for(int j=0;j<n;j++)
	      {
	        String womanname=input.nextLine();
	        man[i].map_expect.add(womanname);
	      }
	      
	    }
	   Human[] woman=new Human[n];
	   for(int i=0;i<n;i++)
	   {
	      System.out.println("请输入女士的姓名");
	      woman[i]=new Human();
	      woman[i].name=input.nextLine();
	      map_women.add(woman[i].name);
	      System.out.println("请输入女士喜爱的男士");
	      for(int j=0;j<n;j++)
	      {
	        String manname=input.nextLine();
	        woman[i].map_expect.add(manname);
	      }
	      
	    }
	   
	  Quee queue=new Quee();//初始化男人队列,刚开始都是自由的,男人女人的状态初始化已经在构造函数中完成了
		 for(int i=0;i<map_men.size();i++)
			 queue.Add(map_men.get(i));
		 while (queue.size>0)
		 {//存在男人m是自由的且还没对每个女人都求过婚
		 // 从队列头取出第一个男人名,在man数组中找到信息
		 String name = queue.head.next().value;
		 Human choosenman=new Human();//被选召的男人
		   for(int i=0;i<n;i++)
		   {
			   if(man[i].name==name)
			   {
				   choosenman=man[i];
				   break;
			   }
		   }
		// 从其中意的女人名单中从高到低依次找非单身的date,此处在构造函数中保证偏好表已按照顺序排列 
		   
		   /*/Iterator<Map.Entry<String, Integer>> iter = choosenman.map_expect.entrySet().iterator();
		   String woname;
		    while (choosenman.map_expect.entrySet().iterator().hasNext()) {
		       woname = choosenman.map_expect.entrySet().iterator().next().getKey();
		       break;
		    }*/
            name=choosenman.map_expect.get(choosenman.rank);
            Human choosenwoman=new Human();
            for(int i=0;i<n;i++)
 		   {
 			   if(woman[i].name.equals(name))
 			   {
 				   choosenwoman=woman[i];
 				   break;
 			   }
 		   }
 		if (choosenwoman.isFree)
 		     {//w是自由的
 		      //(m,w)变成约会状态
 		      choosenwoman.date(choosenman.name);
 		      choosenman.date(choosenwoman.name);
 		      queue.Mov();//队列维护
 		     }
 		   else{//
 		       name=choosenwoman.company;
 			   Human dateman=new Human(); //w当前与m’约会
 			   for(int i=0;i<n;i++)
 			   {
 				   if(man[i].name.equals(name))
 				   {
 					   dateman=man[i];
 					   break;
 				   }
 			   }
 			   int choosenmanrank=0;
 			   int datemanrank=0;
 			   
 			  
 			   for(int i=0;i<choosenwoman.map_expect.size();i++)
 			    if(choosenwoman.map_expect.get(i).equals(choosenman.name))
 			    {
 			    	choosenmanrank=i;
 			    	break;
 			    }
 			 
 			  for(int i=0;i<choosenwoman.map_expect.size();i++)
 			  if(choosenwoman.map_expect.get(i).equals(dateman.name))
			    {
			    	datemanrank=i;
			    	break;
			    }
 		        if (choosenmanrank<datemanrank)
 		        {
 		          //w与m’分手
 		          choosenwoman.part(dateman.name);
 		         dateman.part(choosenwoman.name);
 		          queue.Add(dateman.name); //队列维护
 		           //w与m约会
 		           choosenwoman.date(choosenman.name);
 		           choosenman.date(choosenwoman.name);
 		           queue.Mov(); //队列维护
 		        }
 		        else//m要找下一个女朋友
 		        {
 		        	choosenman.rank++;
 		        }
		   }
		 
		   }
		   
		  System.out.println("匹配结果是:"); 
		 for(int i=0;i<n;i++)
		 {
			 System.out.println(man[i].name+"男士与 "+man[i].company+"女士匹配");
		 }
		   }
		 
			  
		 
      }


package GSFianl;
import java.util.Map;
import java.util.Scanner;
public class MainMethod {
	public static void main(String args[])
	{
      MatchingProcessing ma=new MatchingProcessing();
      ma.Matching();
		
	}

}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值