稳定匹配问题(FROM Gale-Shapley TO 匈牙利算法) – pipi940409的博客


盖尔沙普利算法规律:

设定初值每个人

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瞄准匈牙利算法。,如此得名。它是最经用的教派图婚配算法。,算法的精髓是找到吹捧的路线。,它是独一寻觅两个教派图的最大婚配的算法。。(下面是百度)瞎说。,直入正题。
率先看一眼某些受精。:
1、二部图: 这两教派是独一图。,它的顶峰集V可以分为两组X和Y.。,它的边集E的每个边在x集中金中都有开端。,Y.中设置了另独一开端。。如次图:
二部图示例
2、婚配: 图论中,婚配是一组边。,缺勤两个边有独一协同的顶峰。。

  3、最大婚配: 图射中靶子每个人婚配,婚配最大婚配边数,它高价地该图的最大婚配。。如次图:
二部图的最大婚配图

  4、使完备婚配: 当m是两个教派图的最大婚配且缺勤解凹时,集中M是两个教派图的使完备婚配。。这幅画的配色很比配。。

首要的独一用铰链衔接受精:增广路线 ;
5、增广路线: 具有以下特性:
1-p的路线上胶料不可避免的是奇特的事物。。
2 -从左派的开端。,开端在正确的。。
左派的和正确的的点更迭出如今3个路线中。。
4 -就是开端和开端是未叠加盖的点。,每个人宁静点是伙伴相干的。。
5 增广路线数,每个人奇特的事物的边不在意的m。,M射中靶子偶边。
6 -对增广路线取反流行的婚配比样板婚配多独一。


让本人举个先例。,查找下图的最大婚配:

      在这时插入图片代表

率先,M集中是空的(也执意说,它缺勤边)。,继从X1开端寻觅吹捧的路线。,遵照2条基音的,本人不得不在Yi找到它。,找到Y1,(X1),Y1 末日危途,消除1-5个状态,取反,选择(X1)),Y1 末日危途加入到M中。

      在这时插入图片代表

看见,本人找到了X2点。,遵照基音的,找到Y1。又Y1缺陷独一未叠加盖的点。,SO(X2),Y1)缺陷吹捧路线。,但Y1衔接X1。,X1也衔接到Y3。,本人思索 X2,Y1,X1,Y3 )。末日危途,奇特的事物?摆布更迭?起开端未交叠?奇路线不属于M偶路线属于?消除每个人增广路状态,因而这是独一吹捧的路线。,继采用相反的方法。,获益以下数字。

      在这时插入图片代表

增广路线是匈牙利算法的精髓。,每回找到独一吹捧的路线。,这断言M集中射中靶子边数将增多1。,当未找到增广路线时,此刻,M射中靶子边数是O的最大婚配数。。
当本人开端寻觅X2时,,本人找到了Y1。。又Y1缺陷独一未叠加盖的点。,继本人思索Y1的原始婚配点X1。。从X1开端,本人开端寻觅吹捧途径。,找到了Y3,当X1有增广途径时,添加(X1),Y1)原始X1的吹捧路线。,加(X2),Y1) X2的吹捧路线,依然消除扩大路线状态。。形式(X2),Y1)—(Y1,X1)-(X1)),Y3)一种新的吹捧路线,伪行为准则如次:

while(找到Xi的相干顶峰Yj)
{
     免得(顶峰YJ不在意的吹捧路线上)
     {
           增广途径增设YJ
           免得(Yj)是未交叠点的原始婚配点,或许Yj Xk可以找到
           { 扩张集M
                 将Yj的婚配点反倒XI
                 回归真实
           }
    }
    恢复原来信仰的人false
}

C行为准则是在这时如愿以偿的。:

typedef struct tagMaxMatch{
   int 溢出[计数]计数 顶峰与边的相干表,用来表现两个教派图。
   bool on_路线[计数] 预示顶峰yJ条件已在礼物sAR中形式吹捧路线。
   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是独一缺勤叠加盖或使连续到YK的XK点,这么它可以找到独一OGM。,
                 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);
   
   
}

像这样,绍介了相互关系的婚配成绩。,认为很灵对您有所扶助。。
原始使连续: 原文涉及

发表评论

电子邮件地址不会被公开。 必填项已用*标注