问题导入

一共有N位男士和N位女士,每个人都要选择结婚对象。如果有两对夫妻M1F2,M2F1。M1心目中更喜欢F1,但是他和F2结婚了,M2心目中更喜欢F2,但是命运却让他和F1结婚了,显然这样的婚姻是不稳定的,随时都可能发生M1和F1私奔或者M2和F2私奔的情况。为保证不会出现出轨的情况,根据个人对异性的排名情况匹配对象,使得每对情侣在结婚后婚姻状况稳定。

基本要求: boys 和 girls 各自给出自己心仪的嘉宾的顺序,请编写程序求出一种

稳定的匹配,使匹配结果不会发生私奔现象。


盖尔和沙普利争对这种问题研究了一个算法

盖尔-沙普利算法(Gale-Shaley algorithm)简称 “GS算法”,也称为 “延迟接受算法”(deferred-acceptance algorithm),是盖尔和沙普利为了寻找一个稳定匹配而设计出的市场机制。市场一方的对象 Ai,i=1,2,...,m 向另一方的对象 Bj,j=1,2,...,n 发出邀约,每个 Bj 会对接到的邀约进行比较,保留自己认为最好的,拒绝其它的。邀约被拒绝的 Ai 继续向其它的 Bj 发出新的邀约,直到没有 Ai 希望再发出邀约为止。此时各 Bj 才最终接受各自保留的邀约。该算法的一个关键之处在于,合意的邀约不会立即被接受,而只是暂时保留不被拒绝,也就是 “延迟接受”。

问题分析

本题主要是争对从男性优先发出邀约选择,女士来接受或拒绝,匹配的结果对发出邀约方有利,即男性找到的配偶满意度高。

第一轮

每个男生都对自己心中满意名单的第一位女生发出追求请求。此时有两种状态。

  • 该女生没有被如何男生追求过,那么就接受这位男生。
  • 该女生已经有了对象,此时这个女生有选择的权力,即反向选择。
  1. 如果这位新追求者在该女生心中排名高于现有对象,那么这个女生的对象变为这个新的追求者。
  2. 如果这位新追求者在该女生心中排名低于现有对象,那么这个女生的对象不变。

第二轮

没有对象的男生(没争过或者是被横刀夺爱的)再从除了已经追求过的女生中再追求心中比较喜爱的再次追求重复上面两种操作。直到所有人都拥有配偶。


证明算法的可行性

随着轮数的增加,单身的男生不断的向自己心目中的排行榜单女生追求。如果有一个人没有配上对,说明他肯定和所有女生表白了。但是只要被表白的女生就不可能是单身,对于人数相同的男女来说这是不符合的。


详细步骤

  • 每轮男生都要向自己心目中(除追求过的)排名最高的女生追求(建立一个数组,数组值记录被追求女生过的排名到哪里了)
  • 分别为男女生建立一个二维数组[][j],j为心目中的排名,其中值为女生号,即哪个女生
  • 女生要存放自己的现男友是谁(建立一个数组,数组值记录女生的现男友),用来和追求者相比
  • 男生要存放现女友是谁为了判断有没有男生是单身的(建立一个数组,数组值记录男生的现女友)如果值为0就没有女朋友

代码

#include<stdio.h>
#include<iostream>
bool finish_or_not(int, int *);
bool current_male_is_better(int num, int *girlper, int current, int chasing);
int main(){int num=0;int i,j;printf("请输入需要配对的对数:");scanf("%d",&num);if(num==0){   printf("没有人数无法匹配,请重新输入匹配对数:");scanf("%d",&num);
}int boyper[num][num];//定义一个数组存放女生在男生心中的排位 int girlper[num][num];//定义一个数组存放男生在女生心中的排位 for (int i = 0; i < num; i++){printf("男生%d心中的女生排行:",i+1); for (int j = 0; j < num; j++){scanf("%d",&boyper[i][j]);}}for (int i = 0; i < num; i++){printf("女生%d心中的男生排行:",i+1); for (int j = 0; j < num; j++){scanf("%d",&girlper[i][j]);}}//定义一个数组来存放各男女的对象其中i为其对应数组位置,内容为其对象的号,也就是从一开始的号,所以初始化为0代表他们都没有对象 int *girlbf = new int[num];// int *boygf = new int[num];for (int i = 0; i < num; i++){girlbf[i] = 0;boygf[i] = 0;}//现任//为了保证追求过的不再重复追求,男性渴望追求的偏好女性在不断更新int *boyml= new int[num];for (int i = 0; i < num; i++){boyml[i] = 0;//初始大家都为0 从偏好数组第一位开始 i为这个男生的对应数组位置,内容用于约会女生的对于位置 } while(finish_or_not(num, boygf)==false){//有男生存在没对象 for (int i=0;i<num;i++){//按序号遍历所有男生看看谁没有 if (boygf[i]==0){//如果某男士没有对象printf("男生%d没有对象,可追求女生!\n",i+1); //优先追求偏好高的女生 int boychase = boyper[i][boyml[i]];//存储当前男生还未追求的最高偏好女性的号即是哪个女生 (boychase)//判断这个女生有没有现任 int boychasebf = girlbf[boychase-1];//存储当前追求的女士的对象(boychasebf)(号)    数组位置=号-1 (boychase-1)printf("男生%d准备追偏好的女生%d\n",i+1,boychase);//i+1号 if (boychasebf!=0){//如果为0就是没男朋友为其他数字就是男朋友是哪个 printf("被追求女生的现任是%d\n", boychasebf);//判断是否稳定 if (current_male_is_better(num, girlper[boychase-1],boychasebf, i+1)){ //数组,被追求的女性的偏好,当前对象,追求男的号 printf("被追求女生更喜欢现任!\n");//false }else{//如果该男生比该男生准备追求的女士的现任在心目中更好 tureboygf[boychasebf-1]=0;//女孩现任变成单身 boygf[i] =boychase;//该男士的对象变成准备追求的女士 girlbf[boychase-1]=i+1;//女士的对象变成该男士printf("男生%d横刀夺爱和女生%d在一起了!\n",i+1,boychase);}}else{printf("被追求的女生是单身\n"); boygf[i] =boychase;//该男士的对象变成准备追求的女士 girlbf[boychase-1]=i+1;//女士的对象变成该男士printf("男生%d和女生%d在一起了!\n",i+1,boychase);}boyml[i]++;//该男生的偏好移动,这个女生已经追过 }}}for (int i=0; i<num;i++){printf("男生%d和女生%d最后走到一起 \n",i+1,boygf[i]);}} bool finish_or_not(int num, int *boygf){for (int i=0; i<num;i++){if (boygf[i]==0){//判断是否全部完成配对 printf("有可配对的单身人士");return false;}}printf("全部配对完成\n");return true;
}
//比较某女士现在的对象和追求者哪个在她心目中排行更高
//数组参数是一维(是一位女士的优先表而不是所有女士的优先表)
bool current_male_is_better(int num, int *girlper, int current, int chasing){ //数组,被追求的女性的偏好,当前原来对象,追求男的号  int rank_of_current, rank_of_chasing;//现任排行与追求者排行 for (int i = 0; i < num; i++){if (girlper[i]==current){rank_of_current = i+1;//位数 }if (girlper[i]==chasing){rank_of_chasing = i+1;}}printf("在女士心目中现任排名是: %d,而追求者排名则是: %d\n",rank_of_current,rank_of_chasing);if (rank_of_current < rank_of_chasing) return true;//更偏好原对象elsereturn false;//新追求者
}

婚姻匹配问题---盖尔-沙普利(Gale-Shapley)稳定匹配算法相关推荐

  1. 算法 | 盖尔-沙普利(Gale-Shapley)婚姻稳定匹配算法

    盖尔-沙普利[Gale-Shapley]婚姻稳定匹配算法 1 背景说明 2 原理及思路 2.1 问题的描述 2.2 盖尔-沙普利算法的思路 3 程序实现 4 结果分析 5 后记 概要: 本文将要介绍的 ...

  2. SGU 264 Travel(稳定婚姻匹配)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=264 题意:稳定婚姻匹配. 思路:对于每个男的依次从自己最喜欢的女的开始求婚若女的还 ...

  3. 稳定婚姻匹配(Stable Match, HDOJ 1435, HDOJ 1914, 详解)

    稳定婚姻匹配 HDOJ 1435 Stable Match(此例基于发射点优先的匹配,但题目并未明确表明) Time Limit: 2000/1000 MS (Java/Others) Memory ...

  4. Hdu1914稳定婚姻匹配

    题意: 给出 n 个男生,n 个女生,给出他们对异性的喜欢顺序,求一个稳定的婚姻组合. 思路: 稳定婚姻匹配裸题 #include <cstdio> #include <cstrin ...

  5. HDU 1435 Stable Match (稳定婚姻匹配)

    题意:建立一个匹配表,使得一个发射点对应一个接收点,对于某一个发射点来说,它的接收点离它越近那么就会更稳定,同样对于接收点也是一样的情况. 匹配的目标是使得整个网络变得稳定. 对于某2个匹配,比如,( ...

  6. HDU 1522 Marriage is Stable (稳定婚姻匹配)

    题意:稳定婚姻匹配问题,板子题. 题解:稳定婚姻匹配 还好做了这题,之前的板子有点问题,1435数据太弱了. #define _CRT_SECURE_NO_WARNINGS #include<i ...

  7. HDU 1914 The Stable Marriage Problem (稳定婚姻匹配)

    题意:稳定婚姻匹配问题,板子题. 题解:稳定婚姻匹配 注意按字典序输出,还有输出格式,最后个样例不输出空行. #define _CRT_SECURE_NO_WARNINGS #include<i ...

  8. Marriage is Stable 【HDU - 1522】【稳定婚姻匹配问题】

    题目链接 什么是婚姻匹配问题呢?我做了这道题后就有了这样的体会 -- 比谁更渣??? 我们知道,有N个男生还有N个女生,要把每个男生和女生匹配起来,让他们结婚,但是呢,有这样的情况,就是假如我们现在B ...

  9. ALG1:GS算法,稳定婚姻匹配问题

    ALG1:GS算法,稳定婚姻匹配问题 问题描述如下: (详见NKU计算机上机课程辅助评测) 稳定婚姻匹配 实现代码: (此代码逻辑可通过全部测试样例) 由于代码有一段时间了,一下的展示代码是没有自己的 ...

最新文章

  1. Nutch之初体验(1)
  2. 关于Excel导入的问题记录
  3. CMA-ES 算法初探
  4. VTK:Utilities之Coordinate
  5. BZOJ2199: [Usaco2011 Jan]奶牛议会
  6. IPM: Generate IP Product via template
  7. 给出一个正整数 nnn,请你计算从 111 到 nnn 的所有正整数中,有多少个数字的各位数和是 999,Java
  8. reactor设计模式 1
  9. ReverseFind
  10. python写前端和js_Python之路【第十二篇】前端之jsdomejQuery
  11. Bootstrap导航条中组件的排列
  12. C语言程序项目计划书,(C语言程序设计课程设计计划书.doc
  13. 分布式微服务开发_想要精通分布式微服务架构?你得先学会设计、原理与实战...
  14. MATLAB函数 zp2tf详解
  15. tween.js的使用
  16. 点击a标签实现下载文件
  17. 南京大学计算机科学与技术系陈东东,南京大学2016年硕士生学业奖学金评审结果计算机科学与技术系...
  18. mysql数据库运维月报_微运维weadmin快速上手手册.doc
  19. [linux thermal] thermal device tree
  20. [读书笔记]Spring中的容器设计详解

热门文章

  1. Python入门机器学习
  2. [数据结构C语言] 复杂度的计算
  3. 9.3 Python图像处理之图像数学形态学-灰度形态学
  4. 移动硬盘不能识别的解决办法
  5. Linux C 字符串操作
  6. java 下拉列表加日期,javascript 下拉框显示当前日期
  7. 【计算机科学】【2009.05】基于神经网络的系统辨识及其在暖通空调系统(HVAC)中的应用研究
  8. 知识产权保护与知识传播
  9. 子div浮动,父div宽度设置100%
  10. 通达信板块监控指标_通达信主力监控系统主图/副图指标公式