IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Задача коммивояжера, Вопрос по задаче из FAQ
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


Здравствуйте!

Будьте добры, помогите решить такой вопрос:

Значит в разделе FAQ на сайте размещен текст программы для решения задачи коммивояжера методом простого перебора.
Программу я запускал - на текстовом примере размерностью матрицы 10*10 всё работает отлично.
На меньших размерностях вопросов тоже не возникает.
Но как только потребовалось решить матрицу 20*20 (30*30) программа зацикливается.

Текст программы находиться здесь, я в неё не вносил никаких изменений.

FAQ. Раздел Метод перебора.

Посоветуйте, пожалуйста, какие изменения нужно внести в данную программу для того, чтобы разрешить проблему размерности?

Заранее благодарен за советы
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 9)
сообщение
Сообщение #2


Гость






Можешь прикрепить текстовый файл с матрицей, при обработке которой у тебя зависает программа?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 21.01.2010 18:38) *

Можешь прикрепить текстовый файл с матрицей, при обработке которой у тебя зависает программа?


конечно


Прикрепленные файлы
Прикрепленный файл  20.txt ( 1.19 килобайт ) Кол-во скачиваний: 385
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Вот сразу же тебе и ошибка: нули убирай с диагонали матрицы, либо читай их тоже из файла, и только потом в элемент A[i, j] заноси MaxInt... Обрати внимание, в FAQ-е в файле данных нет нулей на главной диагонали, потому что там данные читаются вот так:
   for i:=1 to n do
for j:=1 to n do
if i=j then a[i,j]:=maxint { <-- Значение из файла НЕ читалось !!! } else read(a[i,j]);
.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


Так ведь нули я пробовал удалить - результата это всё равно не дало.
И, кстати, из программы эту строчку я исправил чтобы из файла нолики читало.

Сообщение отредактировано: xlr8 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


dry.gif
up
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Хм... Очень интересно. Вариант Гари Дарби для решения методом ветвей и границ на приведенной матрице выдает:
Running "f:\programs\pascal\__komm.exe"
1->2->9->12->4->5->14->7->8->18->10->3->6->20->13->19->15->11->17->16->1 = 221

Это правильный вариант? Потому что на примере из нашего FAQ-а задача им же решается неправильно:

Running "f:\programs\pascal\__komm.exe"
1->3->4->7->10->6->5->2->9->8->1 = 168

, в то время как программа virt-а выдает ответ = 158...

Попробую еще прогнать пару других программ, посмотрим, что они выдадут...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 22.01.2010 13:31) *

Хм... Очень интересно.


Спасибо Вам что помогаете докопаться до истины. Решить эту задачу методом ветвей и границ не пробовал.
Буду очень благодарен за наводку для решения задачи методом перебора, как задача Virt'а.

Спасибо ещё раз

Сообщение отредактировано: xlr8 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Так... Программа работает, но ОЧЕНЬ долго. Учти, что при решении несимметричной задачи коммивояжера для N узлов (методом полного перебора) потребуется (n-1)! проходов. В твоем случае n = 20, значит число проходов будет равно 121645100408832000 (для матрица 10*10 из примера: 9! = 362880 проходов. Чувствуешь разницу?)

Так что решай задачу другим методом. Результата полного перебора на таких размерностях дождаться затруднительно.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 22.01.2010 15:07) *

Учти, что при решении несимметричной задачи коммивояжера для N узлов (методом полного перебора) потребуется (n-1)! проходов.


Переход - в смысле "итерация"?

Цитата(volvo @ 22.01.2010 15:07) *

Чувствуешь разницу?)


Да уж..Получается такой себе Brutal Force)..для мэйнфрейма.

Цитата(volvo @ 22.01.2010 15:07) *

Результата полного перебора на таких размерностях дождаться затруднительно.


Понятно..Я думал что это в программе ошибка какая-то, что она зацикливается, час ждал 20*20 - а она всё работает и работает.

Спасибо Вам большое за помощь, затраченное время и качественный ответ.

Сообщение отредактировано: xlr8 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 9.09.2025 7:48
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name