稳定婚配问题: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. django项目所遇问题总结

    2. 关于设置static静态文件,样式失效问题 原因: 可能开启多个端口号,页面显示访问的不是已经设置了static的模板,所以,样式没有显示 3. models模型中gender字段的选择设置 c ...

  2. 【TC SRM 718 DIV 2 A】RelativeHeights

    [Link]: [Description] 给你n个数字组成原数列; 然后,让你生成n个新的数列a 其中第i个数列ai为删掉原数列中第i个数字后剩余的数字组成的数列; 然后问你这n个数列组成的排序数组 ...

  3. centos下安装redis/mysql等基础环境

    1.修改语言 阿里云的ECS默认语言是:en_US.UTF-8,需要改成zh_CN.UTF-8 修改方法:vim /etc/locale.conf,然后重启. 查看方法:echo $LANG 2.安装 ...

  4. Qt源码编译

    Qt源码编译 eryar@163.com Key words. Qt, 源码编译 1.Introduction 随着Qt版本升级,源码编译出来的库体积越来越大.如果只是用Qt来做GUI,Qt提供的预编 ...

  5. 用ElasticSearch,LogStash,Kibana搭建实时日志收集系统

    用ElasticSearch,LogStash,Kibana搭建实时日志收集系统 介绍 这套系统,logstash负责收集处理日志文件内容存储到elasticsearch搜索引擎数据库中.kibana ...

  6. Android简单实现Socket通信,client连接server后,server向client发送文字数据

    案例实现的是简单的Socket通信,当client(Androidclient)连接到指定server以后,server向client发送一句话文字信息(你能够拓展其他的了) 先看一下服务端程序的实现 ...

  7. words2

    餐具:coffee pot 咖啡壶coffee cup 咖啡杯paper towel 纸巾napkin 餐巾table cloth 桌布tea -pot 茶壶tea set 茶具tea tray 茶盘 ...

  8. 免费超大量邮件发送服务Amazon SES和Mailgun提供SMTP和API支持

    一般来说网站注册.论坛消息.新闻推送.广告宣传等都会有发送邮件服务,大量的邮件发送服务如果用PHP来发送,一是会消耗主机资源,二是容易被各大邮箱判定为垃圾邮件而被拒收.用第三方的邮局服务发送邮件,可以 ...

  9. C# MQTT 服务端客户端通讯

    关于MQTT 在这里我就不做过多的介绍了 , 超时空连接点我 MQTT示例 注: 该示例演示统一使用WPF, 简单MVVM模式演示, 复制代码需注意引用 NuGet包  GalaSoft MQTT服务 ...

  10. 洛谷 P1105 平台

    P1105 平台 题目描述 空间中有一些平台.给出每个平台的位置,请你计算从每一个平台的边缘落下之后会落到哪一个平台上.注意,如果某两个平台的某个两边缘横坐标相同,物体从上面那个平台落下之后将不会落在 ...