假设有三男(分别是 A ,B ,C )和三女(分别是 x,y ,z ),他(她)们对异性的心仪程度如对话框所示。

比如对于男 A 来说,心仪对象排名为 x 排第一,y 排第二,z 排第三。

今天是特殊节日,你化身为丘比特,来设计一个算法分配对象。

立即接受算法

下面以男生主动追求对象为例来讲解 立即接受算法。

一开始男生们都去追求自己 最 心仪的女生,而女生们面对追求者们立刻做出决定确定对象(如果有多个追求者则选择他们之前心仪程度更高的那个,只有一个的话那就只能选他)。

然后,被拒绝的男生们马上再去追求第二心仪的女生,以此类推,直到配对完毕,如动图所示。

这样做法有一个很严重的问题:当你被你的 No.1拒绝后,再去追求你的 No.2 的时候,你心中的 No.2 可能已经在第一轮中选择了其他人,比如男生 B 在第一轮去表白女生 x,表白失败后想去追求 y,但女生 y 已经和 C 在一起了,悲剧的是 y 眼中的真命天子正是一开始没来表白的男生 B。

最终的匹配情况如下图所示。

虽然现在匹配结束出结果了,每个男生和女生都有对象,但是会出现以下情况。

对于男生 B 来说,虽然他和女生 z 在一起,但其实他更期望和 y 在一起(注意 A 与 x 都是双方的挚爱,拆不开的)。

同时,对于女生 y 来说,虽然她和男生 C 在一起,但其实她更期望和 B 在一起。

即男生 B 和女生 y 都更愿意离开自己的现任对象而彼此在一起。

所以,使用立即接受算法匹配后的结果是一种不稳定的状态结果。

延迟接受算法

“盖尔-沙普利算法”(the Gale-Shapley algorithm),也被称为“延迟接受算法”(deferred-acceptance algorithm),简称“GS算法”。

目前该算法在 高中择校系统、肾脏移植 等实际应用上起到了巨大的作用,你甚至可以在 2012 年诺贝尔经济学奖中看到它的身影。

这个算法一个核心之处在于,合意的要约不会立即被接受,而只是被“抓住”(hold on to),也就是“延迟接受”。

还是以男生主动追求对象为例来讲解 延迟接受算法。

首先每个男生在第一轮中向自己最心仪的女生表白,但是各位女生不用立即做决定,而是先 hold 住。

第一轮

第一轮,男生 A 和男生 B 都跟女生 x 表白,女生 x 按捺激动的心情,矜持没有表态直接选男生 A,只是把男生 A 放入考察范围

男生 C 跟女生 y 表白,女生 y 略显失望,但把男生 C 放入了考察范围。

第二轮

第二轮,每个男生再向心中的 No.2 示爱。并且从第二轮开始,每位女生们只保留自己到现在为止所收获的最心仪的男生(但是不用答应他,只hold在心里),而拒绝其他所有人。

而被拒绝的男生(也就是现在尚没有女生 hold 你的男生)则继续在下一轮中向心中排名的下一个女生表白。

以此类推,一轮轮继续下去,直到所有想示爱的男生都示完为止。

最后,每个女生手里都有 hold 的对象。

使用 延迟接受算法 后,最终 A - x ,B - y ,C - z 在一起,并且在这 6 人中,你不可能找到一男一女符合以下条件:他(她)们都更愿意抛弃已有的对象而与彼此在一起。

使用 延迟接受算法 匹配后的结果是一种稳定的状态结果。

结尾语

最后回到标题,对于爱情问题,上面的盖尔-沙普利算法至少告诉我们一点:

延时接受更容易找到更好的人,把自己变得更优秀才能遇到更加匹配自己水平的对象。

最后,主动追求比被动等待更有希望获得幸福!

我就知道你在看!

沙普利算法的java实现_盖尔-沙普利算法告诉你,你的对象在哪里?相关推荐

  1. 维特比算法的java实现_维特比算法通俗明白

    维特比算法说白了就是动态规划实现最短路径,只要知道"动态规划可以降低复杂度"这一点就能轻松理解维特比算法维特比算法是一个特殊但应用最广的动态规划算法,利用动态规划,可以解决任何一个 ...

  2. 距离矢量路由算法的java代码_八大排序算法比较(附Java代码)

    冒泡排序 /*** 冒泡排序 比较好理解* 两两相比 较大的放后面* 时间复杂度O(n^2)*//*** 改进前的冒泡排序算法进行100,000数据排序运行时间为:3829ms* 优化后的冒泡排序算法 ...

  3. 约瑟夫环 java代码_约瑟夫环算法的Java实现代码

    相信大家都知道这是一个的算法问题,约瑟夫环的c语言实现是利用了指针链表的形式,java实现呢,我的这个是用了内部类. 算法描述:n个人围成一圈,每人有一个各不相同的编号,选择一个人作为起点,然后顺时针 ...

  4. 蚁群算法java实现_蚁群算法java实现以及TSP问题蚁群算法求解

    1. 蚁群算法简介 蚁群算法(Ant Clony Optimization, ACO)是一种群智能算法,它是由一群无智能或有轻微智能的个体(Agent)通过相互协作而表现出智能行为,从而为求解复杂问题 ...

  5. java 算法比较,java几种面消隐算法的比较

    达内java培训:本文就 目前现有面消隐算法进行 了分类,对每类算法特 点进行 了总结.从每种 算法本 身的特点 .消隐空间.排序效率和对场景的限制这几方面 .重点分析比较 了几种常用的面消隐算法. ...

  6. 数据结构与算法【Java】06---七大查找算法总结

    文章目录 数据结构与算法[Java]06---查找算法总结 1.查找算法简介 1.1.查找的定义 1.2.查找算法分类 1.3.常用查找算法 2.线性查找算法 2.1.线性查找简介 2.2.线性查找代 ...

  7. minhash算法检索相似文本_文本去重算法:Minhash/Simhash/Klongsent

    日前接到一个对名言警句这种短文本进行去重的小任务,下图是几个重复文本的示例: 很直观的结论就是重复度越高的文本,具有更多重复的词汇.一个最直接的去重思路可以描述为:将文本进行分词处理,统计各文本词汇的 ...

  8. 基于dijsktra算法的最短路径求解_基于dijkstra算法的AGV路径规划(含C++代码)

    文字&代码来源: @Wasabi喵喵喵 基于dijkstra算法的AGV路径规划 dijkstra算法的路径规划 经典Dijkstra算法是一种贪心算法,根据路径长度递增次序找到最短路径,通常 ...

  9. 国密算法sm3java软实现_国密算法实现

    国密算法实现 一.国产密码算法介绍 国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,在金融领域目前主要使用公开的SM2.SM3.SM4三类算法,分别是非对称算法.哈希算法和对称算法. 1 ...

最新文章

  1. python / 和 // 区别
  2. java科学计数字符串显示
  3. 2016百度编程题:钓鱼比赛
  4. 投影仪是计算机的基本配置6,关于网络投影仪的六个问题
  5. 如何跨域来同步不同网站之间的Cookie
  6. 决策树算法原理(下)
  7. rsa前后端加密流程_不懂前后端分离?这篇就够了
  8. sql左外连接和右外连接的区别
  9. 【问题解决方案】关于Python中的语句 ‘ %matplotlib inline ‘
  10. 数据分析师的前世今生
  11. Android新版NDK环境搭建
  12. CodeForces - 788B Weird journey 欧拉路
  13. 〖Python 数据库开发实战 - MySQL篇⑪〗- 修改数据表结构
  14. 联想笔记本电脑E570永久禁用触摸板
  15. python未知长度数组,python – 从具有未知维数的numpy数组中提取超立方体块
  16. 第四章:Django特级篇
  17. 产权:使用权、收益权和转让权
  18. Android百度地图开发入门教程
  19. 养蜂人教你怎么辨别真假蜂蜜
  20. tensorRT在yolo上的使用

热门文章

  1. 大学计算机基础b上机考试题目,大学计算机基础上机考试题库
  2. Day 41多表查询以及pymysql相关操作 完善
  3. oracle SQL先按字母排序再按数字排序
  4. 王者荣耀在android目录下的名字,王者荣耀名字空白代码怎么弄_名字空白代码设置方法...
  5. 计算机考研854题型,2020哈尔滨工业大学计算机考研854真题回忆版
  6. [C语言]——矩阵的转置
  7. 机器人讯息合集:3D打印“元机器人”、水陆两用微机器人、会游泳的机械狗、“香蕉”软体机器人、无线两栖机器人
  8. Telegram的tdesktop之Windows编译小记
  9. 多城市二手车买卖发布管理小程序开发
  10. Live800:教育行业新拐点,在线客服系统如何提供价值?