среда, 17 января 2007 г.

Коварный p43. (Именно так остается думать)
Задача сама по себе малой размерности - 43 пункта. Однако несколько часов работы метода Литтла не находят решение, включая метод с модификациями.
Рассмотрев данные, углядел, что p43 получена из задачи размерности 22 пункта путем дублирования некоторых пунктов 2, 3, а то и 4 раза. Между такими клонами пунктов нулевая стоимость, а стоимость до других пунктов копируются.
Такая простая модификация задачи вводит в ступор метод Литтла просто потому, что в дереве решений появляется очень много клонов маршрута, в которых просто переставлены порядок подряд идущих пунктов-клонов. В итоге, каждый набор клонов увеличивает просматриваемое дерево решения в число пересатоновок пунктов клонов - экспоненциальный рост.
При схлопывании пунктов-клонов задача p43 решается за секунду.
Получается, нужен какой-то метод предварительного анализа и выявления таких групп пунктов клонов, не обязательно полных дубликатов (достаточно явная группировка). Потом эти группы представить как один пункт и составить новую задачу.
Пока есть следующие трудности:

  • каким способом разбить пункты на группы?
  • как обеспечить корректность такой модификации задачи, чтобы оптимальное решение в новой задаче был оптимальным в исходной?

Для полных клонов, когда между клонами нулевая стоимость и строки стоимостей просто продублированы, это легко. А как быть со "слабыми клонами"? Например, пункты внутри города можно рассматривать как "слабые клоны" в объемах всего земного шара.

Получил результаты тестовых вычислений одного своего алгоритма точного решения задачи коммивояжера. Алгоритм основывается на методе Литтла, модификации подвержены функция определения нижней оценки набора решений и порядок выбора дуги. Теоретические обоснования корректности модификации функции нижней границы и выбора дуги оформлены в виде статьи. Статья опубликована.

Результаты тестов на случайных несимметричных матрицах общего вида (равномерное распределение весов) при 100 пунктах показывает улучшение показателя времени в среднем около 20000 раз (бывает до нескольких сотен тысяч)!
Приведу результаты решения стандартных задач, распространенных в интернете. Время указана в секундах для компьютера Pentium 3.15GGz, 512Mb. В случае, если решение задачи тем или иным методом снималась по истечении 1 часа отведеного времени, время не указано, но указано достигнутое за это время решение. Результаты приведены только для задач, которые решились хотя бы одним методом за отведенное время - задачи ft53, ftv100, ftv110, ftv120, ftv170, td100, p43, big702, atex4, atex5, atex8, dc112, dc126, dc134, dc176, dc188, dc563, dc849, dc895, dc932 не решились за отведенное время.

Задача Метод Литтла Моя модификация
размер известное
решение
время,
сек
решение время,
сек
решение
ft70 70 38673 38673 149 38673
ftv33 34 1286 0,16 1286 1,1 1286
ftv35 36 1473 0,08 1473 0,05 1473
ftv38 39 1530 0,31 1530 0,05 1530
ftv44 45 1613 1,5 1613 0,08 1613
ftv47 48 1776 21 1776 0,42 1776
ftv55 56 1608 616 1608 2,4 1608
ftv64 65 1839 952 1839 2 1839
ftv70 71 1950 1963 8,4 1950
ftv90 91 1579 1611 1,5 1579
ftv130 131 2307 2474 117 2307
ftv140 141 2420 2585 108 2420
ftv150 151 2611 3048 135 2611
ftv160 161 2683 3019 3970 2683
rbg323 323 1326 1527 3 1326
rbg358 358 1163 1580 7,3 1163
rbg403 403 2465 3400 5,5 2465
rbg443 443 2720 3441 3,6 2720
td316 317 691502 722548 12 691502
td1000 1001 1242183 1263952 1228 1242183
br17 17 39 5,1 39 5,6 39
kro124p 100 36230 36352 3568 36230
ry48p 48 14422 571 14422 54 14422
atex1 16 1812 0,23 1812 0,41 1812
atex3 32 2952 0,28 2952 0,05 2952
code198 198 4541 0,23 4541 0,06 4541
code253 253 106957 106957 1261 106957