稳定婚配问题:n个男生n个女生。当中每一个人都有自己心仪的列表。

问怎样达成稳定的匹配(比方, b想B求婚,可是B已有的对象的优先级高于b,此时b的魅力不足以拆散B所处的那一对,即达到稳定状态。)

(Gale_Shapley algorithm)整体策略:男士负责求婚,女士负责接受或者拒绝。

题目原型: HDUOJ 1914 The Stable Marriage Problem

下面为数据生成函数,生成boys_rankings.txt 和 girls_rankings.txt

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <sstream>
#include <algorithm>
#include <vector>
#include <ctime>
#include <fstream> using namespace std; vector<string> gen_boys(int number)
{
vector<string> result;
for(int i = 0; i < number; i++){
string boy = "B";
string s;
stringstream ss;
ss << i;
ss >> s;
boy.append(s);
result.push_back(boy);
}
return result;
} vector<string> gen_girls(int number)
{
vector<string> result;
for(int i = 0; i < number; i++){
string boy = "G";
string s;
stringstream ss;
ss << i;
ss >> s;
boy.append(s);
result.push_back(boy);
}
return result;
} vector<string> gen_ranking(vector<string> candidate)
{
random_shuffle(candidate.begin(), candidate.end());
return candidate;
} void write_rankings(vector<string> people, vector<vector<string> > rankings, string out_file)
{
ofstream ofs(out_file.c_str());
if(ofs.fail()){
cerr << "Error: " << out_file << endl;
return;
}
for(int i = 0; i < people.size(); i++){
ofs << people[i] << ":";
for(int j = 0; j < rankings[i].size(); j++){
ofs << " " << rankings.at(i).at(j);
}
ofs << endl;
}
ofs.close();
} int main(int argc, char ** argv)
{
srand(time(NULL));
int n = 200;
vector<string> boys = gen_boys(n);
vector<string> girls = gen_girls(n);
vector<vector<string> > boys_rankings;
vector<vector<string> > girls_rankings;
for(int i = 0; i < n; i++){
boys_rankings.push_back(gen_ranking(girls));
girls_rankings.push_back(gen_ranking(boys));
}
write_rankings(boys, boys_rankings, "boys_rankings.txt");
write_rankings(girls, girls_rankings, "girls_rankings.txt");
return 1;
}

下面为Gale_Sharpley算法实现:

/******************************************************
* Projects : Implementation of Gale_Shapley algorithm
* Author : johnsondu
* Time : 2014-10-20 21:18
*******************************************************/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <fstream>
#include <map>
#include <vector>
#include <cstring>
#include <string>
using namespace std; // The max size of the number of the boy.
const int MAXN = 1000;
// STL map, map boy's name to integer ID
map<string, int> boy;
// STL map, map girl's name to integer ID
map<string, int> girl;
// STL map, map corresponding boy's integer id to original string name
map<int, string> boyName;
// STL map, map corresponding girl's integer id to original string name
map<int, string> girlName;
// boy's preference ranking list
int boysRankings[MAXN][MAXN];
// girl's preference ranking list
int girlsRankings[MAXN][MAXN];
// the partner that boy matched. if no, marked as -1
int boysPartner[MAXN];
// the partner that girl matched. if no, marked as -1
int girlsPartner[MAXN]; /*******************************************************
* function description:
* let every boy and girl have it's own integer identity.
* key variable: <string, int>(map string name to integer
* id), <int, string>(map integer id to original string
* name)
********************************************************/
void SerialNumber(int &n)
{
ifstream in1("boys_rankings.txt");
ifstream in2("girls_rankings.txt");
string str; int idb = 0; // boy's id
int idg = 0; // girl's id while(getline(in1, str)){
string name = "";
int i = 0;
// get boys's name
while(str[i] != ':') name += str[i ++];
// map string to int.
boy[name] = idb ;
boyName[idb] = name;
idb ++;
// get the number of boys.
n ++;
} while(getline(in2, str)){
string name = "";
int i = 0;
// get boys's name
while(str[i] != ':') name += str[i ++];
// map string to int.
girl[name] = idg;
girlName[idg] = name;
idg ++;
}
return;
} /*********************************************
* function description:
* Rereading two files, and get corresponding
* preference list of boys and girls. Save it
* in two dimension array: girlsRankings and
* boysRankings.
*******************************************/
void GetRankings(const int n)
{
ifstream in1("boys_rankings.txt");
ifstream in2("girls_rankings.txt");
string str; // boy's id.
int id = 0;
while(getline(in1, str)){
string gname;
int i = 0; int cnt = 0;
while(str[i] != ' ') i ++;
if(str[i] == ' ') i ++;
for(; i < str.size();)
{
gname = "";
while(str[i] != ' ' && i < str.size()) {
gname += str[i];
i ++;
}
boysRankings[id][cnt ++] = girl[gname];
if(str[i] == ' ') i ++;
}
id ++;
} // girls id;
id = 0; while(getline(in2, str)){ string bname;
// string size index.
int i = 0;
// the rankings in the girl's list.
int cnt = 0;
// prefix guarantee
while(str[i] != ' ') i ++;
if(str[i] == ' ') i ++;
for(; i < str.size();)
{
bname = "";
while(str[i] != ' ' && i < str.size()) {
bname += str[i];
i ++;
}
girlsRankings[id][cnt ++] = boy[bname];
if(str[i] == ' ') i ++;
}
id ++;
}
return ;
} /*************************************
* function description:
* set status for boys and girls,
* marked -1, no partner.
**************************************/
void InitStatus(const int n)
{
for(int i = 0; i < n; i ++)
{
boysPartner[i] = -1;
girlsPartner[i] = -1;
}
} /****************************************
* function description:
* when one boy propose to one girl, and
* that girl already have a partner, this
* function is used for get ratings of
* two boys in that girl's preference list.
*****************************************/
int GetId(int boyId, int gId, const int n)
{
for(int i = 0; i < n; i ++)
{
if(girlsRankings[gId][i] == boyId) return i;
}
return -1;
} /****************************************
* function description:
* once a man have dumped by a girl, set
* his status to no partner, and set his
* preference list of that girl as -1,
* stand for have been proposed before.
*****************************************/
void SetStatus(int boyId, int girlId, const int n)
{
boysPartner[boyId] = -1;
for(int i = 0; i < n; i ++)
if(boysRankings[boyId][i] == girlId){
boysRankings[boyId][i] = -1;
return;
}
} /****************************************
* function description:
* Implementation of Gale_Shapley algorithm
*****************************************/
void StableMatch(const int n)
{
InitStatus(n); while(true)
{
bool flag = false;
bool endOfFor = false;
// guarantee all the boys have a partner.
for(int i = 0; i < n; i ++){
if(boysPartner[i] == -1 || girlsPartner[i] == -1)
{
flag = true;
break;
}
}
if(!flag) break; // for boy who have no partner.
for(int i = 0; i < n; i ++)
{
if(boysPartner[i] == -1){
for(int j = 0; j < n; j ++){
// Since in the list of preference, j had rejected before.
if(boysRankings[i][j] == -1) continue; // if j have no partner, then accept.
if(girlsPartner[boysRankings[i][j]] == -1){
boysPartner[i] = boysRankings[i][j];
girlsPartner[boysRankings[i][j]] = i;
endOfFor = true;
break;
}
else{ // judge whether match is stable or not
int useId = GetId(girlsPartner[boysRankings[i][j]], boysRankings[i][j], n);
int curId = GetId(i, boysRankings[i][j], n);
// if not stable
if(curId < useId){
// girl's partner's list, set -1 to mean the girl have rejected.
SetStatus(girlsPartner[boysRankings[i][j]], boysRankings[i][j], n);
boysPartner[i] = boysRankings[i][j];
girlsPartner[boysRankings[i][j]] = i;
endOfFor = true;
break;
}
}
}
}
// find a partner, break out of the loop.
if(endOfFor) break;
}
}
} /****************************************
* function description:
* print out result.
*****************************************/
void Print(const int n)
{
freopen("result.txt", "w", stdout);
cout << "The Matching Results are follows:" << endl;
for(int i = 0; i < n; i ++){
cout << boyName[i]
<< "--" << girlName[boysPartner[i]] << " " << endl;
}
} /****************************************
* function description:
* Main function
*****************************************/
int main()
{
int n = 0;
// let every boy and girl have it's own identity.
// and get integer ranking array list.
SerialNumber(n);
// get rankings.S
GetRankings(n);
// Stable match
StableMatch(n);
// Print solution
Print(n); return 0;
}

Stable Matching (Gale Sharpley Algorithm)的更多相关文章

  1. 稳定匹配 - Stable Matching

    这篇文章将会对稳定匹配算法进行介绍及Python代码的实现,第一部分会针对稳定匹配的Gale-Shapley算法进行解析,第二部分就是用Python对该算法进行实现. 一.稳定匹配算法原理 1.1 介 ...

  2. xshell SSH 连接出现 outgoing encryption ,或者no matching host key algorithm found错误的解决

    首先看看xshell的使用版本,如果是xshell 4,提示的信息为:no matching host key algorithm found 如果是xshell 5,提示的是: outgoing e ...

  3. Maximum Cardinality Bipartite Matching: Augmenting Path Algorithm

    http://www.csie.ntnu.edu.tw/~u91029/Matching.html int nx,ny; int mx[N],my[N]; bool vy[N]; bool g[N][ ...

  4. XShell 无法匹配的outgoing encryption算法 ,No matching outgoing encryption algorithm found

    在链接的属性(SSH -> 安全性) 的加密算法列表中选择 aes256-ctr, mac加密列表中选择hmac-sha2-256,保存即可 To enable hmac-sha2-256 an ...

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

    作者:jostree  转载请注明出处 http://www.cnblogs.com/jostree/p/4051286.html 稳定匹配问题:有N男N女,每个人对于异性都一个排名,先需要得到一种稳 ...

  6. [algorithm] My rookie plan to start

    若干年后,经验有一些,但根基不牢靠.[algorithm] series 借助学习Standard Template Library: Algorithms的这段时期,在自己的算法和c++基础方面加些 ...

  7. Shine we together: A innovative dating site using 2012 Nobel Laureate Roth's algorithm

    Abstract Our dating site introduced scoring and its related functionalities innovatively, conforming ...

  8. Algorithm | Sort

    Bubble sort Bubble sort, sometimes incorrectly referred to as sinking sort, is a simple sorting algo ...

  9. 近年Recsys论文

    2015年~2017年SIGIR,SIGKDD,ICML三大会议的Recsys论文: [转载请注明出处:https://www.cnblogs.com/shenxiaolin/p/8321722.ht ...

随机推荐

  1. 参考《Python数据处理》中英文PDF+源代码

    在实际操作中掌握数据处理方法,比较实用.采用基于项目的方法,介绍用Python完成数据获取.数据清洗.数据探索.数据呈现.数据规模化和自动化的过程.主要内容包括:Python基础知识,如何从CSV.E ...

  2. QQ空间说说爬虫

    QQ空间说说爬虫 闲来无事,写了一个QQ空间的爬虫,主要是爬取以前的说说,然后生成词云. 这次采用的主要模块是selenium,这是一个模拟浏览器的模块,一开始我不想用这个模块写的,但是后面分析的时候 ...

  3. UVALive 6867 Plane Ticket Pricing

    Plane Ticket Pricing   Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu ...

  4. 使用IntelliJ IDEA开发前的基本设置,有助于提高开发效率

    2.界面字体大小设置 File菜单->Settings->Appearance->Override default fonts by(not recommended): Name:宋 ...

  5. C++里的模板

     1.泛型编程 --即实现一个通用的标准容器库. 所谓通用的标准容器库,就是要做到:比方List类存放全部肯恩类型的对象这样的事:泛型编程让你编写一个全然一般化并可反复使用的算法,其效率与针对某特定数 ...

  6. CI框架源代码阅读笔记6 扩展钩子 Hook.php

    CI框架同意你在不改动系统核心代码的基础上加入或者更改系统的核心功能(如重写缓存.输出等). 比如,在系统开启hook的条件下(config.php中$config['enable_hooks'] = ...

  7. jquery10 闭包示例

    o = { a:1, o:{ b:2, f : function(){ alert(o.a); alert(o.b);//undefined } } } o.o.f(); o = { a:7, o : ...

  8. C#与Linux守护进程

    用C#编写Linux守护进程   如果要在Red Hat Enterprise Linux上将.NET Core进程作为后台进程运行,则可以创建自定义systemd单元.今天我将为.NET Core编 ...

  9. BFC的布局规则和触发条件

    1   .BFC的含义 :          Block Formatting Contexts(BFC)                                      块级元素格式化上下 ...

  10. Impala性能优化

    不多说,直接上干货! • 执行计划 – 查询sql执行之前,先对该sql做一个分析,列出需要完成这一项查询的详细方案 – 命令:explain sql.profile 要点: • 1.SQL优化,使用 ...