GS算法,求婚拒绝算法
2008-09-15 22:02
218 查看
写一下大概算法
while 存在男人m是自由的且还没对每个女人都求过婚
选择这个男人m
令w是m的优先表中还没求过婚的最高排名的女人
if w是自由的
(m,w)变成约会状态
else w当前与m1约会
if w更偏爱m1而不爱m
m保持自由
else w更偏爱m而不爱m1
(m,w)变成约会状态
m1变成自由
endif
endif
endwhile
package algorithm;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
public class Stablematch {
//这个方法返回了当前男人在女人优先表中的位置
private static int index(int[][]array,int NowManNo,int WoManNo,int Number)
{int index=-1;
for(int i=0;i<Number;i++)
{ if(array[WoManNo][i]==NowManNo)
{ index=i;
break;
}
}
return index;
}
public static void main(String args[])
{
//存储男人相对女人的优先表
//先输入参与匹配的男人和女人的人数
System.out.println("请输入参与匹配的男人和女人的数目");
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
int[][] MPW=new int[number][number];
int[][] WPM=new int [number][number];
int[][] pair=new int [number][number];
try {
Scanner scf = new Scanner(new File("data.txt"));
for(int i=0;i<number;i++)
for(int j=0;j<number;j++)
{
MPW[i][j]=scf.nextInt();
}
for(int i=0;i<number;i++)
for(int j=0;j<number;j++)
{
pair[i][j]=0;
}
for(int i=0;i<number;i++)
for(int j=0;j<number;j++)
{
WPM[i][j]=scf.nextInt();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch blok
e.printStackTrace();
}
Stack Manfree=new Stack<Integer>();
ArrayList Womenfree=new ArrayList <Integer>();
int[] Next=new int [number];//在优先表上下一个要选择的女人
int[] current=new int [number];//当前女人选择约会的男人
for(int i=0;i<number;i++)
{Next[i]=0;
current[i]=-1; //初始情况下没有约会
}
for(int i=0;i<number;i++)
{Manfree.push(i);
Womenfree.add(i);
}
while(!Manfree.isEmpty())
{ Integer ManNo=(Integer)Manfree.peek();
int ManNum=ManNo.intValue();
int MWW=MPW[ManNum][Next[ManNum]];
if(Womenfree.contains(MWW))
{
pair[MWW][ManNum]=1;
current[MWW]=ManNum;
Manfree.pop();
Womenfree.remove((Integer)MWW);
}
else //判断这个女人当前男人与当前求婚的男人做个比较
if(index(WPM,ManNum,MWW,number)<index(WPM,current[MWW],MWW,number))
{
pair[MWW][ManNum]=1;
Manfree.pop();
Manfree.push((Integer) current[MWW]);
current[MWW]=ManNum;
Womenfree.remove((Integer)MWW);
}
Next[ManNum]++;
}
for(int i=0;i<number;i++)
for(int j=0;j<number;j++)
{
System.out.println( pair[i][j]);
}
}
}
while 存在男人m是自由的且还没对每个女人都求过婚
选择这个男人m
令w是m的优先表中还没求过婚的最高排名的女人
if w是自由的
(m,w)变成约会状态
else w当前与m1约会
if w更偏爱m1而不爱m
m保持自由
else w更偏爱m而不爱m1
(m,w)变成约会状态
m1变成自由
endif
endif
endwhile
package algorithm;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
public class Stablematch {
//这个方法返回了当前男人在女人优先表中的位置
private static int index(int[][]array,int NowManNo,int WoManNo,int Number)
{int index=-1;
for(int i=0;i<Number;i++)
{ if(array[WoManNo][i]==NowManNo)
{ index=i;
break;
}
}
return index;
}
public static void main(String args[])
{
//存储男人相对女人的优先表
//先输入参与匹配的男人和女人的人数
System.out.println("请输入参与匹配的男人和女人的数目");
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
int[][] MPW=new int[number][number];
int[][] WPM=new int [number][number];
int[][] pair=new int [number][number];
try {
Scanner scf = new Scanner(new File("data.txt"));
for(int i=0;i<number;i++)
for(int j=0;j<number;j++)
{
MPW[i][j]=scf.nextInt();
}
for(int i=0;i<number;i++)
for(int j=0;j<number;j++)
{
pair[i][j]=0;
}
for(int i=0;i<number;i++)
for(int j=0;j<number;j++)
{
WPM[i][j]=scf.nextInt();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch blok
e.printStackTrace();
}
Stack Manfree=new Stack<Integer>();
ArrayList Womenfree=new ArrayList <Integer>();
int[] Next=new int [number];//在优先表上下一个要选择的女人
int[] current=new int [number];//当前女人选择约会的男人
for(int i=0;i<number;i++)
{Next[i]=0;
current[i]=-1; //初始情况下没有约会
}
for(int i=0;i<number;i++)
{Manfree.push(i);
Womenfree.add(i);
}
while(!Manfree.isEmpty())
{ Integer ManNo=(Integer)Manfree.peek();
int ManNum=ManNo.intValue();
int MWW=MPW[ManNum][Next[ManNum]];
if(Womenfree.contains(MWW))
{
pair[MWW][ManNum]=1;
current[MWW]=ManNum;
Manfree.pop();
Womenfree.remove((Integer)MWW);
}
else //判断这个女人当前男人与当前求婚的男人做个比较
if(index(WPM,ManNum,MWW,number)<index(WPM,current[MWW],MWW,number))
{
pair[MWW][ManNum]=1;
Manfree.pop();
Manfree.push((Integer) current[MWW]);
current[MWW]=ManNum;
Womenfree.remove((Integer)MWW);
}
Next[ManNum]++;
}
for(int i=0;i<number;i++)
for(int j=0;j<number;j++)
{
System.out.println( pair[i][j]);
}
}
}
相关文章推荐
- 求婚拒绝算法(GS算法)的Python实现
- GS 稳定匹配算法 Java实现
- 接受拒绝算法-rejection sampling
- 雅虎再次拒绝微软求婚 理由仍是低估价值"彩礼"少
- 我拒绝了他100次,第101次,他拒绝了我——有兴趣可以做做我前面的算法题
- 稳定匹配问题与GS算法(单身狗脱单秘籍)
- 施密特正交化(GS)相位提取算法-----MATLAB实现
- 稳定婚姻问题专题小结(二分图匹配 稳定婚姻问题--延迟拒绝算法(Gale-Shapley 算法))
- 字符相关算法(二)
- [数据结构与算法]白话经典算法系列之五 归并排序的实现
- 基础算法-全排列
- 当推荐算法开源包多如牛毛,为什么我们还要专门的推荐算法工程师
- 目标检测算法SSD在Ubuntu+CPU下运行
- 算法之二分查找
- 一种细化算法及其与opencv的实现
- 数据结构课程要求算法--线性表(1.创建和删除)
- 九章算法面试题65 拓扑排序
- 算法系统学习-1排序-冒泡排序
- 地形高度算法小结
- 算法:打印出所有不同的排列