基于匈牙利算法的指派问题优化分析项目说明
项目介绍
本项目是一个专门用于解决经典指派问题的线性规划优化工具。指派问题的核心在于如何建立 $N$ 项任务与 $N$ 个执行者之间的一一对应关系,使得在满足所有分配要求的前提下,实现总成本最小化或总效益最大化。该工具基于严谨的匈牙利算法逻辑,通过矩阵变换与覆盖线搜索,能够在线性时间内收敛得到全局最优解。
功能特性
- 标准化指派求解:支持任意 $N times N$ 的成本矩阵输入,核心逻辑严格遵循匈牙利算法的五个标准步骤。
- 双重目标适配:默认求解最小化成本问题,同时内置了效益矩阵转换机制,通过简单的矩阵变换即可处理最大化效益分配场景。
- 迭代过程追踪:算法记录并输出从矩阵归约到达到最优指派所需的迭代次数,体现算法的收敛效率。
- 智能状态标记:代码实现了独立零元素(Star Zeros)与试验零元素(Prime Zeros)的动态标记与转换逻辑,确保复杂矩阵下的路径搜索准确性。
- 直观结果可视化:通过图形化界面展示原始成本分布与最终指派方案,利用颜色与形状区分最优决策。
系统要求
- 软件环境:MATLAB R2016b 或更高版本。
- 核心函数依赖:依赖于
bsxfun、find 以及基础绘图工具箱,无需安装第三方集成插件。
实现逻辑与算法流程
代码的运行逻辑分为数据初始化、矩阵预处理、循环增广路径寻找以及结果展示四个阶段,具体逻辑如下:
1. 矩阵预处理阶段
首先进行行归约,使每行减去其最小值,至少产生一个零元素;随后根据行归约后的结果进行列归约。接着系统会进行初步指派,在归约后的矩阵中寻找互不相关的零元素,并作为初始的独立零元素进行标记。
2. 核心状态转换模型
代码采用状态机结构(Step 3 - Step 7)控制算法演进:
- 掩模映射:使用状态矩阵记录元素状态,其中 1 代表独立零元素,2 代表试验零元素。
- 覆盖搜索:算法通过覆盖包含独立零元素的列来检查当前分配是否已达到最优。
- 零元素转换:若未达到最优,则在未覆盖区域寻找零元素并标记为试验零元素。
- 路径增广:若发现此行无独立零元素,则触发增广路径搜索(L-M 路径逻辑),通过反转路径上的零元素状态(独立变普通,试验变独立)来增加独立零元素的总数。
- 矩阵调整:当无法找到新的零元素时,计算未覆盖区域的最小值,调整矩阵元素以产生新的零元素。
3. 安全退出机制
为防止异常输入或极端情况下的无限循环,算法内置了 1000 次最大迭代的安全阈值,确保计算资源的安全性。
关键函数与细节分析
该部分实现了复杂的矩阵掩模逻辑。它管理
rowCover 和
colCover 向量来跟踪哪些行或列已被覆盖。通过
any 和
logical 索引操作实现高效的矩阵元素筛选。
专门用于在当前覆盖状态下检索矩阵中的零元素坐标。这是算法决策进入路径搜索还是矩阵调整阶段的关键依据点。
实现了典型的交替路径搜索。它从特定的试验零元素出发,交替寻找同列中的独立零元素和同行中的试验零元素,建立一连串的坐标链条,并通过状态翻转来优化分配结构。
该部分将数值矩阵转化为二维坐标系。利用散点绘制功能,将执行者设为纵轴,任务设为横轴。所有任务对应的成本值分布在网格中,通过灰色与红色的视觉对比,直观勾勒出最优分配的路径。
使用方法
- 配置矩阵:打开项目主程序,在输入数据设置区域修改 $N times N$ 成本矩阵。
- 设定目标:如需最大化效益,取消成本矩阵转换逻辑的注释。
- 运行程序:执行该脚本,MATLAB 命令行将实时打印收敛迭代次数、最小化总成本以及详细的执行者到任务的配对信息。
- 查看图表:程序会自动生成一张可视化结果图,红色框标注的位置即为最优的指派方案。