计算学生安排课程的组合

时间:2017-02-15 03:33:01

标签: ruby algorithm binary-search schedule

我想让高中生和班级相匹配。学生有一份他们需要学习的课程清单:

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中,并且对于当天的每个乐队,学生必须能够被安排在他们的另一个请求中。

我正在测试学生'针对候选人时间表的要求,以满足大多数学生的需我试图回答:

  1. candidate_schedule是否允许学生安排所有请求?换句话说,是否至少有一种课程组合可以让他们拥有所有8门课程,每门课程有不同的课程?

  2. 学生可以根据他们所要求的每门课程安排多少种组合/不同的方式进入候选时间表,以及这些组合是什么,如下所示:

    student_schedule_options = {
      :option_1 => {a => :EEN41, b => :HUN11, c => :TYN21T, d => :PPN41, e => :SDN11T, f => :AUN21T, g => :ZJPHN},
      :option_2 => ...
    }
    
  3. 如果有可能看到8个请求中有7个可以满足,并且报告了无法匹配的乐队和课程,这将会更加有趣,这将有助于改变候选人时间表以改善它。

1 个答案:

答案 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]]

如果您正在处理许多计划,您可能想要探索更有效的匹配算法,但这个算法很快而且很脏。