给每个人分配一组文章来阅读,同时优先考虑某些分组
Assign each person a set of essays to read, while prioritizing certain groupings
假设:
- 要阅读的 10,000 篇学生论文,每篇都与一所高中相关
- 80 readers,有一个 desired_essay_count 和一个 maximum_essay_limit。
- 国家分为 300 个地区,每个地区属于一个州(例如加利福尼亚 1、加利福尼亚 2 等)
要求:
- 来自一所高中的论文将被分配到
单身 reader(也就是高中不能分开)
- 尝试将区域保持在一起
- 尝试将状态保持在一起
是否有类似此设置的算法?目前,我正在按州、地区和高中对所有论文进行分类。然后,我将高中论文组合在一起,并将它们分配给队列中可用 space 的下一个 reader,并重复直到 reader 命中 max_essay_limit。很简单,它导致了一个相对干净的解决方案,但根本没有考虑 desired_essay_count(意味着队列末尾的 reader 最终只有几篇文章可供阅读)。
我会用优先队列解决这个问题。
第一个是论文组队列,它总是会为您提供最大的分组。您从与州相对应的组开始,数据结构可以很容易地按地区或学校细分。
第二个是读者队列。根据您与 desired_essay_count 的距离来确定这篇文章的优先级,以便您尝试先将文章分配给负载较轻的读者。
现在是算法。
while you have groups:
group = next group in groups
scanned_readers = empty array
while you have readers:
reader = next reader in readers
if you can comfortably assign group to reader:
assign group
put reader back in readers with new priority
replace scanned_readers into reader
GO TO NEXT ITERATION of groups loop.
else:
put reader into scanned_readers
put all readers for reader in priority_queue
if the group can be split:
split the group into pieces, put them into groups array
else:
find a reader who can do it, no matter how much they don't want to.
(or else give up)
这将做出真诚的努力,使各州、地区和学校团结在一起。它会根据人们想要的工作量来平均分配负载。它应该 运行 可以接受地很快。
假设:
- 要阅读的 10,000 篇学生论文,每篇都与一所高中相关
- 80 readers,有一个 desired_essay_count 和一个 maximum_essay_limit。
- 国家分为 300 个地区,每个地区属于一个州(例如加利福尼亚 1、加利福尼亚 2 等)
要求:
- 来自一所高中的论文将被分配到 单身 reader(也就是高中不能分开)
- 尝试将区域保持在一起
- 尝试将状态保持在一起
是否有类似此设置的算法?目前,我正在按州、地区和高中对所有论文进行分类。然后,我将高中论文组合在一起,并将它们分配给队列中可用 space 的下一个 reader,并重复直到 reader 命中 max_essay_limit。很简单,它导致了一个相对干净的解决方案,但根本没有考虑 desired_essay_count(意味着队列末尾的 reader 最终只有几篇文章可供阅读)。
我会用优先队列解决这个问题。
第一个是论文组队列,它总是会为您提供最大的分组。您从与州相对应的组开始,数据结构可以很容易地按地区或学校细分。
第二个是读者队列。根据您与 desired_essay_count 的距离来确定这篇文章的优先级,以便您尝试先将文章分配给负载较轻的读者。
现在是算法。
while you have groups:
group = next group in groups
scanned_readers = empty array
while you have readers:
reader = next reader in readers
if you can comfortably assign group to reader:
assign group
put reader back in readers with new priority
replace scanned_readers into reader
GO TO NEXT ITERATION of groups loop.
else:
put reader into scanned_readers
put all readers for reader in priority_queue
if the group can be split:
split the group into pieces, put them into groups array
else:
find a reader who can do it, no matter how much they don't want to.
(or else give up)
这将做出真诚的努力,使各州、地区和学校团结在一起。它会根据人们想要的工作量来平均分配负载。它应该 运行 可以接受地很快。