python - 实际调度问题的 Hopcroft Karp 算法的实现
问题描述
我们有一个最大的二分匹配问题,需要为 M 人分配 N 个位置,这样每个位置至少有一个人,M 人的一个子集每个人将拥有这 N 个位置中的一个,而其他人将拥有其中 2 个分配给他们的插槽。
例如:8 个插槽,6 人。其中 4 个人只需要每人覆盖 1 个插槽,但其他 2 人将每人覆盖 2 个。因此,将分配所有 8 个插槽 (4*1 + 2*2)。
输入数据将反映 M 人中的哪一个将覆盖 1 个插槽,哪些将每个覆盖 2 个插槽。
到目前为止,我们使用HopCroft Carp进行了以下实现:
from hopcroftkarp import HopcroftKarp
graph = {'john': {12, 3, 5}, 'june': {5, 10, 8}, 'joe': {5, 3}}
HopcroftKarp(graph).maximum_matching(keys_only=True)
>> {'joe': 3, 'june': 5, 'john': 12}
为了使问题进一步复杂化,每个用户都可以指定 3 个选项之一preferred
:not preferred but available
和conflict (not available)
。
我们如何将插槽分配给人们,以便大多数人获得首选插槽,然后是“首选但不可用的插槽”,而没有人获得“不可用”?我们如何调整上述现有信息以考虑人们拥有的这 3 个选择?另外,我们如何进一步反映某些人需要分配2个插槽?
我们已经研究过类似的问题,但是它们只为人们提供 2 个选项available
或not available
.
解决方案
推荐阅读
- php - PHP:将存储在 $_FILES 中的上传文件重新提交/转发到另一个脚本
- python - 使用 Selenium 获取 HTML 的某些元素
- html - 防止href在组件内点击onclick
- python - 在python中将二进制字符串数据转换为十六进制
- azure - 使用 azure cli 启动解除分配的 VM (3-6) 大约需要半小时
- java - 如何在firebase数据库中找到最新节点
- javascript - 从 URL 参数中获取 id
- google-cloud-storage - Gsutil 批量复制/移动文件
- javascript - 如何在没有 SSL/TLS 的情况下加密数据客户端并在另一个客户端解密?
- android - 配置更改后 Koin 更新 Android 上下文