稳定匹配问题(FROM Gale-Shapley TO 匈牙利算法)

编辑:站酷工作室 发布于2019-09-29 21:16


盖尔澳门永利规律:

整个设定初值mM,wW,m in M,w in W,持有m和w都是释放情势;
而(人是释放在的),他还无向每个妇女调情。
{
选择一像我如此的人类;
w = 在M的优先名单上次序很大的的妇女;
假使(W) 这是一种释放的情势。
{
将 (m,w) 将情势设置为与人约会情势
}
else /* w 我和倚靠人类与人约会过。
{
m’ = w 正与人约会的人类
假使(W) 更待见 m’ 而缺点 m)
{
m 单身的(W 日期不变性)
}
else /* w 更待见 m 而缺点 m’*/
{
将 (m,w) 将情势设置为与人约会情势
将 m’ 设置为释放情势
}
}
}
出口婚配集S


盖尔澳门永利蓝本执意处理婚姻生活婚配的成绩,这执意它的实质。。简略特定节日等用的仪式

懂前述的算法,你有可能知情匈牙利寒冷。 ^ _ ^ )


匈牙利算法:

匈牙利算法是由Edmonds介绍的。,因此得名。这是最经用的使分开图婚配算法。,算法的小瘤是找寻条款增广路线。,它是一种求。(上图来自某处百度)没什么好说的,直入动机。
让咱们先看非常乐句。:
1、二部图: 二部图执意如此一图。,它的顶峰集v可以分为两个集:x和y。,和边集e说话中肯每个边在x se金中都有一极值点,另一极值点在y集中。列举如下图:
二部图示例
2、婚配: 图论,婚配是一组边,两边都无协同的顶峰。。

  3、最大婚配: 在图的持有婚配中,最大婚配边数婚配,使转移此图的最大婚配。列举如下图:
二部图的最大婚配图

  4、吃光婚配: 当m是二部图的最大婚配时,这么集中m是二部gra的吃光婚配。上图说话中肯婚配是吃光的婚配。

终于一线索乐句:增广路线 ;
5、增广路线: 它有以下表现特性的:
1-p的路线规模不可避免的是临时的。
2-从左开端。,起端在向右。。
3-路线说话中肯点摆布更迭。
4-正是起端和起端无草木,持有倚靠点都社团。。
5 扩张路线的编号,持有临时的边公开m中,平坦的暧昧的(m)。
6 增广路线的逆婚配再发生一。


举个先例。,找到上面算术的最大婚配:

      在这里插入图片描述

率先,m集是空的(即,无边里面的),继我开端找寻X1的扩张名。,遵照2的基础,咱们可是在彝语中找到,找到Y1,(X1,Y1 末日危途,心甘情愿的1-5的需要量,取反,意愿(X1),Y1 末日危途加入到M中。

      在这里插入图片描述

跟着人去,咱们找到了x2点。,遵照基础,找到Y1。但y1并缺点一未被见的点,SO(X2),y1)不发挥道路,但y1与x1贯。,x1衔接到y3,咱们思索 X2,Y1,X1,Y3 )。末日危途,临时的?摆布更迭?起起端未草木?奇路线不属于M偶路线属于?心甘情愿的持有增广路需要量,因而这是条款增广路线。,继换个方位,买到下图。

      在这里插入图片描述

增广路线是匈牙利算法的小瘤,找到的持有扩张路线,这隐含m集说话中肯边数,当未见增广路线时,此刻,M说话中肯边数是最高点。。
当咱们开端找寻X2的时分,咱们见Y1。但y1并缺点一未被见的点,继咱们思索y1的原始婚配点x1。。从x1开端,咱们开端找寻扩张的道路。,找到了Y3,当x1具有扩张路线时,添加(X1),Y1)原X1的扩张,加(x2),Y1) x2的扩张,仍心甘情愿的增容道路需要量。方式(x2),Y1)—(Y1,X1)-(X1),y3)新的扩张路线,伪加密列举如下:

while(找到xi的相干顶峰yj)
{
     if(顶峰yj公开扩张路线上)
     {
           将YJ添加到缩小道路
           假使(Yj是未草木点或YJ的原始婚配)
           { 扩张集m
                 将yj的婚配点顶替xi
                 复发真
           }
    }
    复发false
}

这是C加密引起:

typedef struct tagMaxMatch{
   int 边[计数][计数] 顶峰与边的相干表,用于表现二部图。
   bool on_路线[计数] 表现顶峰yj其中的哪一个已方式增广
   int 路线[计数] 赠送找到的扩张路线
   int max_match; 赠送扩张路线说话中肯边数
}GRAPH_MATCH;

void outputRes(int) 路线
   for (int) i = 0 ; ion_路线[ J ] = false;
   }
  
}
DFS算法
bool FindAugPath(GRAPH_MATCH *match , int 十一)
   for (int) yj = 0 ; yj < COUNT; yj++) {
       if ( match->边[西]勇[勇] == 1 && !match->on_path[yj]) { 假使Yi衔接到XI,Yi公开
            match->on_path[yj] = true;
           if (match->path[yj] == -1 || FindAugPath(match,match->path[yj])) { // 假使yi是未草木的点或衔接到的xk点,
                 match->path[yj] = xi; YJ点衔接路线
                 return true;
           }
       }
   }
   return false;
}

void Hungary_match(GRAPH_MATCH 竞赛)
   for (int) xi = 0; xi路线
}

int main() {
   
   GRAPH_MATCH *graph = (GRAPH_MATCH *)malloc(sizeof(GRAPH_MATCH));
   for (int) i = 0 ; i < COUNT ; i++) {
       for (int) j = 0 ; j < COUNT ; j++) {
           graph->edge[i][j] = 0;
       }
   }
   graph->edge[0][1] = 1;
   graph->edge[0][0] = 1;
   graph->edge[1][1] = 1;
   graph->edge[1][2] = 1;
   graph->edge[2][1] = 1;
   graph->edge[2][0] = 1;
   graph->edge[3][2] = 1;
   
   for (int) j = 0 ; j < COUNT ; j++) {
       graph->路线[ J ] = -1;
       graph->on_路线[ J ] = false;
   }
   
   Hungary_match(graph);
   
   
}

来这里,触及婚配互相牵连成绩。,我期望由于对全部的都有帮忙。。
原始联锁: 原文介绍人