Java 实现基于团队与可用性约束的最大化配对算法

夜伟酱_1729

夜伟酱_1729

2026-07-22

799人浏览

原创

Java 实现基于团队与可用性约束的最大化配对算法

本文介绍如何在 java 中为一组 agent 对象构建满足“同可用性、跨团队”条件的最大配对方案,并输出所有成功配对及剩余未配对人员,兼顾算法合理性与工程实用性。

本文介绍如何在 java 中为一组 agent 对象构建满足“同可用性、跨团队”条件的最大配对方案,并输出所有成功配对及剩余未配对人员,兼顾算法合理性与工程实用性。

要实现“最大化配对”,核心在于将问题建模为二分图最大匹配(Maximum Bipartite Matching)——这是组合优化中的经典场景。虽然原始需求看似简单(遍历+贪心匹配),但贪心策略(如按顺序找第一个可配对象)无法保证全局最优,尤其当团队规模严重失衡时(例如 NW 有 5 名可用成员,而 W 和 SW 合计仅 2 名),极易导致大量人员闲置。

✅ 正确建模方式如下:

  • 节点划分:所有 available == true 的 Agent 构成左部节点集;
  • 边定义:左部节点 a 与右部节点 b 之间存在边 ⇔ a.team != b.team(注意:无需区分左右部是否“可用”——因为仅 available == true 的人才参与配对,故右部也应严格限定为 available == true 的 Agent);
  • 目标:在该无向二分图中寻找边数最多的匹配(即互不共享顶点的边集合)。

⚠️ 常见误区纠正:答案中提及“Node set 1 = available, Node set 2 = unavailable”是错误的——不可用人员(available == false)根本不能参与配对,不应纳入图中。正确做法是:全图仅含可用人员,边仅存在于不同团队的可用人员之间,形成一个“跨团队可用人员”的无向图,再求其最大匹配(非二分图亦可,但二分图更易处理)。

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载

推荐实现路径(轻量级、可落地)

由于 Hopcroft-Karp 或 Blossom 算法工程复杂度高,对于中等规模数据(DFS 增广路算法(Hungarian-style),时间复杂度 O(V·E),简洁高效:

// 构建邻接表:agentIndex -> list of indices of available agents from other teams
List<list>> graph = new ArrayList();
Map<string list>> teamToIndices = new HashMap(); // team -> list of available agent indices

// 预处理:收集所有 available agent 的索引,并按 team 分组
for (int i = 0; i ());
        teamToIndices.computeIfAbsent(a.getTeam(), k -> new ArrayList()).add(i);
    } else {
        graph.add(Collections.emptyList()); // 不可用者不参与
    }
}

// 构建图:对每个可用 agent i,连接所有 team ≠ i.team 的可用 agent j
for (int i = 0; i  {
        if (!team.equals(iTeam)) {
            graph.get(i).addAll(indices);
        }
    });
}

// DFS 增广路(标准最大匹配模板)
int[] match = new int[agents.size()]; // match[j] = i 表示 j 匹配到 i
Arrays.fill(match, -1);
int result = 0;

for (int u = 0; u > graph) {
    for (int v : graph.get(u)) {
        if (visited[v]) continue;
        visited[v] = true;
        if (match[v] == -1 || dfs(match[v], visited, match, graph)) {
            match[v] = u;
            match[u] = v; // 双向记录便于输出
            return true;
        }
    }
    return false;
}

// 输出结果
List<pair agent>> pairs = new ArrayList();
Set<integer> paired = new HashSet();
for (int i = 0; i (agents.get(i), agents.get(match[i])));
        paired.add(i);
        paired.add(match[i]);
    }
}

List<agent> unpaired = new ArrayList();
for (int i = 0; i <h3>关键注意事项</h3>
<ul>
<li>
<strong>去重与对称性</strong>:match[u] = v 与 match[v] = u 是同一对,遍历时需用 paired 集合避免重复添加;  </li>
<li>
<strong>JSON 解析健壮性</strong>:使用 Jackson 时,确保 Boolean available 字段能正确反序列化 true/false/null(建议用 @JsonInclude(Include.NON_NULL) + Boolean 而非 boolean);  </li>
<li>
<strong>性能边界</strong>:若 Agent 总数超 5000,建议改用 Hopcroft-Karp(O(√V·E))或引入团队间队列轮询的近似贪心(如优先匹配稀缺团队);  </li>
<li>
<strong>业务扩展性</strong>:后续如需支持“偏好权重”“禁止配对名单”,可平滑过渡至带权二分图匹配(Kuhn-Munkres 算法)。</li>
</ul>
<p>最终,该方案不仅能输出最大数量的有效配对(如示例中可得 3 对),还能清晰列出所有落单的可用人员(如某团队只剩 1 人且其余团队无可配者),真正实现“匹配最大化 + 透明化未匹配原因”。</p></agent></integer></pair></string></list>

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10197

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7322

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6432

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1104

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

908

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1336

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2689

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20011

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1195

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习