全本小说

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

分类:全本小说 作者:admin 来源:网络整理 发布:2019-10-01 07:49
  


盖尔沙普利算法规律:

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

于是,触及婚配互相牵连成绩。,我相信超过对全部都有扶助。。
原始连结: 原文参照

下一篇:没有了
-

文章分类

-