Hungarian method (匈牙利算法)----解决指派问题(转)

body
{
font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif;
font-size: 10.5pt;
line-height: 1.5;
}
html, body
{

}
h1 {
font-size:1.5em;
font-weight:bold;
}
h2 {
font-size:1.4em;
font-weight:bold;
}
h3 {
font-size:1.3em;
font-weight:bold;
}
h4 {
font-size:1.2em;
font-weight:bold;
}
h5 {
font-size:1.1em;
font-weight:bold;
}
h6 {
font-size:1.0em;
font-weight:bold;
}
img {
border:0;
max-width: 100%;
height: auto !important;
}
blockquote {
margin-top:0px;
margin-bottom:0px;
}
table {
border-collapse:collapse;
border:1px solid #bbbbbb;
}
td {
border-collapse:collapse;
border:1px solid #bbbbbb;
}

---匈牙利解法是求解指派问题的一种新颖而又简便的解法。

---指派问题的最优解有这样一个性质,若从系数矩阵的一行(列)各元素中分别减去该行(列)的最小元素,得到新矩阵,那么以新矩阵为系数矩阵求得的最优解和用原矩阵求得的最优解相同.利用这个性质,可使原系数矩阵变换为含有很多0元素的新矩阵,而最优解保持不变.

---具体操作为第一步:使指派问题的系数矩阵经变换,在各行各列中都出现0元素.(1)从系数矩阵的每行元素减去该行的最小元素;(2)再从所得系数矩阵的每列元素中减去该列的最小元素.第二步:进行试指派.若此时得到的mPn,应回到第一步,重新对系数矩阵进行变换。但要把第一步的过程改为(1)从系数矩阵的每列元素减去该列的最小元素;(2)再从所得系数矩阵的每行元素中减去该行的最小元素.这样做就使得新矩阵的0元素比较多些.再进入第二步进行试指派就可以得到最优解.

---匈牙利解法的示例

  

  步骤一:将这系数矩阵进行变换,使各行各列都出现0元素.从系数矩阵的每行元素减去该行的最小元素即得每行每列都有有0元素的系数矩阵.

  -------------------------------- 

  步骤二:进行试指派,找出独立的0元素.独立0元素用Θ表示,其它0用Φ表示得到

  ……(1)

  这里Θ的个数m=4,而n=5;问题没有得到求解,运用步骤三继续求解.

  步骤三:作最少的直线覆盖所有的0元素,以确定该系数矩阵中能找到最多的独立元素数.为此按以下步骤进行.

  (1)对没有Θ的行打√号:;

  (2)对已打√号的行中所含0元素的列打√号;

  (3)再对所有打√号的列中的含有@元素的行打√号;

  (4)重复2、3直到得不出新的打√号的行列为止.

  (5)对没有打√号的行画一横线,有打√号的列画一纵线,这就得到覆盖所有0元素的最少直线数.

  令直线数为l.若l < n,说明必须再变换当前的系数矩阵,才能找到n个独立的0元素,为此转换步骤四;若l = n,而m < n,应回到步骤二,另行试探.

  在此例中,对矩阵(1)按以下次序进行:

  先在第五行旁打√,接着可判断应在第一列下打√,接着在第3行旁打√,经检查不能再打√了.对没有打√行画一直线以覆盖0元素,对打√的列画一直线以覆盖0元素,得:

  ……(2)

  由此可见l = 4 < n.所以应继续对(2)矩阵进行变换转步骤四.

  步骤四:对(2)矩阵进行变换的目的是增加0元素.

  为此在没有被直线覆盖的部分中找出最小元素.然后在打√行各元素中都减去这个最小元素,而在打√列的各元素上都加上这个最小元素,以保证原来0元素不变.这样得到新系数矩阵(它的最优解和原问题相同).若得到n个独立的0元素,则已得最优解,否则回到步骤三重复进行.

  在矩阵(2)中,在没有被覆盖部分(第3、5行)中找到最小元素为2,然后在第3、5行各元素分别减去2。给第l列各元素加2,得到新矩阵(3)

  ……(3)

  按步骤二,找出所有的独立0元素。得到矩阵(4)

  ……(4)

  它具有n个独立0元素.这就得到了最优解,相应解矩阵为

  

  由解矩阵得最优指派方案:

  甲——B,乙——D,丙——E,丁——C,戊——A

  所需总时间为minz=32.

来自为知笔记(Wiz)

时间: 2024-07-29 10:08:39

Hungarian method (匈牙利算法)----解决指派问题(转)的相关文章

匈牙利算法解决二分图匹配

匈牙利算法解决二分图匹配 [书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程] 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. -------等等,看得头大?那么请看下面的版本: 通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一位光荣的新世纪媒人,在你的手上有N个剩男,M个剩女,每个人都可

最大二分匹配匈牙利算法的python实现

二分图匹配是很常见的算法问题,一般用匈牙利算法解决二分图最大匹配问题,但是目前网上绝大多数都是C/C++实现版本,没有python版本,于是就用python实现了一下深度优先的匈牙利算法,本文使用的是递归的方式以便于理解,然而迭代的方式会更好,各位可以自行实现. 1.二分图.最大匹配 什么是二分图:二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(

[图论] 二分图匹配(匈牙利算法)

介绍部分转载于维基百科: 匈牙利算法是众多用于解决线性任务分配问题的算法之一,是用来解决二分图最大匹配问题的经典算法,可以在多项式时间内解决问题,由美国数学家Harold Kuhn 于1955年提出.此算法之所以被称作匈牙利算法是因为算法很大一部分是基于以前匈牙利数学家Dénes K?nig和Jen? Egerváry的工作之上创建起来的. 问题简介: 设G=(V,E)是一个无向图.如顶点集V可分区为两个互不相交的子集V1,V2之并,并且图中每条边依附的两个顶点都分属于这两个不同的子集.则称图G

POJ #3041 Asteroids 3041 二分图最小覆盖 最大匹配 匈牙利算法

Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K asteroids (1 <= K <= 10,000), which are conveniently located at the lattice points of the

使用匈牙利算法来解决二分图的最大匹配问题

其实在写这个的代码的时候我是纳闷的,X集合和Y集合的点,能同时用1,或者2来表示吗? 然后我努力说服自己:它已经是二分图了 它就是存了一个 → 而已 好的我被自己说服了 二分图匹配说的就是,每个人有若干种选择,但是每种选择只能容纳一个人,问你最多能配对多少 或者说成选边的时候不能经过同一个点 最大匹配就是最多选择多少条边的问题 匈牙利算法就是,有机会就上,没机会要创造机会也要上,尽可能地给当前腾地方,腾的过程是一个递归的过程 其实这个算法挺矫情的.. bool find(int u) { for

它处资料:二分图最大匹配的匈牙利算法

资料出处:点击打开链接 匈牙利算法 二分图最大匹配的匈牙利算法:  二分图是这样一个图,它的顶点能够分类两个集合X和Y,全部的边关联在两个顶点中.恰好一个属于集合X.还有一个属于集合Y. 最大匹配: 图中包括边数最多的匹配称为图的最大匹配. 完美匹配: 假设全部点都在匹配边上.称这个最大匹配是完美匹配. 最小覆盖: 最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和当中一个点关联.能够证明:最少的点(即覆盖数)=最大匹配数 最小路径覆盖: 用尽量少的不相交简单路径覆盖有向无环图G的全

网络(最大)流初步+二分图初步 (浅谈EK,Dinic, Hungarian method:]

本文中  N为点数,M为边数: EK: (brute_force) : 每次bfs暴力找到一条增广路,更新流量,代码如下 : 时间复杂度:O(NM2): 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 struct node{ 5 int next,to,len; 6 }edge[200005]; 7 8 int val[10005],head[200005],vis[10005],from[100005]; 9 int n,m,s,t

匈牙利算法

(一)首先明确匈牙利算法是干嘛滴? 匈牙利算法是解决二部图最大匹配问题滴. (二)算法的核心思想:不断寻找增广路径,每找到一条增广路径,就通过异或操作使匹配边数加一,直到找不到增广路径,算法结束. (三)算法的基本步骤: (1)任取二部图G(X,Y)的匹配M,若M饱和X,则停止.若M不能饱和X,则取X的未标记的M非饱和点x.(标记的点表示经过此点不存在增广路)令S={x},T= ?.(T集合中的点表示N(S)中已经加入增广路的点)(当不存非饱和点或者所有非饱和点都被标记,算法结束) (2)若N(

匈牙利算法dfs模板 [二分图][二分图最大匹配]

最近学了二分图最大匹配,bfs模板却死活打不出来?我可能学了假的bfs 于是用到了dfs模板 寻找二分图最大匹配的算法是匈牙利算法 匈牙利算法的主要程序是寻找增广路 寻找增光路是过程是:从一个未经配对的点出发,历经未配边.匹配边.未配边.匹配边.未配边....最终到达一个未配点的过程,只要把路径中的未配边和匹配边的“身份”对调,匹配就加一了.这就是一个寻找增广路的过程,通过不断寻找增广路,可以找到最大的匹配. 1 #include<cstdio> 2 #include<cstring&g

UVALive5874 - Social Holidaying-二分图匹配/匈牙利算法

有n个家庭,m个房间,一个房间只能两个家庭住.求最大匹配. 比较标准的二分图问题.先初始化把可能的家庭建边,然后跑一边匈牙利算法. 最后的答案是最大匹配数/2,因为建图时有重复. #include <cstdio> #include <algorithm> #include <cstring> #include <map> using namespace std; const int MAXN = 410; int uN,vN; int g[MAXN][MA