GS 稳定匹配算法 Java实现
来源:互联网 发布:奚梦瑶人品 知乎 编辑:程序博客网 时间:2024/05/16 11:32
算法描述
给定n个男人,n个女人,每个男人都有一张对所有女人的偏爱表,每个女人都有一张对所有的男人的偏爱表,要求设计一算法,产生一稳定匹配。
匹配过程
初始化所有的男人和女人都是自由的while (存在男人m是自由的且还没对每个女人都求过婚) 选择这样一个男人m 令w是m的优先表中m还没求过婚的最高排名的女人 if w是自由的 (m,v)变成约会状态 else w当前与m’约会 if w更爱m’(对比m) m保持自由 else w更爱m (对比m’) (m,v)变成约会状态 m’变成自由 endif endif
Java代码实现如下
GS类
import java.util.Arrays;public class GS { static int num = 4; static Woman women[] = new Woman[num]; static Man men[] = new Man[num]; public static void main(String[] args) { // 男女优先表 int menArray[][] = { { 2, 3, 1, 0 }, { 2, 1, 3, 0 }, { 0, 2, 3, 1 }, { 1, 3, 2, 0 } }; int womenArray[][] = { { 0, 3, 2, 1 }, { 0, 1, 2, 3 }, { 0, 2, 3, 1 }, { 1, 0, 3, 2 } }; System.out.println("男生的优先表"); for (int i = 0; i < num; i++) { Man m = new Man(); int a[] = {0,0,0,0}; for(int j=0; j<num; j++) a[j]=menArray[i][j]; System.out.println(Arrays.toString(a)); m.setRank(a); m.setId(i); men[i] = m; } System.out.println("女生的优先表"); for (int i = 0; i < num; i++) { Woman w = new Woman(); int a[] = {0,0,0,0}; for(int j=0; j<num; j++) a[j]=womenArray[i][j]; System.out.println(Arrays.toString(a)); w.setRank(a); w.setId(i); women [i]= w; } System.out.println("——————————————————"); Man theMan = null; while ((theMan = findMan(men)) != null) { pursue(theMan, women); for (int i = 0; i < num; i++) { System.out.println("男生" + i + "&" + "女生" + men[i].getPresent()); } System.out.println("——————————————————"); } System.out.println("GS finished"); } static Man findMan(Man[] men) { for (int i = 0; i < men.length; i++) { if (!men[i].isDate()) { System.out.println("单身男生" + i); return men[i]; } } System.out.println("没有单身男生"); return null; } static void pursue(Man m, Woman[] women) { Woman w = women[m.rank[m.getBetter()]]; System.out.println("想追女生" + w.getId()); if (!w.isDate()) { System.out.println("女生没有对象"); date(m, w); System.out.println("在一起"); } else { System.out.println("女生有对象"); if (pk(m, w)) { System.out.println("换男友"); date(m, w); } else { System.out.println("不换男友"); m.setBetter(m.getBetter() + 1); } } } static void date(Man m, Woman w) { if (!w.isDate()) { m.setDate(true); m.setPresent(w.getId()); w.setDate(true); w.setPresent(m.getId()); } else { m.setDate(true); m.setPresent(w.getId()); men[w.getPresent()].setDate(false); men[w.getPresent()].setPresent(100); w.setPresent(m.getId()); } } static boolean pk(Man m, Woman w) { System.out.println("优先表"+Arrays.toString(w.getRank())); int former = 100; for (int i = 0; i < num; i++) { if (w.getRank()[i] == w.getPresent()) { former = i; break; } } int later = 100; for (int i = 0; i < num; i++) { if (w.getRank()[i] == m.getId()) { later = i; break; } } System.out.println("前任排行" + former + " vs 挑战者排行" + later); if (later < former) { return true; } else { return false; } }}
Man类
public class Man { private int id; private int better = 0; // 追求过几位女生 int[] rank = {0,0,0,0}; private boolean date = false; private int present = 100; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getBetter() { return better; } public void setBetter(int better) { this.better = better; } public int[] getRank() { return rank; } public void setRank(int[] rank) { this.rank = rank; } public boolean isDate() { return date; } public void setDate(boolean date) { this.date = date; } public int getPresent() { return present; } public void setPresent(int present) { this.present = present; }}
Woman类
public class Woman { private int id; int[] rank = {0,0,0,0}; private boolean date = false; private int present = 100; public int getId() { return id; } public void setId(int id) { this.id = id; } public int[] getRank() { return rank; } public void setRank(int[] rank) { this.rank = rank; } public boolean isDate() { return date; } public void setDate(boolean date) { this.date = date; } public int getPresent() { return present; } public void setPresent(int present) { this.present = present; }}
运行结果如下
男生的优先表[2, 3, 1, 0][2, 1, 3, 0][0, 2, 3, 1][1, 3, 2, 0]女生的优先表[0, 3, 2, 1][0, 1, 2, 3][0, 2, 3, 1][1, 0, 3, 2]——————————————————单身男生0想追女生2女生没有对象在一起男生0&女生2男生1&女生100男生2&女生100男生3&女生100——————————————————单身男生1想追女生2女生有对象优先表[0, 2, 3, 1]前任排行0 vs 挑战者排行3不换男友男生0&女生2男生1&女生100男生2&女生100男生3&女生100——————————————————单身男生1想追女生1女生没有对象在一起男生0&女生2男生1&女生1男生2&女生100男生3&女生100——————————————————单身男生2想追女生0女生没有对象在一起男生0&女生2男生1&女生1男生2&女生0男生3&女生100——————————————————单身男生3想追女生1女生有对象优先表[0, 1, 2, 3]前任排行1 vs 挑战者排行3不换男友男生0&女生2男生1&女生1男生2&女生0男生3&女生100——————————————————单身男生3想追女生3女生没有对象在一起男生0&女生2男生1&女生1男生2&女生0男生3&女生3——————————————————没有单身男生GS finished
更多细节请参考:
http://download.csdn.net/detail/qq_32962727/9766885
0 0
- GS 稳定匹配算法 Java实现
- 稳定匹配问题与GS算法(单身狗脱单秘籍)
- Marriage is Stable (稳定婚姻匹配GS算法)
- 稳定匹配算法python实现
- 稳定婚姻匹配 G-S算法 JAVA和C++实现
- 稳定匹配算法 C 语言实现
- 【算法】稳定匹配二(JAVA版)
- 算法-稳定匹配
- 稳定匹配 G-S算法
- 【算法】稳定匹配(C++版)
- [算法]Gale-Shapley Algorithm-稳定匹配算法的设计、实现与探讨(上)
- [算法]Gale-Shapley Algorithm-稳定匹配算法的设计、实现与探讨(下)
- Stable Matching Problem稳定匹配问题-----稳定婚姻算法
- Stable Matching Problem稳定匹配问题-----稳定婚姻算法
- 稳定匹配问题——稳定婚姻算法设计
- 求婚拒绝算法(GS算法)的Python实现
- 稳定的匹配算法–Gale-Shapley
- 字符匹配KMP算法 java实现
- how to make 1px border
- error: failed to load 'image-marlin-nof26v.zip': Not enough space
- MySQL备忘(转载+整理)
- android.widget.LinearLayout cannot be cast to android.app.Activity处理
- 15.1 网络编程(1)
- GS 稳定匹配算法 Java实现
- 安卓界面高级组件-----拖动条和评星条
- Dom
- pure-ftpd 搭建自己的FTP服务器
- 安装WAS8随记
- codeforces 717 G. Underfail(费用流,好题)
- OpenCV 及 OpenCV Samples 在 Window, Linux上的编译及使用
- DOM对象—节点的详解(一)
- 十:Java语言基础组成——函数