匈牙利演算法
Ⅰ 旅行商的匈牙利演算法
設一個Shortest_Path變數
先說用窮舉法求解,待會再介紹匈牙利演算法
用for循環,
默認是從A出發遍歷,
那麼有A-B-C-DA,A-B-D-CA,ACBDA,ACDBA,ADBCA,ADCBA(還有從BCD出發的等等等等)
然後就是一個個求
例如ABCD,那麼就是6+9+8+6(我猜A-B是6哪個,如果不是那就是8,反正方向是你自己設的)
就這么一個個的求出來所有最短路徑,每次當有更小的時候就記錄到Shortest_Path,最後就能得到了~~
至於匈牙利演算法我沒做過。。。但是其實本質是一樣的,只不過相當於做一個分支分別求解,這樣地演算法效率更高而已,具體的匈牙利程序網路里有很多 ~~
http://ke..com/view/501092.htm?fr=ala0_1_1
如果我講的不清楚你可以在網路hi上直接問我
Ⅱ 指派問題的匈牙利演算法,由B2得出最優指派這一步是怎麼算的
這是看對應的列向量最小值(即0)。第一列的最小量0在第2行,代表著第一個人對應第二個任務,第二列最小量0在第一行,代表著第二個人對應第一個任務,第三列的在第三行,第四列只能分配第四個,所以就有圖中的最優指派。
Ⅲ 求匈牙利演算法的原理
對於一個點x和一個點i,如果x和i匹配,那麼就匹配;如果i已和j匹配,那麼就看j能否和別的點匹配,如果能就可以x和i匹配,匹配數+1。
Ⅳ 匈牙利演算法具體怎麼操作啊
匈牙利演算法(Edmonds演算法)步聚:(1)首先用(*)標記X中所有的非M頂點,然後交替進行步驟(2),(3)。(2)選取一個剛標記(用(*)或在步驟(3)中用(yi)標記)過的X中頂點,例如頂點xi,如果xi與y為同一非匹配邊的兩端點,且在本步驟中y尚未被標記過,則用(xi)去標記Y中頂點y。重復步驟(2),直至對剛標記過的X中頂點全部完成一遍上述過程。(3)選取一個剛標記(在步驟(2)中用(xi)標記)過的Y中結點,例如yi,如果yi與x為同一匹配邊的兩端點,且在本步驟中x尚未被標記過,則用(yi)去標記X中結點x。重復步驟(3),直至對剛標記過的Y中結點全部完成一遍上述過程。 (2),(3)交替執行,直到下述情況之一出現為止:    (I)標記到一個Y中頂點y,它不是M頂點。這時從y出發循標記回溯,直到(*)標記的X中頂點x,我們求得一條交替鏈。設其長度為2k+1,顯然其中k條是匹配邊,k+1條是非匹配邊。(II)步驟(2)或(3)找不到可標記結點,而又不是情況(I)。 (4)當(2),(3)步驟中斷於情況(I),則將交替鏈中非匹配邊改為匹配邊,原匹配邊改為非匹配邊(從而得到一個比原匹配多一條邊的新匹配),回到步驟(1),同時消除一切現有標記。(5)對一切可能,(2)和(3)步驟均中斷於情況(II),或步驟(1)無可標記結點,演算法終止(演算法找不到交替鏈).
以上演算法說穿了,就是從二分圖中找出一條路徑來,讓路徑的起點和終點都是還沒有匹配過的點,並且路徑經過的連線是一條沒被匹配、一條已經匹配過交替出現。找到這樣的路徑後,顯然路徑里沒被匹配的連線比已經匹配了的連線多一條,於是修改匹配圖,把路徑里所有匹配過的連線去掉匹配關系,把沒有匹配的連線變成匹配的,這樣匹配數就比原來多1個。不斷執行上述操作,直到找不到這樣的路徑為止。
Ⅳ 什麼是匈牙利演算法
談匈牙利演算法自然避不開Hall定理,即是:對於二部圖G,存在一個匹配M,使得X的所有頂點關於M飽和的充要條件是:對於X的任意一個子集A,和A鄰接的點集為T(A),恆有: │T(A)│ >= │A│ 
匈牙利演算法是基於Hall定理中充分性證明的思想,其基本步驟為: 
1.任給初始匹配M; 
2.若X已飽和則結束,否則進行第3步; 
3.在X中找到一個非飽和頂點x0,作V1 ← {x0}, V2 ← Φ; 
4.若T(V1) = V2則因為無法匹配而停止,否則任選一點y ∈T(V1)\V2; 
5.若y已飽和則轉6,否則做一條從x0 →y的可增廣道路P,M←M?E(P),轉2; 
6.由於y已飽和,所以M中有一條邊(y,z),作 V1 ← V1 ∪{z}, V2 ← V2 ∪ {y}, 轉4; 
設數組up[1..n] --- 標記二分圖的上半部分的點。
     down[1..n] --- 標記二分圖的下半部分的點。
     map[1..n,1..n] --- 表示二分圖的上,下部分的點的關系。
          True-相連, false---不相連。
     over1[1..n],over2[1..n] 標記上下部分的已蓋點。
     use[1..n,1..n] - 表示該條邊是否被覆蓋 。
  首先對讀入數據進行處理 ,對於一條邊(x,y) ,起點進集合up,終點進集合down。 標記map中對應元素為true。
  1. 尋找up中一個未蓋點 。
  2. 從該未蓋點出發 ,搜索一條可行的路線 ,即由細邊出發, 由細邊結束, 且細粗交錯的路線 。
  3. 若找到 ,則修改該路線上的點所對應的over1,over2,use的元素。重復步驟1。
  4. 統計use中已覆蓋的邊的條數total,總數n減去total即為問題的解。
Ⅵ 匈牙利演算法的簡介
設G=(V,E)是一個無向圖。如頂點集V可分割為兩個互不相交的子集V1,V2
選擇這樣的子集中邊數最大的子集稱為圖的最大匹配問題(maximal matching problem)
如果一個匹配中,|V1|<=|V2|且匹配數|M|=|V1|則稱此匹配為完全匹配,也稱作完備匹配。特別的當|V1|=|V2|稱為完美匹配。

Ⅶ 匈牙利演算法 java
#include<stdio.h>
  #include<string.h>
  bool g[201][201];
  int n,m,ans;
  bool b[201];
  int link[201];
  bool init()
  {
  int _x,_y;
  memset(g,0,sizeof(g));
  memset(link,0,sizeof(link));
  ans=0;
  if(scanf("%d%d",&n,&m)==EOF)return false;
  for(int i=1;i<=n;i++)
  {
  scanf("%d",&_x);
  for(int j=0;j<_x;j++)
  {
  scanf("%d",&_y);
  g[ i ][_y]=true;
  }
  }
  return true;
  }
  bool find(int a)
  {
  for(int i=1;i<=m;i++)
  {
  if(g[a][ i ]==1&&!b[ i ])
  {
  b[ i ]=true;
  if(link[ i ]==0||find(link[ i ]))
  {
  link[ i ]=a;
  return true;
  }
  }
  }
  return false;
  }
  int main()
  {
  while(init())
  {
  for(int i=1;i<=n;i++)
  {
  memset(b,0,sizeof(b));
  if(find(i))ans++;
  }
  printf("%d\n",ans);
  }
  }
  Pascal:
  Program matching;
  Const
  max = 1000;
  Var
  map : array [1..max, 1..max] of boolean; {鄰接矩陣}
  match: array [1..max] of integer; {記錄當前連接方式}
  chk : array [1..max] of boolean; {記錄是否遍歷過,防止死循環} 
  m, n, i, t1, t2, ans,k: integer;
  Function dfs(p: integer): boolean;
  var
  i, t: integer;
  begin
  for i:=1 to k do
  if map[p, i] and not chk[ i ] then
  begin
  chk[ i ] := true;
  if (match[ i ] = 0) or dfs(match[ i ]) then {沒有被連過 或 尋找到增廣路}
  begin
  match[ i ] := p;
  exit(true);
  end;{if}
  end;{for}
  exit(false);
  end;{function}
  begin{main}
  readln(n, m); {N 為二分圖左側點數 M為可連接的邊總數}
  fillchar(map, sizeof(map), 0);
  k:=0;
  for i:=1 to m do{initalize}
  begin
  readln(t1, t2);
  map[t1, t2] := true;
  if k<t2 then k:=t2;
  end;{for}
  fillchar(match, sizeof(match), 0);
  ans := 0;
  for i:=1 to n do
  begin
  fillchar(chk, sizeof(chk), 0);
  if dfs(i) then inc(ans);
  end;
  writeln(ans);
  for i:=1 to 1000 do
  if match[ i ] <> 0 then
  writeln(match[ i ], '-->', i);
  end.
Ⅷ 匈牙利演算法是機器學習嗎
我們根據機器學習的定義(即讓計算機不依賴確定的編碼指令來自主的學習工作)可知,匈牙利演算法的整個求解過程是確定性的,即一張圖下進行求解,運行n次,演算法流程以及結果都不具備不確定性。因此,匈牙利演算法並非機器學習演算法。
Ⅸ 匈牙利演算法是什麼可以解決那些問題
是所謂的匈牙利法嗎,如果是,那麼就是整數規劃中0-1規劃的分配問題的求解方法,比方四個任務分配給4個人,每人一種,可以得到最大效益
