为每个人分配一组阅读文章,同时优先考虑某些分组

时间:2016-02-17 23:39:30

标签: algorithm combinatorics

假设:

  1. 要读的10,000篇学生论文,每篇论文都与高中相关
  2. 80位读者,包含desired_essay_count和maximum_essay_limit。
  3. 国家分为300个区域,每个区域属于一个州(例如加利福尼亚州1,加利福尼亚州2等)
  4. 要求:

    • 来自一所高中的论文将被分配到一个 单身读者(又名高中不能分开)
    • 尝试将地区保持在一起
    • 尝试将州保持在一起

    有没有类似这种设置的算法?目前,我正在按州,地区和高中排序所有论文。然后我将高中论文组合在一起,并将它们分配给队列中的下一个具有可用空间的读者,并重复直到读者点击max_essay_limit。简单,它会导致一个相对干净的解决方案,但根本不考虑desired_essay_count(意味着队列末尾的读者最终只能阅读几篇文章)。

1 个答案:

答案 0 :(得分:4)

我会用优先级队列来解决这个问题。

第一个是散文组的队列,它总是会给你最大的分组。您可以从对应于状态的组开始,在数据结构中可以轻松按地区或学校划分。

第二个是读者队列。根据您与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)

这将使各州,地区和学校齐心协力。它将尝试根据人们想要的工作量均匀分布负载。它应该可以快速运行。