我已经用Python编写了以下递归函数,用于在DP算法中计算加权区间调度问题的解决方案,其中区间为“ sorted_operations”。我正在关注Kleinberg和Tardos撰写的“算法设计”书,并且已经计算了OPT和p_list。它似乎适用于相对较小的实例,但是一旦问题的大小增加,我就会超过“最大递归深度”,并且会收到错误消息。由于增加sys.setrecursionlimit会使我的内核崩溃,所以我想知道是否还有其他方法可以编写此函数。
solution_set = []
def compute_solution(j):
if j<=0:
pass
else:
if sorted_operations[j]['weight'] + OPT[p_list[j]] > OPT[j - 1]:
solution_set.append(sorted_operations[j])
print(j)
compute_solution(p_list[j])
else:
compute_solution(j - 1)
compute_solution(len(sorted_operations) - 1)
答案 0 :(得分:1)
在不了解您的代码的情况下,我真的无法提供详细的解决方案。但是,您的算法的一部分确实在我的脑海中浮现:compute_solution(j - 1)
。由于j
是一个整数,所以用j - 1
再次调用该算法比使用方法调用更适合循环,尤其是因为在Python中,这些开销往往有些昂贵。因此,我将像这样修改您的算法:
solution_set = []
def compute_solution(j):
while (j > 0):
if sorted_operations[j]['weight'] + OPT[p_list[j]] > OPT[j - 1]:
solution_set.append(sorted_operations[j])
print(j)
compute_solution(p_list[j])
return
else:
j = j - 1
compute_solution(len(sorted_operations) - 1)
根据运行else
语句的频率,这可能是一个主要好处。