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


盖尔沙普利算法规律:

整个设定初值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提议的。,因此得名。这是最经用的学派图婚配算法。,算法的感情是寻觅一件商品增广小路。,它是一种求。(上图因为百度)没什么好说的,直入以奇想主题布置的。
让we的所有格形式先看稍微主意。:
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的基础的,we的所有格形式要责怪在彝语中找到,找到Y1,(X1,Y1 末日危途,使满足或足够1-5的制约,取反,迅速移动(X1),Y1 末日危途加入到M中。

      在这里插入图片描述

纷纷,we的所有格形式找到了x2点。,遵照基础的,找到Y1。但y1并责怪东西未被瞥见的点,SO(X2),y1)不放宽道路,但y1与x1贯。,x1衔接到y3,we的所有格形式思索 X2,Y1,X1,Y3 )。末日危途,单数?摆布更迭?起出身未互搭?奇小路不属于M偶小路属于?使满足或足够接受增广路制约,因而这是一件商品增广小路。,当时的换个支座,开始下图。

      在这里插入图片描述

增广小路是匈牙利算法的感情,找到的接受传播小路,这述语m集说得中肯边数,当未瞥见增广小路时,此刻,M说得中肯边数是尖端。。
当we的所有格形式开端寻觅X2的时分,we的所有格形式瞥见Y1。但y1并责怪东西未被瞥见的点,当时的we的所有格形式思索y1的原始婚配点x1。。从x1开端,we的所有格形式开端寻觅扩张的道路。,找到了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