2016-07-07 136 views
0

我想实现部分摘要问题,该算法在第35-36页的pdf https://cise.ufl.edu/class/cap5515sp10/Ch04_DNA_mapping.pdf中给出。在随后的页面中给出了一个例子。部分摘要算法(PDP)

我无法得到正确的答案。

我得到的X值是[0,10,8,3,6],然后递归以“不好”停止。

可能是我不明白的算法或别的东西?

width = 0 

def partialDigest(L): 
    print "partialDigest" 
    global width 
    width = max(L) 
    L.remove(width) 
    X = [0, width] 
    if place(L, X): 
     print "Ok" 
    else: 
     print "Not ok" 


def place(L, X): 
    print "place" 
    print "Width is", width 
    print "L is ", L 
    print "X is ", X 

    if len(L) == 0: 
     print "Output is: ", X 
     return True 

    y = max(L) 
    print "Y is", y 
    #L.remove(y) 
    d = D(y, X) 
    print "d is ", d 

    if set(d).issubset(set(L)): 
     print "First if" 
     print "D is", d 
     print "X before is ", X 
     X.append(y) 
     print "X after is ", X 
     print "L before is", L 
     L = removeElements(d, L) 
     print "L after is ", L 
     place(L, X) 
     X.remove(y) 
     L.extend(d) 

    d1 = D(abs(width-y), X) 
    print "d1 is ", d1 

    if set(d1).issubset(set(L)): 
     print "Second if" 
     print "D is", d1 
     print "X before is ", X 
     X.append(abs(width-y)) 
     print "X after is ", X 
     print "L before is", L 
     L = removeElements(d1, L) 
     print "L after is ", L 
     place(L, X) 
     X.remove(abs(width-y)) 
     L.extend(d1) 

    return False 

def D(y, X): 
    diff = [] 
    for xi in X: 
     diff.append(abs(y-xi)) 
    return diff 

def removeElements(d, L): 
    for i in L: 
     for j in d: 
      if i == j: 
       L.remove(i) 
       d.remove(i) 
    return L 

if __name__ == "__main__": 
    print "Python implementation of partial digetive problem PDP on page 90." 

    partialDigest([2, 2, 3, 3, 4, 5, 6, 7, 8, 10]) 
+0

您能添加预期的正确输出吗?否则,其他用户很难帮助您。 –

+0

@MaximilianPeters所以[0,10,8,3,6]是答案之一,另一个答案是[0,10,2,7,4]。我有代码工作,在新的代码中,我不使用python的issubset()函数。如果您对该算法有更深入的了解,请让我知道,因为我是生物信息学的新手。 – limitlessriver

回答

0

最后我的代码运行正常,可能是我搞砸了python的全局空间或者一些帮助函数。

X = [] 

L = [2, 2, 3, 3, 4, 5, 6, 7, 8, 10] 

width = 0 

def partialDigest(L): 
    global X, width 
    width = max(L) 
    L.remove(width) 
    X = [0, width] 
    place(L, X) 


def place(L, X): 

    if not L: 
     print "Output is: ", X 
     return 

    y = max(L) 

    if issubset(y, X, L): 
     X.append(y) 
     removeElements(y, X, L) 
     place(L, X) 
     if y in X: 
      X.remove(y) 
     L.extend(D(y, X)) 

    if issubset(abs(width-y), X, L): 
     X.append(abs(width-y)) 
     removeElements(abs(width-y), X, L) 
     place(L, X) 
     if abs(width-y) in X: 
      X.remove(abs(width-y)) 
     L.extend(D(abs(width-y), X)) 

    return 


def D(y, X): 
    diff = [] 
    for xi in X: 
     diff.append(abs(y-xi)) 
    return diff 


def removeElements(y, X, L): 
    for xi in X: 
     if abs(y - xi) in L: 
      L.remove(abs(y - xi)) 


def issubset(y, X, L): 
     for xi in X: 
      if abs(y-xi) not in L: 
       return False 
     return True 


if __name__ == "__main__": 
    print "Python implementation of partial digetive problem PDP on page 90." 

    partialDigest(L) 
+0

显示我的输出解决方案是 输出是:[0,10,8,3,6] 输出是:[0,10,2,7,4],所以即使您的正确答案是另一个是不正确的。 –