我想让高中生和班级相匹配。学生有一份他们需要学习的课程清单:
student_1_requests = [:EEN41, :SDN11T, :HUN11, :PPN41, :AUN21T, :TYN21T, :ZJPHN, :ZLUNCH]
候选时间表是一个散列,其值是同时提供的课程数组:
candidate_schedule = {
a_band => [:EEN41, :HGN22, :PPN41],
b_band => [:SDN11T, :HUN11, :EEN41],
c_band => [:TYN21T, :SLN11],
d_band => [:PPN41, :TYN21T],
l_band => [:ZLUNCH],
e_band => [:EEN41, :SDN11T, :HUN11, :PPN41],
f_band => [:AUN21T, :TYN21T, :PPN41],
g_band => [:ZJPHN, :GAN42]
}
学生需要每天的每个时段/乐队上课。因此,为了切实可行,每个乐队中至少有一门课程必须出现在students_requests中,并且对于当天的每个乐队,学生必须能够被安排在他们的另一个请求中。
我正在测试学生'针对候选人时间表的要求,以满足大多数学生的需我试图回答:
此candidate_schedule
是否允许学生安排所有请求?换句话说,是否至少有一种课程组合可以让他们拥有所有8门课程,每门课程有不同的课程?
学生可以根据他们所要求的每门课程安排多少种组合/不同的方式进入候选时间表,以及这些组合是什么,如下所示:
student_schedule_options = {
:option_1 => {a => :EEN41, b => :HUN11, c => :TYN21T, d => :PPN41, e => :SDN11T, f => :AUN21T, g => :ZJPHN},
:option_2 => ...
}
如果有可能看到8个请求中有7个可以满足,并且报告了无法匹配的乐队和课程,这将会更加有趣,这将有助于改变候选人时间表以改善它。
答案 0 :(得分:1)
你可以用蛮力方法做到这一点。
我不确定你的@RestController
public class NotificationsControllerV1 {
@RequestMapping(value = "/test",
method = RequestMethod.GET,
produces = "application/json")
public String getTest(){
return "{test: ok}";
}
}
变量是否实际上是一个哈希,因为键不是字符串或符号,但你真的只需要一个数组数组。如果它是哈希值,则从candidate_schedule
哈希值中提取值:
candidate_schedule
现在,使用Ruby的数组方法,创建一组学生日程安排的所有可能排列,并仅选择所有元素与同一索引中的一个类调度元素匹配的排列:
>> schedule = candidate_schedule.values
=> [[:EEN41, :HGN22, :PPN41],
[:SDN11T, :HUN11, :EEN41],
[:TYN21T, :SLN11],
[:PPN41, :TYN21T],
[:ZLUNCH],
[:EEN41, :SDN11T, :HUN11, :PPN41],
[:AUN21T, :TYN21T, :PPN41],
[:ZJPHN, :GAN42]]
如果您正在处理许多计划,您可能想要探索更有效的匹配算法,但这个算法很快而且很脏。