回溯 - 生成计划的解决方案提示

时间:2016-03-07 07:07:50

标签: python algorithm backtracking

我试图解决以下问题:

有3个小时的数学,2个phisics和3个信息学。我需要生成所有可能的时间表,以便一天必须至少有1个小时的这些科目,最多3个(这可能是数学 - 数学 - 数学或数学 - 物理 - 信息学)

时间表为5天。 所以我提出了以下解决方案:

让生成(k,o)成为'生成器'功能为第k天,o小时,o为1至3

每天k和小时o挑选一个仍然在我们左边的主题。我通过数组counter[i] = TakenCount跟踪它,其中i是1,2,3,对应于数学,物理和信息学,而TakenCount意味着我使用了多少小时。

对于配置,我使用矩阵v[k][o],它为我提供了第k天的配置,小时为o

这是我迄今为止尝试过的代码

h = ['', 'm', 'f', 'i']
counter = [0, 0, 0, 0]
limit = [0, 3, 2, 3]
v = [['' for x in range(4)] for x in range(6)]

def generate(k, o):
  if k == 6:
    if counter[1] == limit[1] and counter[2] == limit[2] and counter[3] == limit[3]:
      showConfig()
  else:
    for i in range(1, 4, 1):
      if counter[i] != limit[i]:
        v[k][o] = h[i]
        counter[i] += 1

        generate(k + 1, 1)
        generate(k + 1, 2)
        generate(k + 1, 3)

        v[k][o] = ''
        counter[i] -= 1

def showConfig():
  print '-- Configuration --'
  print counter

  for i in range(1, 6, 1):
    print 'Day ', i,
    success = False

    for j in range(1, 4, 1):
      print v[i][j],

  print '-- End --'

generate(1, 1)
generate(1, 2)
generate(1, 3)

用Python编写,但我认为这不是问题,因为它很容易阅读

这里的问题是我永远不会在v[i][2]v[i][3]内有时间,只有v[i][1]和条件

counter[1] == 3, counter[2] == 2 and counter[3] == 3 

永远不会成真,我不知道为什么。

在我第二天生成k + 1后,小时1,2和3,我需要重置当前v[k][o] to''和counter[i]counter[i] - 1

这不是家庭作业或类似的东西。我问的是解决方案是否良好,如果是,那么我在代码中做错了什么?因为我似乎无法找到

输出示例:

( (m), (m, f), (m, f, i), (i), (i) )
...
( (m, i), (f), (i), (m, f, i), (m) )
( (m, f), (i), (i), (m, f, i), (m) )

其中m是数学,f是物理学和信息学,每个paranthesis是WEEK的一天,所以5周1周

1 个答案:

答案 0 :(得分:0)

这是你想要的:

from itertools import permutations
def possible_permutations(*args):
    length_args = len(args)
    args_list, permutations_list = [], []
    for arg in args:
        args_list.append(arg)
        permutations_list.append(tuple(permutations(args_list)))
    # Clean ugly list of touples of touples into a list of touples.
    perms = []
    for perm in permutations_list:
        for p in perm:
            perms.append(p)
    return perms

def schedules(days, *classes):
    possible_perms = possible_permutations(*classes)
    for perm in permutations(possible_perms, days):
        print(perm)
schedules(5, 'math', 'science', 'english')

<小时/> OLD ANSWER

我不清楚你的要求是什么,但我相信这可以解决你的问题。

from itertools import permutations

CLASSES = {'math':3, 'physics':2, 'informatics':3}
def possible_schedules(**classes_hours):
    k, v = [k for k, v in classes_hours.items()], [v for k, v in classes_hours.items()]
    k_perms, v_perms = permutations(k), permutations(v)
    perms = zip(k_perms, v_perms)
    for k_perm, v_perm in perms:
        perm = tuple(zip(k_perm, v_perm))
        print(perm)

possible_schedules(**CLASSES)


输出:

(('physics', 2), ('math', 3), ('informatics', 3))
(('physics', 2), ('informatics', 3), ('math', 3))
(('math', 3), ('physics', 2), ('informatics', 3))
(('math', 3), ('informatics', 3), ('physics', 2))
(('informatics', 3), ('physics', 2), ('math', 3))
(('informatics', 3), ('math', 3), ('physics', 2))