Динамическое программирование: порядок итераций подмножеств в TSP

Вопрос: Как правильно определить порядок итераций всех подмножеств города {1,2, …, n} в задаче коммивояжера?

В моем решении подмножества представлены битовой маской (на данный момент это просто целое число). Все результаты сохраняются в 2-мерном массиве C, где 1-е измерение S напоминает подмножество городов (то есть битовую маску). 2-е измерение j, содержит стоимость путешествия между все города в S, где j является конечным городом.

Каждое подмножество включает город 0 (начальный город), и алгоритм начинается с установки кратчайшего маршрута:

C[{0}][0] = 0;

Однако, чтобы этот алгоритм работал, все подмножества должны быть перебраны в порядке размера подмножества.

Вот простой фрагмент кода, который печатает все подмножества в возрастающем значении:

#include <cstdio>

const int n = 5; // number of cities
const int s = 1 << n; // number of subsets

void printb(int x)
{
for (int i = n-1; i >= 0; i--) {
printf("%d", (x >> i) & 1);
}
}

int main()
{
for (int i = 0; i < s; i++) {
printb(i); printf("\n");
}

return 0;
}

Моя цель состоит в том, чтобы перечислять подмножества в порядке размера подмножества (количество битов).

Описание алгоритма, которое я использую: Алгоритмы, С. Дасгупта, С. Х. Пападимитриу и У. В. Вазирани (стр. 188)

1

Решение

Чтобы правильно решить TSP, вам на самом деле не нужно проходить все подмножества размера 1, прежде чем вы пройдете подмножество размера 2. Вам просто нужно пройти все подмножества заданного набора X, прежде чем переходить к множеству X. Выполнение итерации в числовом порядке со стандартным кодированием наборов удовлетворяет этому свойству.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]