Stable Matching 稳定匹配 婚姻算法 shapley 算法

作者:jostree  转载请注明出处 http://www.cnblogs.com/jostree/p/4051286.html

稳定匹配问题:有N男N女,每个人对于异性都一个排名,先需要得到一种稳定的匹配,即不会出现一个匹配中的人与另一个匹配中的异性对对方的排名均高于目前配对的人的排名。

shapley算法:

每次取出一个单身男生,让他向没有拒绝过她的女生中其排名最高人表白,若该女生没有对象则配对成功,否则与其当前的对象排名进行对比,如果当前对象排名较高,则拒绝表白男生,否则dump掉目前对象。直到没有单身男子为止。

伪代码如下:

for m = 1 to M do
  partner[m] = NULL
end for
for w = 1 to W do
  partner[w] = NULL
end for
while TRUE do
  if there is no man m such that partner[m] = NULL then
    return;
  end if
  select such a man m arbitrarily;
  w = the first woman on m′ s list to whom m have not yet proposed;
  if partner[w] == NULL then
    partner[w] = m; partner[m] = w;
   else if w prefers m to state[w] then
    partner[partner[w]] = NULL; partner[w] = m; partner[m] = w;
   else
    ; //do nothing means simply rejecting m;
  end if
end while

实现时,可以把单身男生放入一个队列中,每次取出一个进行配对。另外为了在O(1)时间内找到第i个男生的第j喜欢的女生,令排名矩阵ManMat[i][j]表示男生i的第j喜欢的女生为ManMat[i][j]。为了在O(1)的时间内找到第i个女生对第i个男生的排名,令排名矩阵WomanMat[i][j]表示第i个女生对与第j个男生的排名为WomanMat[i][j]。这两个矩阵并不对称。

代码如下:

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <map>
 6 #include <fstream>
 7 #include <queue>
 8 #define MAXNUM 1000
 9 using namespace std;
10 int ManMat[MAXNUM][MAXNUM];//man i‘s jth favourate woman is ManMat[i][j]
11 int WomanMat[MAXNUM][MAXNUM];//woman i‘s to the man j‘s rank is WomanMat[i][j]
12 int ManPartner[MAXNUM];//man i‘s partner woman is ManPartner[i]
13 int WomanPartner[MAXNUM];//woman i‘s partner man is WomanPartner[i]
14 int ManPropose[MAXNUM];//ManPropose[i] means the number of man i‘s propose
15 void shapley(int n)
16 {
17     memset(ManPartner, -1, sizeof(ManPartner));
18     memset(WomanPartner, -1, sizeof(WomanPartner));
19     queue<int> manqueue;
20     for( int i = 0 ; i < n ; i++ )
21     {
22         manqueue.push(i);
23     }
24     int i = 0;
25     while(1)
26     {
27         if( manqueue.size() == 0 )
28         {
29             return;
30         }
31         i = manqueue.front();
32         int like = ManMat[i][ManPropose[i]];
33         ManPropose[i]++;
34         if( WomanPartner[like] == -1 )
35         {
36             WomanPartner[like] = i;
37             ManPartner[i] = like;
38             manqueue.pop();
39         }
40         else if( WomanMat[like][WomanPartner[like]] > WomanMat[like][i]  )
41         {
42             ManPartner[WomanPartner[like]] = -1;
43             manqueue.push(WomanPartner[like]);
44             WomanPartner[like] = i;
45             ManPartner[i] = like;
46             manqueue.pop();
47         }
48     }
49 }

时间: 2024-10-13 06:22:54

Stable Matching 稳定匹配 婚姻算法 shapley 算法的相关文章

稳定匹配 - Stable Matching

这篇文章将会对稳定匹配算法进行介绍及Python代码的实现,第一部分会针对稳定匹配的Gale-Shapley算法进行解析,第二部分就是用Python对该算法进行实现. 一.稳定匹配算法原理 1.1 介绍 稳定匹配(Stable Matching)问题就是假设现在有N个男生和N个女生跳舞选择伴侣,然后最开始的时候男.女生按照下面情况对彼此进行排序选择舞伴(见图1): 每个男生都对女生按照最喜欢到最不喜欢进行排序: 同样的,女生也是按照最喜欢的到最不喜欢对男生进行排序. 算法目标:每个男都找到唯一一

浅谈稳定完备婚姻的算法

首先说明:本文不是讨论婚姻问题的,而是一篇以日常生活的婚姻问题为例子说明一个有趣的算法:Gale-Shapley算法(延迟认可算法),如果你为此感到失望的话,我将表示我的歉意,但是你如果有兴趣的话,还是建议你看一下,尤其是对于目前还没有个GF或BF的朋友以及就要结婚的朋友,在讲解算法的实现过程中,你会感到大有裨益. 话说在1962年,两个数学家David Gale 和Lloyd Shapely提出了下面的问题:给定若干个男生和同样多的女生,他们每个人都对所有的异性有一个心理的偏好次序.是否存在一

HDU 1522 Marriage is Stable 【稳定婚姻匹配】(模板题)

<题目链接> 题目大意: 给你N个男生和N个女生,并且给出所有男生和女生对其它所有异性的喜欢程度,喜欢程度越高的两个异性越容易配对,现在求出它们之间的稳定匹配. 解题分析: 稳定婚姻问题的模板题,需要用到Gale_Shapley算法,GS算法讲解  >>> 这个算法还是很直观的. 1 #include <iostream> 2 #include <cstring> 3 #include <stack> 4 #include <stri

转:Xshell显示找不到匹配的outgoing encryption算法怎么办

原文出处:http://www.xshellcn.com/xsh_column/suanfa-bpp.html 由用户反应在使用xshell和xftp连接debian 7时出现找不到匹配的outgoing encryption算法的错误提示,本集小编整理了一份解决方法,大家可以试试看. 问题阐述: 在用xshell 4连接debian 7出现找不到匹配的outgoing encryption算法的错误提示 原因分析: 小编试着用xshell 5连接时发现没有出现问题,因此推断可能有两个原因: 1

多模匹配-AC与WM算法实测

1     概述 在某海量数据分析系统中,使用AC多模改进算法做多模匹配,作为数据分类和分发的第一道关口.部署时间较长后,内存占用较大,预处理时间随模式串数量的增加呈指数级增长,到达10W条模式串的时候已经无法正常运行.为满足需求,研究算法性能,在AC改进算法无法打成需求的情况下,研究WM匹配算法并进行改进,测试可支持10万级别的规则加载.并测试内存占用.预处理时间.匹配时间.文本检索效率等其他性能参数. 2     AC改进算法 2.1    基本思路 AC算法是基于有限自动的多模算法,在预处

Demystify 稳定匹配理论和圈圈图

你知道这个图的意义吗? 实验经济学里有个人物Al Roth,2012年获得诺贝尔经济奖,获奖领域是稳定匹配理论及其应用. 稳定匹配啥意思?考虑一个虚拟的雇佣市场问题,N个企业和N个工人的一对一匹配问题,假设每个企业对每个工人都有一个打分,分数越高代表某企业在可能的情况下会优先选择那个工人.同样,每个工人也给每个企业打分.现在如何给这些工人和企业做一个一对一的匹配?这是一个双向选择问题,一个公平的匹配应该是稳定匹配,具有如下特性:稳定匹配中的双方,尽管对方未必是最中意的那个,但他(它)又无法和任何

算法 - 排序算法的稳定性

排序算法的稳定性 排序的稳定性,指原有数据相同值的原始次序不变. 可以: 冒泡排序遇到相等的数不交换即可做到稳定. 插入排序,遇到相等的数即停止比较,插入数组. 归并排序 merge 过程中,遇到相等的值先填入左区域的值就可以做到稳定. 不可以: 选择排序不能做到稳定性,选择数值的时候交换数字是会打乱原始的次序. 随机快排不具有稳定性,因此荷兰国旗问题也是不能做到稳定性的. 堆排序. 稳定性的意义: 现实工程中需要保持上一次排序时遗留的信息,比如学校的成绩排序,第一次查询以成绩高低排序,第二次查

稳定匹配

问题背景: n个男生和m个女生进行匹配约会,当然一个男生至多和一个女生约会,一个女生也至多和一个男生约会,并且每个男生心中都有一个对女生的排名表,即表示了这个男生更愿意与哪个女生约会,不同男生的排名表不一定相同,每个女生也都有一个对男生的排名表.现在要求你求一个匹配,这个匹配不含 不稳定因素. 不稳定因素:一个男生A,一个女生B,A与A‘匹配,B与B’匹配,但A更愿意与B匹配,B也更愿意与A匹配,具有这种性质的(A,B)就被称为不稳定因素. 数学模型: 两个点集:M,W,M={m1,m2,m3…

Stable Matching Problem

The Stable Matching Problem originated, in part, in 1962, when David Gale and Lloyd Shapley, two mathematical economists, asked the question: Could one design a college admissions process, or a job recruiting process, that was self-enforcing? What di