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
- 从r到SINK的边缘,容量等于r
- 对于每门课程c/要求r成对:
- 如果给定的课程满足给定的要求,则从c到r的优势,其能力等于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难的)。很好的答案,我花了一些时间来实现它,到目前为止它工作得很好。谢谢