【图论-匈牙利算法】Hungary Algorithm完整代码(一) 之 matlab实现

news2024/12/22 15:00:48

=学习参考链接==

博客

分配问题与匈牙利算法

带你入门多目标跟踪(三)匈牙利算法&KM算法

视频

运筹学 | 例题详解指派问题


前言

  • 图论-匈牙利算法原理参见上述参考连接中的博客与BiliBili博主的学习视屏,讲的很好很透彻。强烈建议看完(明白行列变换、找独立零、打勾、划线原理后)再来撸代码。
  • 此处以成本矩阵求解n*n的最优分配问题。

问题描述

在实际中经常会遇到这样的问题,有n项不同的任务,需要 n个人分别完成其中的一项,但由于任务的性质和各人的专长不同,因此各人去完成不同的任务的效率(或花费的时间或费用)也就不同。于是产生了一个问题,应指派哪个人去完成哪项任务,使完成 项任务的总效率最高(或所需时间最少),这类问题称为分配问题或指派问题。
在这里插入图片描述


matlab代码实现

cost矩阵(n*n)

🔺 mainHA1.m

% 定义成本矩阵
costMatrix=[2,15,13,4;10,4,14,15;9,14,16,13;7,8,11,9];
% 调用匈牙利算法计算分配的结果,已经总成本
[f,D,G]=assign(costMatrix);

匈牙利算法实现主体

🔺 assign.m

function[f,D,G]=assign(B)
% 匈牙利算法实现
% u 和 v 是包含矩阵 B 沿每一行和每一列的最小值的向量
% 从矩阵 B 的相应行和列中减去这些最小值
n=length(B(:,1));
u=min(B,[],2);
f=sum(u);%用于记录最优值
B=B-repmat(u,1,n);
v=min(B,[],1);
f=f+sum(v);%用于记录最优值
B=B-repmat(v,n,1);
C=zeros(n);
while 1
    % 在当前矩阵 B 中找到零元素,并在辅助矩阵 C 中进行标记
    C(find(B==0))=1;
    % 计算辅助矩阵 C 中每行和每列的和,存储在 u 和 v 中。
    E=C;
    u=sum(C,2);
    v=sum(C);
    % 调用 assignz 函数,该函数通过修改 C、D、G、E、u 和 v 来找到零元素的匹配。
    D=zeros(1,n);
    G=zeros(1,n);
    [C,D,G,E,u,v]=assignz(C,D,G,E,u,v);
    num=-1;
    while num<0
        add=find(D==0);
        if isempty(add)
            return;
        end
        % 调用 assignln 函数,该函数寻找未被覆盖的行,并从中找到一条增广路径
        [D,G,E,SP,TP]=assignln(D,G,E,add);
        num=numel(SP)-numel(TP);
    end
    % 更新矩阵 B,通过减去路径中的最小值,并在路径上加上最小值
    add=setdiff(1:n,TP);
    m=min(min(B(SP,add)));
    B(SP,add)=B(SP,add)-m;
    add=setdiff(1:n,SP);
    B(add,TP)=B(add,TP)+m;
    % 更新总成本 f,通过累加路径上的最小值与路径长度的乘积
    f=f+m*num;
end

标记独立零元素

assignz.m

function[C,D,G,E,u,v]=assignz(C,D,G,E,u,v)%标记独立零
while any(u)
    %  % 找到第一个u为1的行
    row=find(u==1,1);
    while row
        % 找到该行中第一个被标记为1的列
        col=find(C(row,:)==1);
        % 更新匹配关系
        D(row)=col;
        G(col)=row;
        E(row,col)=0;
        % 更新u和v
        u=u-C(:,col);
        % 清零相应的行和列
        v(col)=0;
        C(:,col)=0;
        row=find(u==1,1);
    end

    % 找到第一个v为1的列
    col=find(v==1,1);
    while col
        % 找到该列中第一个被标记为1的行
        row=find(C(:,col)==1,1);

        % 更新匹配关系
        D(row)=col;
        G(col)=row;
        E(row,col)=0;
        v=v-C(row,:);
        u(row)=0;
        C(row,:)=0;
        col=find(v==1,1);
    end
     % 如果u仍有非零元素,则找到u和v的非零元素的位置
    if any(u)
        row=find(u,1);
        col=find(C(row,:),1);
        D(row)=col;
        G(col)=row;
        E(row,col)=0;
        u=u-C(:,col);
        u(row)=0;
        v=v-C(row,:);
        v(col)=0;
        C(:,col)=0;
        C(row,:)=0;
    else return;
    end
end

划线(以最少的线覆盖所有的零)—增广路径

assignln.m

function[D,G,E,SP,TP]=assignln(D,G,E,un)%作最少的直线覆盖所有零
S=un;
SP=[];
TP=[];
F=zeros(numel(D));
while ~isempty(S)
    [null,T]=find(E(S,:));
    T=setdiff(T,TP);
    if isempty(T)
        SP=union(SP,S);
        return;
    end
    F(S,T)=E(S,T);
    SP=union(SP,S);
    TP=union(TP,T);
    Stemp=G(T);
    P=find(Stemp==0);
    if ~isempty(P)
        Tun=T(P);
        [r,c]=find(E(S,Tun),1);
        row=S(r);
        col1=Tun(c);
        while 1
            E(row,col1)=0;
            col2=D(row);
            D(row)=col1;
            G(col1)=row;
            if ismember(row,un)
                break;
            end
            E(row,col2)=1;
            row=find(F(:,col2),1);
            col1=col2;
        end
        SP=[];
        return;
    end
    S=Stemp;
end
SP=[];

运行main函数可得最短时间为28

% 输出如下
f =  28

D =  4     2     1     3

G =  3     2     4     1

f为总的时间成本,D为员工,G为任务,即员工4对应3号任务。这是最优的分配结果。


匈牙利算法实例应用

问题描述:n个点从起始位置到目标位置,如何让成本最少???

分析:以欧式距离构建成本矩阵cost

计算每个点到目标点的距离,构建权重代价

getDistance.m

function [Distance] = getDistance(Agent,Goal)
    n=length(Agent(:,1));
    m=length(Goal(:,1));
    for i=1:n
        for j=1:m
            Distance(i,j)=(Agent(i,1)-Goal(j,1))^2+(Agent(i,2)-Goal(j,2))^2;
            Distance(i,j)=sqrt(Distance(i,j));
        end
    end
end

修改mainHA1.m函数

mainHA2.m

Agent=[-5,0;0,-1;0,-2;0,-3;-1,0;-1,-1;-1,-2;-1,-3;-2,0;-2,-1;-2,-2;-2,-3;-2,-4;-2,-5];
Goal=[5,5;6,6;7,7;8,8;4,6;3,7;2,8;2,9;8,9;3,10;7,10;4,10;6,10;5,9];

matrix=getDistance(Agent,Goal);

% 执行匈牙利算法,返回分配结果
[f,D,G]=assign(matrix);

% 使用 plot 函数绘制了连接线,同时在图中用蓝色和红色分别标记位置
num=length(D);
for i=1:num
plot([Agent(i,1),Goal(D(i),1)],[Agent(i,2),Goal(D(i),2)])
hold on
plot(Agent(i,1),Agent(i,2),'.','Color','b','MarkerSize',50); 
hold on
plot(Goal(D(i),1),Goal(D(i),2),'.','Color','r','MarkerSize',50); 
hold on
end

set(gca,'XminorGrid','on');
set(gca,'YminorGrid','on');axis equal
hold off

运行main函数可得最短距离为168.3064

  • 下面是各个点的分配结果
f = 
168.3064
D =
8	11	2	4	12	14	5	1	7	10	6	13	9	3
G = 
8	3	14	4	7	11	9	1	13	10	2	5	12	6
  • 结果显示如图
    连线表示各个点的分配结果

图论-匈牙利算法matlab实现

🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑 🐑

博文中代码整理后的下载链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1305827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Idea maven打包时 报错 illegalArgumentException: Malformed \uxxxx encoding 解决方法

1 改变打包命令重新打包 在maven打包命令上加入 -e -X 2 找到报错类和方法 可以看到是 java.util.Properties#loadConvert类方法中有个throw new IllegalArgumentException( "Malformed \\uxxxx encoding.")&#xff0c;在此打断点 3 以Debug方式重新运行maven…

原创改进|多策略融合的改进蜣螂优化算法

作者在前段时间的一篇文章中介绍过了蜣螂优化算法(dung beetle optimizer&#xff0c;DBO)的原理及实现&#xff0c;该算法是由东华大学沈波教授团队在2022年提出[1]&#xff0c;其灵感来自蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为这5种习性&#xff0c;其不同的子种群执行了不…

IntelliJ IDEA v2023.3发布——持续演进AI辅助工具、支持Java 21

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 I…

Python 自动化之处理docx文件(一)

批量筛选docx文档中关键词 文章目录 批量筛选docx文档中关键词前言一、做成什么样子二、基本架构三、前期输入模块1.引入库2.路径输入3.关键词输入 三、数据处理模块1.基本架构2.如果是docx文档2.1.读取当前文档内容2.2.遍历匹配关键字2.3.触发匹配并记录日志 3.如果目录下还有…

如何利用宝塔面板和docker快速部署网站

当你有了一台服务器&#xff0c;就会折腾往这台服务器上部署各种好玩的网站。市面上有许多开源的网站项目&#xff0c;通过docker技术可以快速部署并使用&#xff0c;本文将以部署filebrowser举例介绍网站部署的基本流程。 1. 安装宝塔面板 宝塔面板是一款开源的网站运维工具…

云服务器部署可视化Docker私有仓库(Ubuntu)

这里测试的机器为ubuntu22.04 一、环境安装 docker安装就不赘述了 先升级&#xff0c;再从官方仓库安装docker compose apt update apt upgrade apt install docker-compose二、部署私有仓库UI Docker提供了一个叫registry的镜像&#xff0c;给大家搭建私有仓库&#xff0c…

如何在nacos中的配置在不同的环境服务下可实现配置共享

其实在微服务启动时&#xff0c;会去nacos读取多个配置文件&#xff0c;例如&#xff1a; [spring.application.name].yaml&#xff0c;例如&#xff1a;nacos-order-service.yaml[spring.application.name]-[spring.profiles.active].yaml&#xff0c;例如&#xff1a;nacos-o…

《地理信息系统原理》笔记/期末复习资料(10. 空间数据挖掘与空间决策支持系统)

目录 10. 空间数据挖掘与空间决策支持系统 10.1. 空间数据挖掘 10.1.1. 空间数据挖掘的概念 10.1.2. 空间数据挖掘的方法与过程 10.1.3. 空间数据挖掘的应用 10.2. 空间决策支持系统 10.2.1. 空间决策支持系统的概念 10.2.2. 空间决策支持系统的结构 10.2.3. 空间决策…

Flink 有状态流式处理

传统批次处理方法 【1】持续收取数据&#xff08;kafka等&#xff09;&#xff0c;以window时间作为划分&#xff0c;划分一个一个的批次档案&#xff08;按照时间或者大小等&#xff09;&#xff1b; 【2】周期性执行批次运算&#xff08;Spark/Stom等&#xff09;&#xff1b…

Vue3-04-reactive() 响应式失效的三种情况

1.替换对象后导致失效 简单理解 &#xff1a; 变量指向的对象换了&#xff0c;对原来的对象&#xff0c;当然没有了响应式的效果了。// 声明 变量let obj1 reactive({name:"第一个对象"})// 改变 变量的指向obj1 reactive({name:"第二个对象的属性"})co…

三天精通Selenium Web 自动化 - Selenium(Java)环境搭建 (new)

0 背景 开发工具idea代码管理mavenjdk1.8webdriver chrome 1 chromedriver & chrome chromedriver和chrome要对应上&#xff1a; chomedriver下载地址&#xff1a;淘宝镜像 这里用的是 chromedriver88-0-4324-96.zipchrome下载地址&#xff1a;如何降级和安装旧版本的C…

【计算机网络基础3】ARP/RARP协议、路由选择协议和TCP/IP协议

1、ARP/RARP协议 地址解析协议&#xff0c;即ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机&#xff0c;并接收返回消息&#xff0c;以此确…

HTTP深度解析:构建高效与安全网络的关键知识

1. HTTP基础及其组件 我首先想和大家分享的是HTTP的基础知识。HTTP&#xff0c;即超文本传输协议&#xff0c;是互联网上最常用的协议之一。它定义了浏览器和服务器之间数据交换的规则&#xff0c;使得网页内容可以从服务器传输到我们的浏览器上。想象一下&#xff0c;每当你点…

kafka配置多个消费者groupid kafka多个消费者消费同一个partition(java)

目录 1- 单播模式&#xff0c;只有一个消费者组2- 广播模式&#xff0c;多个消费者组3- Java实践 kafka是由Apache软件基金会开发的一个开源流处理平台。kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。 kafka中partition…

Linux实用操作(超级实用)

Linux实用操作篇-上篇&#xff1a;Linux实用操作-上篇-CSDN博客 Linux实用操作篇-下篇&#xff1a;Linux实用操作篇-下篇-CSDN博客 一、各类小技巧&#xff08;快捷键&#xff09; 1.1 ctrl c 强制停止 Linux某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以…

Redis缓存异常问题,常用解决方案总结

前言 Redis缓存异常问题分别是&#xff1a;1.缓存雪崩。2.缓存预热。3.缓存穿透。4.缓存降级。5.缓存击穿&#xff0c;以 及对应Redis缓存异常问题解决方案。 1.缓存雪崩 1.1、什么是缓存雪崩 如果缓存集中在一段时间内失效&#xff0c;发生大量的缓存穿透&#xff0c;所有…

【MySQL】MySQL数据库基础--什么是数据库/基本使用/MySQL架构/存储引擎

文章目录 1.什么是数据库2.主流数据库3.基本使用3.1MySQL安装3.2连接服务器3.3服务器管理3.4服务器&#xff0c;数据库&#xff0c;表关系3.5使用案例3.6数据逻辑存储 4.MySQL架构5.SQL分类6.存储引擎6.1什么是存储引擎6.2查看存储引擎6.3存储引擎对比 1.什么是数据库 对于回答…

MySQL笔记-第18章_MySQL8其它新特性

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第18章_MySQL8其它新特性1. MySQL8新特性概述1.1 MySQL8.0 新增特性1.2 MySQL8.0移除的旧特性 2. 新特性1&#xff1a;窗口函数2.1 使用窗口…

【LeetCode刷题-树】--144.二叉树的前序遍历

144.二叉树的前序遍历 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) …

『npm』一条命令快速配置npm淘宝国内镜像

&#x1f4e3;读完这篇文章里你能收获到 一条命令快速切换至淘宝镜像恢复官方镜像 文章目录 一、设置淘宝镜像源二、恢复官方镜像源三、查看当前使用的镜像 一、设置淘宝镜像源 npm config set registry https://registry.npm.taobao.org服务器建议全局设置 sudo npm config…