稳定匹配问题(FROM Gale-Shapley TO 匈牙利算法)
2019-10-01 00:05  网络整理    我要评论


盖尔沙普利算法规律:

整个设定初值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);
   
   
}

来这里,触及婚配中间定位成绩。,我愿望在上文中对权威都有帮忙。。
原始用环连接: 原文引用

关键词:

责任编辑:admin