MATLAB實現匈牙利算法求解二分圖最大匹配

MATLAB實現匈牙利算法求解二分圖最大匹配

匈牙利算法(也稱為Kuhn-Munkres算法)是解決二分圖最大匹配問題的經典算法。

代碼

function [matching, max_match] = hungarian_algorithm(adjMatrix)% HUNGARIAN_ALGORITHM 實現匈牙利算法求解二分圖最大匹配% 輸入:%   adjMatrix - 二分圖的鄰接矩陣,大小為m×n,m表示左側頂點數,n表示右側頂點數% 輸出:%   matching - 匹配結果向量,matching(i)表示左側第i個頂點匹配的右側頂點索引(0表示未匹配)%   max_match - 最大匹配數[m, n] = size(adjMatrix);% 初始化匹配數組:matching_left表示左側頂點的匹配,matching_right表示右側頂點的匹配matching_left = zeros(1, m);    % 左側匹配結果,初始為0(未匹配)matching_right = zeros(1, n);    % 右側匹配結果,初始為0(未匹配)% 定義DFS函數用于尋找增廣路徑function found = dfs(u, visited)for v = 1:n% 如果存在邊且右側頂點v未被訪問if adjMatrix(u, v) && ~visited(v)visited(v) = true;  % 標記右側頂點v為已訪問% 如果右側頂點v未被匹配,或者已匹配的左側頂點可以找到其他匹配if matching_right(v) == 0 || dfs(matching_right(v), visited)matching_left(u) = v;       % 將左側u匹配到右側vmatching_right(v) = u;      % 將右側v匹配到左側ufound = true;               % 找到增廣路徑return;endendendfound = false;  % 未找到增廣路徑end% 主算法:對每個左側頂點嘗試尋找匹配for u = 1:mvisited = false(1, n);  % 初始化訪問標記數組dfs(u, visited);        % 嘗試為當前左側頂點u尋找匹配end% 統計匹配數max_match = sum(matching_left > 0);% 返回左側匹配結果matching = matching_left;
end

算法測試與示例

1:簡單二分圖

% 創建鄰接矩陣 (3x3)
adjMatrix = [1, 0, 1;  % 左側頂點1連接右側頂點1和30, 1, 0;  % 左側頂點2連接右側頂點21, 1, 0;  % 左側頂點3連接右側頂點1和2
];% 運行匈牙利算法
[matching, max_match] = hungarian_algorithm(adjMatrix);% 顯示結果
disp('匹配結果:');
for i = 1:length(matching)if matching(i) > 0fprintf('左側頂點 %d 匹配到右側頂點 %d\n', i, matching(i));elsefprintf('左側頂點 %d 未匹配\n', i);end
end
fprintf('最大匹配數: %d\n', max_match);

2:更大規模的二分圖

% 創建隨機二分圖 (10x8)
rng(42); % 設置隨機種子確保可重復性
adjMatrix = randi([0, 1], 10, 8); % 隨機生成0-1矩陣% 運行匈牙利算法
[matching, max_match] = hungarian_algorithm(adjMatrix);% 顯示結果
disp('鄰接矩陣:');
disp(adjMatrix);disp('匹配結果:');
disp(matching);
fprintf('最大匹配數: %d\n', max_match);% 可視化結果
figure;
hold on;
title('二分圖匹配結果');
xlim([0, 3]);
ylim([0, max(10, 8)+1]);% 繪制左側頂點
for i = 1:10plot(0.5, i, 'bo', 'MarkerSize', 10, 'MarkerFaceColor', 'b');text(0.4, i, sprintf('L%d', i));
end% 繪制右側頂點
for j = 1:8plot(2.5, j, 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r');text(2.6, j, sprintf('R%d', j));
end% 繪制所有邊
for i = 1:10for j = 1:8if adjMatrix(i, j)plot([0.5, 2.5], [i, j], 'k:', 'LineWidth', 0.5);endend
end% 繪制匹配邊
for i = 1:10if matching(i) > 0plot([0.5, 2.5], [i, matching(i)], 'g-', 'LineWidth', 2);end
endlegend('左側頂點', '右側頂點', '可能邊', '匹配邊');
hold off;

算法分析與解釋

匈牙利算法核心思想

匈牙利算法基于以下關鍵概念:

  1. 增廣路徑:從一個未匹配頂點開始,交替經過匹配邊和非匹配邊,最終到達另一個未匹配頂點的路徑
  2. 核心操作:找到一條增廣路徑并"翻轉"路徑上的邊(匹配變非匹配,非匹配變匹配),從而增加匹配數

MATLAB實現特點

  1. 深度優先搜索(DFS):使用遞歸DFS尋找增廣路徑
  2. 高效匹配:時間復雜度為O(mn),其中m和n分別是左右兩側頂點數
  3. 簡潔實現:利用遞歸函數和訪問標記數組優化搜索過程

算法步驟詳解

  1. 初始化

    • 創建匹配數組matching_leftmatching_right,初始化為0(未匹配)
  2. 遍歷左側頂點

    • 對每個左側頂點u,嘗試尋找匹配的右側頂點
  3. DFS尋找增廣路徑

    • 標記已訪問的右側頂點
    • 對于當前左側頂點u連接的每個右側頂點v:
      • 如果v未訪問,則標記為已訪問
      • 如果v未匹配,或者v已匹配但可以找到替代匹配,則更新匹配
  4. 更新匹配

    • 當找到增廣路徑時,更新匹配關系
  5. 結果統計

    • 計算并返回最大匹配數

參考代碼 matlab實現匈牙利算法二分圖最大匹配的程序 www.youwenfan.com/contentcsd/97883.html

應用場景

匈牙利算法在以下領域有廣泛應用:

  1. 任務分配:將任務分配給最合適的工人
  2. 資源調度:最優資源分配問題
  3. 圖像處理:特征點匹配
  4. 網絡流:求解最大流問題的輔助算法
  5. 化學:分子結構中的鍵合分析

性能優化建議

對于大型二分圖,可以考慮以下優化:

% 優化版本:添加早期終止和預處理
function [matching, max_match] = optimized_hungarian(adjMatrix)[m, n] = size(adjMatrix);matching_left = zeros(1, m);matching_right = zeros(1, n);% 預處理:先嘗試貪心匹配for u = 1:mfor v = 1:nif adjMatrix(u, v) && matching_right(v) == 0 && matching_left(u) == 0matching_left(u) = v;matching_right(v) = u;endendendfunction found = dfs(u, visited)for v = 1:nif adjMatrix(u, v) && ~visited(v)visited(v) = true;% 使用匹配數組直接訪問,提高效率if matching_right(v) == 0 || dfs(matching_right(v), visited)matching_left(u) = v;matching_right(v) = u;found = true;return;endendendfound = false;end% 只對未匹配的左側頂點嘗試DFSfor u = 1:mif matching_left(u) == 0visited = false(1, n);dfs(u, visited);endendmax_match = sum(matching_left > 0);matching = matching_left;
end

此優化版本添加了:

  1. 貪心預處理:先進行簡單匹配,減少后續DFS次數
  2. 條件DFS:只對未匹配的左側頂點進行DFS
  3. 直接訪問:避免重復計算

匈牙利算法是解決二分圖匹配問題的高效方法,本實現提供了清晰的MATLAB代碼和示例,可直接應用于各種匹配問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93739.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93739.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93739.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自定義table

更好<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"utf-8"><title>數據表格</title><style>* {margin: 0;padding: 0;box-sizing: border-box;font-size: 14px;}html,body {width: 100%;height: 100%…

面向R語言用戶的Highcharts

如果您喜歡使用 R 進行數據科學創建交互式數據可視化&#xff0c;那么請你收藏。今天&#xff0c;我們將使用折線圖、柱狀圖和散點圖來可視化資產回報。對于我們的數據&#xff0c;我們將使用以下 5 只 ETF 的 5 年月回報率。 SPY (S&P500 fund)EFA (a non-US equities fun…

【測試工具】OnDo SIP Server--輕松搭建一個語音通話服務器

前言 Ondo SIP Server 是一款基于 SIP(Session Initiation Protocol)協議的服務器軟件&#xff0c;主要用于實現 VoIP(Voice over IP)通信&#xff0c;支持語音通話、視頻會議等多媒體會話管理&#xff0c;非常適合學習和測試VoIP的基本功能。本文介紹Ondo SIP Server的安裝、…

瘋狂星期四文案網第42天運營日記

網站運營第42天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 今日訪問量 今日搜索引擎收錄情況 網站優化點 優化一些發現的seo錯誤 增加顏文字欄目 增加了一些tag

使用空模型實例調用輔助函數,確定在量化過程中哪些層會被跳過(43)

在Facebook的OPT-350M中,模型的頭部(lm_head)與解碼器的嵌入標記層(decoder.embed_tokens)共享其權重。 print(model.model.decoder.embed_tokens) print(model.lm_head)輸出結果 Embedding(50272, 512

從0-1使用Fastmcp開發一個MCP服務,并部署到阿里云百煉 -持續更新中

目的&#xff1a; 在本地使用fastmcp開發一個mcp,然后注冊到阿里云的百煉里面。實現在百煉里面創建智能體的時候直接引用自己開發的MCP 已完成&#xff1a;本地環境安裝 待完成&#xff1a; 1.根據需求實現一個MCP中可以調用某應用的多個API即 mcp.tool()、mcp.prompt()、接入大…

設計模式之匯總

設計模式 零、設計原則 0.1 單一職責 0.2 接口隔離 0.3 開閉原則 0.4 依賴倒置0.5 迪米特法則&#xff0c;最小知道原則用戶關機 只和朋友通信 朋友條件&#xff1a; 1&#xff09;當前對象本身&#xff08;this&#xff09; 2&#xff09;以參量形式傳入到當前對象方法中的對象…

第6章 Decoder與Encoder核心組件

前言 Netty從底層Java通道讀取ByteBuf二進制數據&#xff0c;傳入Netty通道的流水線&#xff0c;隨后開始入站處理。在入站處理過程中&#xff0c;需要將ByteBuf二進制類型解碼成Java POJO對象。這個解碼過程可以通過Netty的Decoder&#xff08;解碼器&#xff09;去完成。 在…

[已解決]當啟動 Spring Boot 應用時出現 Using generated security password xxx提示

當啟動 Spring Boot 應用時出現 Using generated security password xxx提示當啟動 Spring Boot 應用時出現 Using generated security password xxx提示&#xff0c;這是 Spring Security 自動配置的默認行為&#xff0c;通常發生在你??未自定義安全配置??但引入了 Spring…

自動分析需求,PRD 生成只需 SOLO 一步!

資料來源&#xff1a;火山引擎-開發者社區 寫不清需求&#xff1f;PRD 難產&#xff1f;開發總跑偏&#xff1f;這些痛點&#xff0c;SOLO 來解決。 TRAE SOLO 是行業首個 Context Engineer。它不止協助編碼&#xff0c;更能基于精準上下文理解和工具調用&#xff0c;從構思、…

物聯網軟件開發過程中,數據流圖(DFD),用例圖,類圖,活動圖,序列圖,狀態圖,實體關系圖(ERD),BPMN(業務流程建模)詳解分析

概述軟件開發過程中&#xff0c;特別是在物聯網&#xff08;IoT&#xff09;場景中&#xff0c;數據流圖&#xff08;DFD&#xff09;、UML圖&#xff08;包括用例圖、類圖、活動圖、序列圖、狀態圖&#xff09;、實體關系圖&#xff08;ERD&#xff09;和業務流程建模&#xf…

Mac(一)常用的快捷鍵整理

目錄1、系統操作與窗口管理2、應用與窗口切換3、常規編輯操作4、文本導航與光標控制??5、文本格式與文檔功能&#xff08;支持應用中&#xff09;6、截圖快捷鍵7、Safari 瀏覽器快捷鍵8、Finder 快捷鍵&#xff08;文件管理&#xff09;9、Fn / Globe 功能鍵&#xff08;部分…

HAProxy使用方法以及和LVS區別

HAProxy簡介HAProxy是法國開發者 威利塔羅(Willy Tarreau) 在2000年使用C語言開發的一個開源軟件 是一款具備高并發(萬級以上)、高性能的TCP和HTTP負載均衡器 支持基于cookie的持久性&#xff0c;自動故障切換&#xff0c;支持正則表達式及web狀態統計LVS 與 HAProxy 的核心區別…

超越“小作文”:大模型指令設計的進階之路——優化知識信噪比

文章摘要&#xff1a;你是否認為&#xff0c;給大模型的指令&#xff08;Prompt&#xff09;寫得越詳細越好&#xff1f;真的是信息越多&#xff0c;模型就越懂你嗎&#xff1f;本文將深入探討一個反直覺的觀點&#xff1a;初級的指令設計專注於資訊的堆砌&#xff0c;而高階的…

elasticsearch-集成prometheus監控(k8s)

一. 簡介&#xff1a; 關于elasticsearch的簡介和部署&#xff0c;可以參考單獨的文章elasticsearch基礎概念與集群部署-CSDN博客&#xff0c;這里就不細說了。這里只講講如何在k8s中部署export并基于prometheus做es的指標采集。 二. 實現方式&#xff1a; 首先我們需要先部署…

貪心算法(Greedy Algorithm)詳解

一、什么是貪心算法&#xff1f; 貪心算法是一種算法設計范式&#xff0c;指在解決問題時&#xff0c;依賴于每次選擇最優的局部解&#xff0c;以期最終得到全局最優解。貪心算法的關鍵特點是&#xff1a; 局部最優選擇&#xff1a;每個階段選擇當前看起來最好的選擇&#xff0…

電梯的構造|保養|維修視頻全集_電梯安全與故障救援(課程下載)

課程下載&#xff1a;https://download.csdn.net/download/m0_66047725/91699586 電梯原理與維修視頻教程 相關簡介: 電梯現在運用的非常廣泛,比如大型商場,建筑工地,特別是現在建造的很多高樓、商品房,基本都是安裝了電梯。電梯維保不力是導致電梯運行中安全事故頻發的主要原…

Traefik網關DNS解析超時問題優化

1、背景 在生產環境使用 Traefik 網關時出現了偶發的 DNS 解析超時導致網關與后端服務建立連接異常的情況。通過調用鏈埋點數據觀察發現&#xff0c;該部署環境中 Traefik 的 DNS 解析性能較差&#xff0c;耗時通常在 4ms 以上&#xff08;正常應該是 1ms 以內&#xff09; 初…

從0到1掌握 Spring Security(第三篇):三種認證方式,按配置一鍵切換

> 本文是Spring Security系列第三篇,將帶你實現內存、JDBC和自定義三種認證方式的無縫切換,只需修改配置文件即可完成認證策略變更! ## 一、為什么需要多種認證方式? 在軟件開發的不同階段,我們需要不同的認證策略: - **開發階段**:使用內存認證,快速配置測試賬號…

阿里云國際站云防火墻:如何利用阿里云云防火墻實現細粒度的訪問控制?

利用阿里云云防火墻實現細粒度的訪問控制&#xff0c;可以從分層策略、精確匹配、動態調整三個方面著手&#xff0c;讓不同業務、用戶和資源的訪問權限清晰可控。一、明確控制目標業務隔離&#xff1a;不同業務系統、部門或環境&#xff08;生產/測試&#xff09;之間互不干擾。…