Изменения

Перейти к: навигация, поиск

Задача коммивояжера, ДП по подмножествам

266 байт убрано, 02:19, 15 января 2012
Динамическое программирование по подмножествам (по маскам)
*Для остальных состояний (<tex>i \ne 0</tex> или <tex>mask \ne 0</tex>) перебираем все возможные переходы в <tex>i</tex>-ую вершину из любой посещенной ранее и выбираем минимальный результат.
*Если возможные переходы отсутствуют, решения для данной подзадачи не существует (обозначим ответ для такой подзадачи как <tex>\infty</tex>).
 
То есть, <tex>d[i][mask]</tex> принимает значения:
 
<tex> d[i][mask] =
\begin{cases}
0, & \\
\min\limits_{j:\text{ }mask_j=1,\text{ }(i, j) \in E} \begin{Bmatrix} w(i, j) + d[j][mask - 2^j] \end{Bmatrix}, & \\
\infty, &
\end{cases}
</tex>
Стоимостью минимального гамильтонова цикла в исходном графе будет значение <tex> d[0][2^n-1]</tex> - стоимость пути из <tex>0</tex>-й вершины в <tex>0</tex>-ю, при необходимости посетить все вершины. Данное решение требует <tex>O({2^n}\times{n})</tex> памяти и <tex>O({2^n}\times{n^2})</tex> времени.
93
правки

Навигация