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

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

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

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


Новичок
*

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

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


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

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

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

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

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

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

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


Гость






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


Новичок
*

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

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


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

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


конечно


Прикрепленные файлы
Прикрепленный файл  20.txt ( 1.19 килобайт ) Кол-во скачиваний: 247
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 21.01.2010 20:00
Сообщение #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]);
.
 К началу страницы 
+ Ответить 
xlr8
сообщение 21.01.2010 20:07
Сообщение #5


Новичок
*

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

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


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

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


Новичок
*

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

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


dry.gif
up
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 22.01.2010 14:31
Сообщение #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...

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


Новичок
*

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

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


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

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


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

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

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


Гость






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

Так что решай задачу другим методом. Результата полного перебора на таких размерностях дождаться затруднительно.
 К началу страницы 
+ Ответить 
xlr8
сообщение 22.01.2010 16:38
Сообщение #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 - 22.01.2010 16:39
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 22.06.2025 0:38
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"