Stable Matching (Gale Sharpley Algorithm)
稳定婚配问题: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)的更多相关文章
- 稳定匹配 - Stable Matching
这篇文章将会对稳定匹配算法进行介绍及Python代码的实现,第一部分会针对稳定匹配的Gale-Shapley算法进行解析,第二部分就是用Python对该算法进行实现. 一.稳定匹配算法原理 1.1 介 ...
- xshell SSH 连接出现 outgoing encryption ,或者no matching host key algorithm found错误的解决
首先看看xshell的使用版本,如果是xshell 4,提示的信息为:no matching host key algorithm found 如果是xshell 5,提示的是: outgoing e ...
- 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][ ...
- XShell 无法匹配的outgoing encryption算法 ,No matching outgoing encryption algorithm found
在链接的属性(SSH -> 安全性) 的加密算法列表中选择 aes256-ctr, mac加密列表中选择hmac-sha2-256,保存即可 To enable hmac-sha2-256 an ...
- Stable Matching 稳定匹配 婚姻算法 shapley 算法
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4051286.html 稳定匹配问题:有N男N女,每个人对于异性都一个排名,先需要得到一种稳 ...
- [algorithm] My rookie plan to start
若干年后,经验有一些,但根基不牢靠.[algorithm] series 借助学习Standard Template Library: Algorithms的这段时期,在自己的算法和c++基础方面加些 ...
- 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 ...
- Algorithm | Sort
Bubble sort Bubble sort, sometimes incorrectly referred to as sinking sort, is a simple sorting algo ...
- 近年Recsys论文
2015年~2017年SIGIR,SIGKDD,ICML三大会议的Recsys论文: [转载请注明出处:https://www.cnblogs.com/shenxiaolin/p/8321722.ht ...
随机推荐
- 入门Python:《趣学Python编程》中英文PDF+代码
入门python推荐学习<趣学python编程>,语言轻松,通俗易懂,讲解由浅入深,力求将读者阅读和学习的难度降到最低.任何对计算机编程有兴趣的人或者首次接触编程的人,不论孩子还是成人,都 ...
- unbound和mail服务的部署和简单应用
1.服务的介绍 Unbound是一个缓存DNS解析器.unbound官网 它使用根区域的内置权威名称服务器列表 (.),所谓的根提示.在收到DNS查询时,它会询问 答案的根名称服务器,几乎在所有情况下 ...
- 使用Xcode的Targets来管理开发和生产版本的构建
如何创建一个新的Target 如何在Xcode中创建一个开发的target?我使用示例项目“todo”引导您一步一步完成整个过程..您也可以使用自己的项目并按照步骤: 1. 在项目的导航面板进入项目设 ...
- qt qlineedit只输入数字
lineEdit->setValidator(new QRegExpValidator(QRegExp("[0-9]+$")));
- hdu1856 More is better (并查集)
More is better Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others) ...
- mongodb官网文档阅读笔记:write concern
write concern保证了mongodb写操作的级别,不同的write concern设置相应了不同级别的写操作.设置的级别越高.那么写操作的性能的持久化做得越好,可是写性能也就越差. mong ...
- 轻松八步搞定Cacti配置安装(原创视频)
轻松八步搞定Cacti配置安装 1.安装web server $sudo apt-get install apache2 验证 http://localhost 2.$sudo apt-get ins ...
- 码农Coding Peasant(s):一般指从事没有发展前景的软件开发职位
码农Coding Peasant(s):一般指从事没有发展前景的软件开发职位,这种职位只能强化职业者在单方面的技术领域技能,学不到新技术,同时也是部分从事软件开发工作人员的一个自嘲的称号.一个依靠写代 ...
- SQL 金额添加千分位
SELECT CONVERT(NVARCHAR(50),CAST(1000000 AS MONEY),1) SELECT CONVERT(NVARCHAR,CAST(1343432432434.8 A ...
- Linux 设置文件默认打开方式
比如说我安装了一个绿色版的sublime(.tar解压出来的不是.deb) 但是现在我右键不能打开,不能添加为默认打开方式...这个时候就比较尴尬了... 我总不能每次都cd到安装目录下然后termi ...