使用递归进行线性分区

时间:2017-04-19 16:59:07

标签: python algorithm recursion sum partitioning

我知道有类似的问题,但我不能使用它们修改我的代码。

想象一下,我们有一些工作可以做这个时间n = [8,6,7,2,1,4]的成本,还有3个工人要做。因此,如果我们想要计算制作分区的最佳方法,我们可以评估所有选项(这就是我想用递归函数做的事情)。这些将是所有选项:

1- 1st worker:[8]; 2nd worker:[6]; 3rd worker:[7,2,1,4] --> Cost=max(8, 6 , 7+2+1+4=14)=14
2- 1:[8]; 2:[6,7]; 3:[2,1,4] --> Cost=max(8,13,7)=13 <------ best
3- 1:[8,6]; 2:[7]; 3:[2,1,4] --> Cost=max(14,7,7)=14 
4- 1:[8]; 2:[6,7,2]; 3:[1,4] --> Cost=max(8,15,5)=15 
5- 1:[8,6]; 2:[7,2]; 3:[1,4] --> Cost=max(14,9,5)=14 
6- 1:[8,6,7]; 2:[2]; 3:[1,4] --> Cost=max(21,2,5)=21 
7- 1:[8]; 2:[6,7,2,1]; 3:[4] --> Cost=max(8,16,4)=16 
8- 1:[8,6]; 2:[7,2,1]; 3:[4] --> Cost=max(14,10,4)=14 
9- 1:[8,6,7]; 2:[2,1]; 3:[4] --> Cost=max(21,3,4)=21 
10- 1:[8,6,7,2]; 2:[1]; 3:[4] --> Cost=max(23,1,4)=23

很明显,8 / 6,7 / 2,1,4是最佳选择,因为它是最大值的最小总和。我想在Pyhton中设计一个代码,用于计算任意数量的任务和任意数量的工作者的最佳分区。

我已经以这种方式启动了我的代码:

def ib(n,j): #n:list with times,j:number of workers
    if j==1:
        return sum(n) #if we have just 1 worker 
    else:
        for i in range(j-1,len(n)+1): #to explore all the options of the right 
            left=ib(n[0:i],j-1)
            right=sum(n[i:len(n)])
            if right>left:
                left=right
ib([8,6,7,2,1,4],3)

我的想法是找到最后一个工人的时间总和,然后再向左移动一个工人,直到我只有一个工人。我有一个错误,因为功能离开了for,我得到了左侧的无。我不知道如何纠正这个问题。

谢谢:)

1 个答案:

答案 0 :(得分:0)

在代码中修复一两个细节有太多缺陷;我正在为你做功课。但是,这里有一些基本的项目可以帮助你。

结果是,因为您忽略了返回来自函数主分支的任何内容, else 子句。函数的默认值为

此外,您的逻辑无法保留解决方案;它只找到当地最好的。当您重新启动调用堆栈时,需要将各种工作负载形成一个列表,保留到目前为止找到的最佳列表 - 而不仅仅是工作者的最低值。