旅行推销员的动态编程伪代码

时间:2010-02-16 12:54:43

标签: functional-programming dynamic-programming

这是TSP(旅行商问题)的动态编程伪代码。我理解它的最佳子结构,但我无法弄清楚红色括号中的代码是什么。

我不是要求任何人写出实际的代码,我只需要解释发生了什么,这样我就可以自己编写....谢谢:)

这里是伪代码的链接,我不能在这里上传。 http://www.imagechicken.com/viewpic.php?p=1266328410025325200&x=jpg

1 个答案:

答案 0 :(得分:2)

这是一些较少的数学伪代码。我不知道这是否会解释发生了什么,但它可能会帮助你阅读它。这不是一个功能算法(很多:=遍布),所以我将使用Python伪代码。

# I have no idea where 'i' comes from. It's not defined anywhere
for k in range(2,n):
    C[set(i,k), k] = d(1,k)
shortest_path = VERY_LARGE_NUMBER
# I have to assume that n is the number of nodes in the graph G
# other things that are not defined:
# d_i,j -- I will assume it's the distance from i to j in G
for subset_size in range(3,n):
    for index_subset in subsets_of_size(subset_size, range(1,n)):
        for k in index_subset:
            C[S,k] = argmin(lambda m: C[S-k,m] + d(G,m,k), S - k)
            shortest_path = argmin(lambda k: C[set(range(1,n)),k] + d(G,1,k), range(2,n))
return shortest_path

# also needed....
def d(G, i, j):
    return G[i][j]
def subsets_of_size(n, s): # returns a list of sets
    # complicated code goes here
    pass
def argmin(f, l):
    best = l[0]
    bestVal = f(best)
    for x in l[1:]:
        newVal = f(x)
        if newVal < bestVal:
            best = x
            bestVal = newVal
    return best

一些注意事项:

  1. 源算法未完成。至少,它的格式在内部循环中很奇怪,它在第二个argmin中重新绑定 k 。所以整件事情可能是错的;我没试过运行这段代码。
  2. range的参数应该全部增加1,因为Python从0开始计数,而不是1.(通常从1算起是一个坏主意)。
  3. 我假设G是{from:{to:length}}类型的字典。换句话说,邻接列表表示。
  4. 我推断C是{(set(int),int):int}类型的字典。我错了。
  5. 我使用set作为C的键。在真正的Python中,您必须先转换为frozen_set。转换只是繁忙的工作,所以我把它留了出来。
  6. 我不记得Python中的set运算符。我似乎记得它使用|&代替+-
  7. 我没有写subsets_of_size。这很复杂。