Worker调度算法

2023-12-31

问题

这就是我想要解决的问题的本质。我们有工作人员在周末的固定时间在托儿所照顾孩子。一个周末有 16 个不同的时段需要填补。因此,对于为期 4 周的月份,需要填补 64 个空缺。我们最多有 30 名托儿所工人(尽管我们需要更多。有人喜欢孩子吗?)。

编辑:每个时隙都是离散的 - 它们不重叠。

目前每个月都有一个人制定托儿所时间表。每个月根据每个人的喜好制定这个时间表是一项复杂且耗时的任务。考虑完这个问题后我心里想,“一定会有更好的办法!”

算法

我注意到问题本质上是二分图 http://en.wikipedia.org/wiki/Bipartite_graph. The 婚姻问题 http://www.mcs.csueastbay.edu/~simon/handouts/4245/hall.html也是一个二分图,您可以使用匹配算法来解决,例如Edmonds 匹配算法 http://en.wikipedia.org/wiki/Edmonds%27s_matching_algorithm.

但这假设一个节点集中的每个节点仅与另一节点集中的一个节点匹配。就我而言,每个托儿所工作人员只能工作一个时间段。由于我们人手严重不足,这是行不通的!一群人必须每月工作两次才能填满所有的时间段。

这似乎意味着这更像是经典的“医院/居民问题”。它与婚姻问题的不同之处在于,“女性”可以接受多个“男性”的“求婚”(例如,一家医院可以接纳多名住院医师)。就我而言,一名托儿所工作人员可以占用多个时间段。

现在怎么办?

Whew!

现在我已经完成了设置......有人知道任何解释或显示这种算法的好链接吗?有更好的方法来解决这个问题吗?是我想多了吗?我在谷歌上搜索“医院住院医师算法”并找到了研究生论文。嘎!我毕业时获得了计算机科学学位,并参加了人工智能课程……但那是 6 年前的事了。Help!

非常感谢任何建议!


“医院/居民问题”确实可以解决,但这取决于你的限制:

  • 医院有最大容量,并将命令住院医师(最想要的到不太想要的)。
  • 居民将订购医院。
  • 不可能有其他限制。

在你的例子中,医院是工人,居民是槽位。

  • 老虎机可以命令工人(也许你更喜欢在早上进行实验......)。
  • 工人可以订购槽位。
  • 但你不能有其他限制,例如:“我早上工作,我不想在晚上工作”。

如果这对你来说没问题,那么你就有可能:

  • 您想为工人提供优势:“以医院为导向的案例”。

    您将尝试将工作人员分配到他们喜欢的位置。

  • 您想要优势槽位:“面向居民的案例”

    每个槽位都会有自己喜欢的工人。

我去年必须编写它,这是代码。

/* 
RO : needed for Resident-Oriented version
HO : needed for Hospital-Oriented version
*/
const int MAX_R = 1000;
const int MAX_H = 1000;
const int INF = 1000*1000*1000;

您需要填写输入变量。 一切都很简单:

  • R_pref 和 H_pref 是居民/医院的偏好列表
  • H_rank[h][r] 是 r 在 H_pref[h] 中的排名:r 在 h 的偏好列表中的位置

就这样。

// Input data
int R, H;                   // Number of Residents/Hospitals
int C[MAX_H];               // Capacity of hospitals
vector<int> R_pref[MAX_R], H_pref[MAX_H]; // Preferences : adjency lists
/*RO*/int H_rank[MAX_H][MAX_R];   // Rank : rank of r in H_pref[h]
/*HO*/int R_rank[MAX_R][MAX_H];   // Rank : rank of h in R_pref[r]

下面不用碰。

// Internal data
int RankWorst[MAX_H];   // Rank of the worst r taken by h
/*RO*/int BestH[MAX_R];       // Indice of the best h in R_pref the r can get
/*HO*/int BestR[MAX_H];       // Indice of the best r in H_pref the h can get
int Size[MAX_H];        // Number of residents taken by h

// Output data
int M[MAX_R];

void stable_hospitals_RO()
{
    for(int h = 0 ; h < H ; h++)
      RankWorst[h] = H_pref[h].size()-1;
    fill_n(BestH, R, 0);
    fill_n(Size, H,0);
    fill_n(M,R,INF);
    for (int i = 0; i < R; i++)
        for (int r = i; r >= 0;)
        {
        if(BestH[r] == int(R_pref[r].size()))
            break;
            const int h = R_pref[r][BestH[r]++];
            if(Size[h]++ < C[h])
            {
                M[r] = h;
                break;
            }
            int WorstR = H_pref[h][RankWorst[h]];
            while(WorstR == INF || M[WorstR] != h) // Compute the worst
                WorstR = H_pref[h][--RankWorst[h]];
            if(H_rank[h][r] < RankWorst[h])        // Ranked better that worst
            {
                M[r] = h;
                M[r = WorstR] = INF;    // We have eliminate it, he need to put it somewhere
            }
        }
}
void stable_hospitals_HO()
{
    fill_n(BestR, H, 0);
    fill_n(Size, H,0);
    fill_n(M,R,INF);
    vector<int> SH;
    for (int h = 0; h < H; h++)
        SH.push_back(h);
    while(!SH.empty())
    {
        int h = SH.back();
        if(Size[h] == C[h] || BestR[h] == int(H_pref[h].size())) // Full or no r available
        {
            SH.pop_back();
            break;
        }
    const int r = H_pref[h][BestR[h]++];
    // r is unassigned or prefer h to current hospital
        if(M[r] == INF || R_rank[r][h] < R_rank[r][M[r]]) 
        {
            if(++Size[h] == C[h]) // Will be full
                SH.pop_back();
            if(M[r] != INF) // Delete from M[r]
            {
                Size[M[r]]--;
                SH.push_back(M[r]);
            }
            M[r] = h;
        }
    }
}

用于展示如何根据首选项建立排名的示例。 (在这种情况下,首选项列表位于标准输入上)。

int main()
{
    scanf("%d%d",&R,&H);
    int num;
    // put inf

    for(int r = 0 ; r < R ; r++)
    {
        scanf("%d",&num);
        R_pref[r].resize(num);
        for(int h = 0 ; h < num ; h++)
        {
            scanf("%d",&R_pref[r][h]);
            R_rank[r][R_pref[r][h]] = h;
        }
    }
    for(int h = 0 ; h < H ; h++)
    {
        scanf("%d",&C[h]);
        scanf("%d",&num);
        H_pref[h].resize(num);
        for(int r = 0 ; r < num ; r++)
        {
            scanf("%d",&H_pref[h][r]);
            H_rank[h][H_pref[h][r]] = r;
        }
    } 
    stable_hospitals_RO();
    printf("\n\n\n\n");
    stable_hospitals_HO();
    return 0;
}

举个例子: 1 号至 3 号医院,6 名居民。

H_首选项:

  • 1 -> 2 5 6 1(优先选择 2 然后 5 然后 6 然后 1)
  • 2 -> 4 2 1 6 3 5
  • 3 -> 1 2

R_首选项:

  • 1 -> 1 2 3
  • 2 -> 3 1
  • 3 -> 2 1
  • 4 -> 1 3 2
  • 5 -> 3 2 1
  • 6 -> 3

H_等级:

  • 1 -> 4 1 INF INF 2 3 (1 位于 H_pref[1] 中的位置 4,3 不存在)
  • 2 -> 3 2 5 1 6 4
  • 3 -> 1 2 INF INF INF INF

R_rank 类似。

医院不必对每个人进行排名,也可以对少于其容量的人进行排名。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Worker调度算法 的相关文章

  • 线性代数如何在算法中使用?

    我的几个同行都提到 学习算法时 线性代数 非常重要 我研究了各种算法并学习了一些线性代数课程 但我没有看到其中的联系 那么线性代数如何应用在算法中呢 例如 图的连接矩阵可以带来哪些有趣的事情 三个具体例子 线性代数是现代 3D 图形的基础
  • 在 O(n) 时间内找到 n x n 矩阵中的局部最小值

    所以 这不是我的家庭作业问题 而是取自 coursera 算法和数据结构课程的未评分作业 现已完成 You are given an n by n grid of distinct numbers A number is a local m
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • 将嵌套字典中的所有键从camelCase转换为snake_case

    我有一本类似这样的字典 firstName abc lastName xyz favoriteMovies Star Wars The lone ranger favoriteCountries country China capitalC
  • 如何高效地在屏幕上精确绘制N个点?

    这听起来是一个简单的问题 但我发现要获得良好的性能是非常棘手的 我提出的第一个算法是随机绘制点 从一组中检查是否已绘制 否则绘制 如果我们只绘制几个点 那么这种方法效果很好 但当我们接近填满屏幕时 速度会灾难性地减慢 我想出的最好的方法是构
  • 通过分布式数据库聚合作业优化网络带宽

    我有一个分布式 联合数据库 结构如下 数据库分布在三个地理位置 节点 每个节点集群有多个数据库 关系数据库是 PostgreSQL MySQL Oracle 和 MS SQL Server 的混合体 非关系数据库是 MongoDB 或 Ca
  • 如何将一组重叠范围划分为不重叠范围?

    假设您有一组范围 0 100 一 0 75 b 95 150 c 120 130 d 显然 这些范围在某些点上重叠 您将如何剖析这些范围以生成不重叠范围的列表 同时保留与其原始范围相关的信息 在本例中为范围后面的字母 例如 运行算法后的上述
  • 点集子集的最小周长凸包

    给定平面上的 n 个点 没有 3 个共线 给定数字 k 找到 k 个点的子集 使得 k 个点的凸包在 k 个点的子集的任何凸包中具有最小周长 我可以想到一个简单的方法 运行时间为 O n k k log k 找到大小为 k 的每个子集的凸包
  • 包围一组点的多边形

    我有一组 S 点 2D 由 x 和 y 定义 我想找到 P 包围该组所有点的最小 含义 具有最少数量的点 多边形 P 是S 有没有已知的算法来计算这个 我在这个领域缺乏文化令人惊讶 感谢您的帮助 对于这个问题有很多算法 它被称为 最小边界框
  • 用 C++ 生成 AST

    我正在用 C 制作一个解释器 到目前为止我已经有了词法分析器来生成标记 问题是我不确定如何生成 行走 解析树 我正在考虑使用数组数组来制作解析树 但我不确定如何以正确的顺序将标记实际插入到解析树中 我不确定是自上而下 左右还是自下而上 左右
  • 使用多级解决方案计算二维网格中的最近邻

    我有一个问题 在 x y 大小的网格中 我提供了一个点 并且我需要找到最近的邻居 在实践中 我试图在 pygame 中找到距离光标最近的点 该点跨越颜色距离阈值 计算如下 sqrt rgb1 0 rgb2 0 2 rgb1 1 rgb2 1
  • 在常数空间中创建 1..N 的随机排列

    我正在寻找枚举固定空间中数字 1 N 的随机排列 这意味着我无法将所有数字存储在列表中 原因是 N 可能非常大 超过可用内存 我仍然希望能够一次遍历这样一个数字的排列 只访问每个数字一次 我知道对于某些 N 可以这样做 许多随机数生成器随机
  • 使用并集查找(又名不相交集)检测图是否是二分图

    我正在 Spoj 上做一个问题 基本上可以简化为检测图是否是二分图 我正在尝试使用 dfs 为图表着色 但它太慢了 有人评论这个 没有 bfs 没有 dfs 没有二部图 简单的并查集就可以做到 确实速度很快 提示 1 偶数长度的环不会影响两
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 直接选择排序与交换选择排序

    有什么区别直接选择排序 vs 交换选择排序 今天我陷入了一场争论 我的教授在他的讲义中使用了这两个术语 维基百科和任何教科书或网站都会为您提供的选择排序就是他所说的 交换选择排序 我以前从未听说过 交换选择排序 这个术语 仅 选择排序 并且
  • Silverlight 中的图形可视化

    我有一个表示有向图的数据结构 我正在寻找一个好的 Silverlight 可视化 以允许我从一个节点导航到另一个节点 最好带有一些漂亮的动画 有谁知道这种显示有什么好的 UI 控件或框架吗 甚至是来自另一个领域的样本 也许是社交网络 我的图
  • 带约束的嵌套集合视图的意外行为 (Swift 4)

    我的表格视图中有一个单元格 其中包含水平分页集合视图 该集合视图的每个页面内都有一个垂直集合视图 为了避免 滚动滚动 问题 我在垂直集合视图中禁用了垂直滚动 垂直集合视图的单元格计数不是静态的 可以是任意数字 因此 这会产生一个问题 集合视
  • 使用 PHP 创建图表并导出为 PDF

    我正在寻找有关使用 PHP 创建图表的建议 我还希望能够将这些图表导出到 PDF 文档 我目前正在使用谷歌图表 但我不喜欢将我的所有信息发送到谷歌的想法 我更喜欢自己的托管解决方案 我见过很多 Flash 解决方案 但我不知道有什么方法可以
  • SQL 约束最小值/最大值?

    有没有办法为数字字段设置 SQL 约束 最小值应为 1234 最大值应为 4523 SQL Server 语法为the check约束 http technet microsoft com en us library ms179491 as
  • Florian 的 Grisu2 算法如何工作?

    我遇到了一个关于将 double 转换为 ascii 的问题 经过搜索 我得到了 Florian 的论文 使用整数快速准确地打印浮点数 http www cs tufts edu nr cs257 archive florian loits

随机推荐

  • 最小化代码,因为我使用相同的代码,仅 p 标签中的内容发生变化,组件 Accordion Header 标头发生变化

    我是js新手 我需要显示 6 个滑块 我单击时的每个 div 都应打开其相应的内容 当我再次单击 div 时 内容应该关闭 就像手风琴一样 正确知道它的工作原理 但如何最小化代码 因为我使用相同的代码 只有 p 标签中的内容发生变化 组件
  • CSS 不透明度属性?

    我真的需要所有这些 CSS 不透明度属性吗 我不会同时使用所有这些 而是 以不同的百分比显示它们 但我通常有 4 人一组 我想看看是否可以从样式表中删除任何内容 有人能给我举个 100 25 和 0 的例子吗 我想确保我正确地完成了它们 o
  • iOS5中如何获取默认的LandscapeLeft方向?

    抱歉 如果这个问题重复 但我找不到相同的解决方案 在 iOS6 中 如果我想为一个 UIViewController 设置默认方向 我只需使用 BOOL shouldAutorotate return YES NSUInteger supp
  • 带有 FileField 的 Django 模型——动态“upload_to”参数

    我使用带有 FileField 的模型来处理文件上传 现在文件就可以成功上传了 不过 我还想做一个小改进 那就是为用户创建用户名的文件夹 这是我尝试过的代码 class UserFiles models Model user models
  • 找不到“FacebookSDK/FacebookSDK.h”文件

    我已经安装了最新版本PhoneGap Facebook 插件 https github com phonegap phonegap facebook plugin但是当我构建项目时 我收到以下错误消息 我尝试了 stackoverflow
  • 谷歌地图片段在scrollView内

    所以我一直在尝试使用谷歌地图精简版fragment里面一个scrollView我无法显示地图 删除后scrollView然后将片段单独保留 现在您就可以看到地图了 我只是想了解为什么会这样 以及是否有任何方法可以让这个片段显示在我的滚动视图
  • NHibernate 缓存问题 - 何时调用 Evict?

    我遇到了一个明显的缓存问题 NHibernate 返回的内容与数据库中的内容不匹配 我相信这是二级缓存数据 看起来我可以使用 Evict 来做到这一点 但是什么时候应该实际调用 Evict 方法 对于我的特定应用程序 数据对于用户来说是唯一
  • Azure Signalr 服务中的单位是什么?

    So I ve been going through Azure Signal R Service for blazor apps and I ve noticed they have their pricing according to
  • Android Button 下无法去除阴影

    I have a Android Button that I m placing on my screen and am defining a custom background drawable that just specifies a
  • 缓冲随机访问文件 java

    RandomAccessFile 对于随机访问文件来说相当慢 您经常阅读有关在其上实现缓冲层的信息 但无法在网上找到执行此操作的代码 所以我的问题是 知道这个类的任何开源实现的你们会共享一个指针还是共享您自己的实现 如果这个问题能成为关于这
  • 提高比较算法 np.packbits(A==A[:, None], axis=1) 的性能

    我正在寻找内存优化np packbits A A None axis 1 where A是长度整数的密集数组n A A None 内存是否需要大容量n因为生成的布尔数组存储效率低下 每个布尔值占用 1 个字节 我编写了下面的脚本来实现相同的
  • 扩展Qt标准图标

    如何扩展 QStyle 类提供的标准图标并支持 Windows 和 Linux namespace Ui class TVLoader class TVLoader public QMainWindow Q OBJECT public ex
  • 查询 MongoDb 中的嵌套数组

    我想通过嵌套数组中存在的字符串来检索文档 例如 数据 表示句子的依存解析 如下所示 tuples xcomp multiply using det method the nn method foil dobj using method 我发
  • CPU预测和内存屏障

    我正在学习记忆障碍所以我提到记忆障碍 https www kernel org doc Documentation memory barriers txtLinux 内核源代码中的文档 还有一个描述我无法理解 控制依赖关系可能有点棘手 因为
  • C 标准是否允许为指针分配任意值并递增它?

    这段代码的行为定义是否明确 include
  • 如何将 Writer 转换为字符串

    Writer writer new Writer String data writer toString the value is not casting and displaying null 还有其他方法可以将 writer 转换为字符
  • Vue.js 无法切换字体很棒的图标

    我正在尝试根据布尔值切换很棒的字体图标 但看起来很棒的字体图标在绘制后仍保留在屏幕上 https jsfiddle net 50wL7mdz 200312 https jsfiddle net 50wL7mdz 200312 HTML
  • 实体框架 - Linq To 实体 - 多对多查询问题

    我在查询 Linq To Entities 中的多对多关系时遇到问题 我基本上尝试使用 Linq 复制此查询 Select FROM Customer LEFT JOIN CustomerInterest ON Customer Custo
  • 从 Play 框架 (Scala) 中的 play.api.mvc.Action[AnyContent] 获取响应正文

    我有以下 Play Scala 代码 object Experiment extends Controller routes file directs genki here def genki name String Action pipe
  • Worker调度算法

    问题 这就是我想要解决的问题的本质 我们有工作人员在周末的固定时间在托儿所照顾孩子 一个周末有 16 个不同的时段需要填补 因此 对于为期 4 周的月份 需要填补 64 个空缺 我们最多有 30 名托儿所工人 尽管我们需要更多 有人喜欢孩子