Algorithm 根据需求分配课程的算法

Algorithm 根据需求分配课程的算法,algorithm,typescript,Algorithm,Typescript,我正在尝试确定最佳算法来解决分配课程的问题。要求在被认为满足之前有一定数量的学分。而且,这些课程在学习时会获得一定数量的学分。因此,数据结构类似于: export class Course { constructor(public id:number, public credits:number) { } } export class Requirement { constructor(public id:number, p

我正在尝试确定最佳算法来解决分配课程的问题。要求在被认为满足之前有一定数量的学分。而且,这些课程在学习时会获得一定数量的学分。因此,数据结构类似于:

export class Course {
  constructor(public id:number,
              public credits:number) {
  }
}


export class Requirement {
  constructor(public id:number,
              public name:string,
              public credits:number,
              public courses:RequirementCourse[] = []) {
  }
}
并给出以下数据集:

let requirments =  [
       new Requirement(1, 'math',    3, [1,2,3,4]),
       new Requirement(2, 'science', 2, [5]),
       new Requirement(3, 'english', 2, [2,7]),
       new Requirement(4, 'history',     2, [2,8])
     ];

let courses =  [
      new Course(1,1),
      new Course(2,0.5),
      new Course(3,1),
      new Course(4,1),
      new Course(5,1),
      new Course(6,1),
      new Course(7,1),
      new Course(8,1),
      new Course(9,1)
    ]
确定如何根据需求分配课程的最有效算法是什么

注意:数据集根据我的实际用例简化。特别是,需求课程数组中的课程将具有相关的优先级。此外,用户将能够手动分配需要分配给指定需求的课程

编辑:根据下面的注释,算法必须符合以下规则

  • 一门课程的学分不能超过一个学分

  • 如果一门课程有多个学分,它们可以在多个要求中分割

  • 如果没有足够的积分来满足所有需求,算法需要分配积分来满足尽可能多的需求

  • 如果两门课程可以分配给同一个要求,而该要求不能以其他方式得到满足(即需要冲突课程的学分),则该课程必须标记为冲突


    • 根据评论,这绝对是最大流量。根据您的输入,构建以下图表:

      • 超级源
      • 超级水槽水槽
      • 每门课程:
        • 表示该路线的节点c
        • 来源c的边缘,容量等于c的信用计数
      • 对于每项要求:
        • 表示该需求的节点r
        • rSINK的边缘,容量等于r
      • 对于每门课程c/要求r成对:
        • 如果给定的课程满足给定的要求,则从cr的优势,其能力等于c的学分计数
      然后只需将最大流量从源运行到汇。如果最大流量等于所有要求的总信用要求,则您已找到有效的流量。只需读取上一步中添加的边上的流程,就可以确定哪些课程用于哪些需求。如果最大流量是较低的数字,则不可能用给定的课程来满足所有要求

      总运行时间:

      • 图形构造(其中,
        C
        是课程数,
        R
        是要求数):
        • 添加节点:
          1+1+C+R=O(C+R)
        • 添加边:
          C+C*R+R=O(C*R)
      • 运行最大流量
        • 假设预流推送是选择的算法:
          O(V^3)=O((C+R)^3)
      • 转变为问题解决方案:
        • 检查最大流量有效性:
          R=O(R)
        • 读回课程:
          C*R=O(C*R)

      因此,我认为该算法受
      O((C+R)^3)
      的约束,最大流部分可以重复计算吗?也就是说,如果我选了第二课,数学和英语都算吗?好问题——一门课程可能只满足要求,是否有任何指标可以决定“最佳”课程分配?或者是找到任何令人满意的courseload(或确定没有此类courseload)的最快方法?从第一个注释中,我认为任何有效的courseload都是可以接受的?好的,很酷。我想最后一个问题是——一门课程是否能部分满足多项要求?也就是说,如果我修了一门2学分的课程,这门课程有两个要求,那么我可以每个要求一个学分吗?如果soI在多重分配场景中看到最大流量公式,那么问题很容易解决。如果它只是全部或没有,我现在看到的最好的是0-1 ILP(这将是np难的)。很好的答案,我花了一些时间来实现它,到目前为止它工作得很好。谢谢