псевдокод динамического программирования для коммивояжера - PullRequest
1 голос
/ 16 февраля 2010

это псевдокод динамического программирования для TSP (Задача коммивояжера). я понял его оптимальную подструктуру, но не могу понять, что делает код в красных скобках.

Я не прошу никого писать настоящий код, мне просто нужно объяснение того, что происходит, чтобы я мог написать свой собственный ... спасибо :)

вот ссылка на псевдокод, я не могу загрузить сюда. http://www.imagechicken.com/viewpic.php?p=1266328410025325200&x=jpg

1 Ответ

2 голосов
/ 16 февраля 2010

Вот немного менее математический псевдокод. Я не знаю, объяснит ли это, что происходит, но это может помочь вам прочитать это. Это не функциональный алгоритм (много всего :=), поэтому я собираюсь использовать псевдокод 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. Алгоритм источника не завершен. По крайней мере, его форматирование является странным во внутреннем цикле, и оно связывает k во втором argmin. Таким образом, все это, вероятно, неправильно; Я не пытался запустить этот код.
  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. Кажется, я помню, он использует | и & вместо + и -.
  7. Я не писал subsets_of_size. Это довольно сложно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...