简体中文

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

分类:简体中文 作者:admin 来源:网络整理 发布:2019-10-01 07:41
  


盖尔沙普利算法规律:

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

到这程度,触及婚配中间定位成绩。,我认为越过对每人都有帮忙。。
原始连结: 原文参照

下一篇:没有了
-

文章分类

-