回溯python或c ++

时间:2012-01-15 12:11:54

标签: python backtracking

问题是:

  

输出所有可能性,在5天的一周内混合3类数学,3类pc编程,2类物理,考虑到在一周中一个学生至少有一个这样的类和最多3,无论他们如何混合“

     

M:[数学,数学,数学]
       T:[pc progr,pc progr]
       W:[pc progr]
       T:[物理]
       F:[物理]

我在Python中有一个想法,创建一个包含15个元素的列表,这些元素将包含一周15/5 = 3(学生可以拥有的最大班级)的所有类。因此对于上面的示例,列表将看起来像{ {1}}但我真的不知道如何使用回溯生成所有列表。你能给我任何想法吗?

1 个答案:

答案 0 :(得分:1)

首先尝试解决一个更简单的问题。尝试输出所有可能性以混合具有两个以上约束的类:

  1. 没有课程可以在一天内出现一次以上

  2. 一天中课程的顺序无关紧要

  3. 与往常一样,回溯问题最容易通过递归来解决它们。执行以下操作:按照任何顺序获取类的顺序cs,cs,cs,m,m,m,p,p,并在递归的每一步中将下一个类分配给“可能”的日期。如果它到目前为止分配的类少于3个,并且还没有相同类型的类,那么这里可以有一天。

    为了避免在可能性中重复添加一个要求 - 如果在递归的当前步骤中我们需要将A类分配到某一天并且A类已经添加到某些日子,那么只尝试分配A在本周晚些时候,然后是它被分配到的最后一个。因为这听起来有点令人困惑,让我举一个例子:

    假设我们拥有当前状态:

    M: m, cs
    T: 0
    W: cs
    T: p
    F: p
    

    在下一步我们必须添加一个cs类。如上所述,我们只会在几天之后再尝试W,即星期四和星期五。它需要一些考虑,但你应该能够弄清楚如果我们不添加这个限制,一些可能性将被发现一次。

    在两种情况下满足递归的结束:

    • 如果所有课程都已分配到某一天我们已找到可能的分配并输出

    • 如果在下一步我们需要将A类分配到某一天,但是A已经被分配到一周的某一天说X和X之后的所有日子已经分配了3个类,那么我们找不到A的可能日期,因此在这个分支中找不到可能的解决方案。

    现在已经解决了这个问题,请尝试删除我逐个添加的两个附加约束。首先修改解决方案,使得一个类可能在一天内出现一次以上(尽管在这种情况下问题似乎更简单,但需要额外的工作来避免计算一些可能性,然后再多一次)。在此之后删除最后剩余的约束 - 使一天中的类的顺序成为问题。有一个简单的方法,但我不确定是否允许你说明问题 - 在找到解决方案后,在其中的所有日子做所有排列,以产生所有可能的安排。

    我真的希望这个答案有所帮助。我可以写下我上面提到的所有问题的解决方案,但我更愿意尝试给你提示如何自己解决这些问题,以便你自己实际做到这些。