稳定婚配问题: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. Eclipse上开发IBM Bluemix应用程序

    林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要解说了怎样使用安装EclipseIBM Bluemix插件.并在Eclipse ...

  2. C++反射机制:可变参数模板实现C++反射(使用C++11的新特性--可变模版参数,只根据类的名字(字符串)创建类的实例。在Nebula高性能网络框架中大量应用)

    1. 概要   本文描述一个通过C++可变参数模板实现C++反射机制的方法.该方法非常实用,在Nebula高性能网络框架中大量应用,实现了非常强大的动态加载动态创建功能.Nebula框架在码云的仓库地 ...

  3. 通过js动态创建button

    通过js动态创建button 一.实例描述 通过JS的DOM对象,实现元素的动态创建. 二.效果 三.代码 <!DOCTYPE html> <html lang="zh-c ...

  4. HDU 2017 Multi-University Training Contest - Team 4 1009 1011

    Questionnaire Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)T ...

  5. mysql查询最新一组数据

    public function getDetail(){ $sql = "SELECT * FROM (SELECT * FROM Z_CFTC_GOV_NEW ORDER BY UPDAT ...

  6. 微信小程序从零开始开发步骤(一)搭建开发环境

    从零到有写一个小程序系列专题,很早以前就想写来分享,但由于项目一直在进展,没有过多的时间研究技术,现在可以继续分享了. 1:注册 用没有注册过微信公众平台的邮箱注册一个微信公众号, 申请帐号 ,网址: ...

  7. Jenkins学习总结(2)——Jenkins+Maven进行Java项目持续集成

    最近配置了Jenkins服务器,记录下基本过程.(当然还遇到了若干小问题,兵来将挡水来土掩就是了) Jenkins安装 安装Tomcat 从Jenkins官网下载jenkins.war文件.官网地址: ...

  8. HDU 1533 Going Home(KM完美匹配)

    HDU 1533 Going Home 题目链接 题意:就是一个H要相应一个m,使得总曼哈顿距离最小 思路:KM完美匹配,因为是要最小.所以边权建负数来处理就可以 代码: #include <c ...

  9. HDU 1495 很可乐(BFS 倒水问题)

    题意  将体积为s的可乐  利用容积分别为n和m的两个杯子平均分为两份  至少须要倒多少次可乐 能够把容器s,n,m中装的可乐量看成一种状态 容器都是没有刻度的  所以每次倒可乐要么把自己倒完 要么把 ...

  10. Android学习笔记进阶15之Shader渲染

    Android提供的Shader类主要是渲染图像以及一些几何图形. Shader有几个直接子类: BitmapShader    : 主要用来渲染图像 LinearGradient  :用来进行线性渲 ...