讲师中心 微信公众号
AI工具推荐 视频效率加速

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

夜伟酱_1729

夜伟酱_1729

发布时间:2026-07-22 17:31:10

|

799人浏览过

|

来源于php中文网

原创

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 算法工程复杂度高,对于中等规模数据(< 1000 人),推荐采用 DFS 增广路算法(Hungarian-style),时间复杂度 O(V·E),简洁高效:

立即学习“Java免费学习笔记(深入)”;

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

// 预处理:收集所有 available agent 的索引,并按 team 分组
for (int i = 0; i < agents.size(); i++) {
    Agent a = agents.get(i);
    if (Boolean.TRUE.equals(a.isAvailable())) {
        graph.add(new ArrayList<>());
        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 < agents.size(); i++) {
    if (!Boolean.TRUE.equals(agents.get(i).isAvailable())) continue;
    String iTeam = agents.get(i).getTeam();
    teamToIndices.forEach((team, indices) -> {
        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 < agents.size(); u++) {
    if (!Boolean.TRUE.equals(agents.get(u).isAvailable())) continue;
    boolean[] visited = new boolean[agents.size()];
    if (dfs(u, visited, match, graph)) result++;
}

// 辅助 DFS 函数
boolean dfs(int u, boolean[] visited, int[] match, List<List<Integer>> 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, Agent>> pairs = new ArrayList<>();
Set<Integer> paired = new HashSet<>();
for (int i = 0; i < match.length; i++) {
    if (match[i] != -1 && !paired.contains(i) && !paired.contains(match[i])) {
        pairs.add(new Pair<>(agents.get(i), agents.get(match[i])));
        paired.add(i);
        paired.add(match[i]);
    }
}

List<Agent> unpaired = new ArrayList<>();
for (int i = 0; i < agents.size(); i++) {
    if (Boolean.TRUE.equals(agents.get(i).isAvailable()) && !paired.contains(i)) {
        unpaired.add(agents.get(i));
    }
}

关键注意事项

  • 去重与对称性:match[u] = v 与 match[v] = u 是同一对,遍历时需用 paired 集合避免重复添加;
  • JSON 解析健壮性:使用 Jackson 时,确保 Boolean available 字段能正确反序列化 true/false/null(建议用 @JsonInclude(Include.NON_NULL) + Boolean 而非 boolean);
  • 性能边界:若 Agent 总数超 5000,建议改用 Hopcroft-Karp(O(√V·E))或引入团队间队列轮询的近似贪心(如优先匹配稀缺团队);
  • 业务扩展性:后续如需支持“偏好权重”“禁止配对名单”,可平滑过渡至带权二分图匹配(Kuhn-Munkres 算法)。

最终,该方案不仅能输出最大数量的有效配对(如示例中可得 3 对),还能清晰列出所有落单的可用人员(如某团队只剩 1 人且其余团队无可配者),真正实现“匹配最大化 + 透明化未匹配原因”。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
java
java

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

10217

2023.06.15

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

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

7342

2023.07.05

java自学难吗
java自学难吗

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

6452

2023.07.31

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

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

1104

2023.08.01

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

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

908

2023.08.02

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

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

1336

2023.08.02

java有什么用
java有什么用

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

2689

2023.08.02

java在线网站
java在线网站

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

20011

2023.08.03

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

20

2026.10.10

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn