
Алгоритмы на графах. Поиск маршрутов / задача коммивояжера - Форум на Исходниках_Рукен
.htmзадача коммивояжера -> Форум на Исходниках.Ру HTML { OVERFLOW-X: auto } FORM { DISPLAY: inline } IMG { BORDER-RIGHT: 0px; BORDER-TOP: 0px; VERTICAL-ALIGN: middle; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px } BODY { FONT-SIZE: 11px; MARGIN: 0px 10px; COLOR: #000; FONT-FAMILY: Verdana, Tahoma, Arial, sans-serif; BACKGROUND-COLOR: #fff } TABLE { FONT-SIZE: 11px; COLOR: #000; FONT-FAMILY: Verdana, Tahoma, Arial, sans-serif } TR { FONT-SIZE: 11px; COLOR: #000; FONT-FAMILY: Verdana, Tahoma, Arial, sans-serif } TD { FONT-SIZE: 11px; COLOR: #000; FONT-FAMILY: Verdana, Tahoma, Arial, sans-serif } A:link { COLOR: #000000; TEXT-DECORATION: underline } A:active { COLOR: #000000; TEXT-DECORATION: underline } A:visited { COLOR: #000000; TEXT-DECORATION: underline } A:hover { COLOR: #cc3333 } FIELDSET.search { PADDING-RIGHT: 6px; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; LINE-HEIGHT: 150%; PADDING-TOP: 6px } LABEL { CURSOR: pointer } IMG.attach { BORDER-RIGHT: #eef2f7 2px outset; PADDING-RIGHT: 2px; BORDER-TOP: #eef2f7 2px outset; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; BORDER-LEFT: #eef2f7 2px outset; PADDING-TOP: 2px; BORDER-BOTTOM: #eef2f7 2px outset } .googleroot { PADDING-RIGHT: 6px; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; LINE-HEIGHT: 130%; PADDING-TOP: 6px } .googlechild { PADDING-RIGHT: 6px; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; MARGIN-LEFT: 30px; LINE-HEIGHT: 130%; PADDING-TOP: 6px } .googlebottom { FONT-SIZE: 11px; COLOR: #3a4f6c } .googlebottom A:link { FONT-SIZE: 11px; COLOR: #3a4f6c } .googlebottom A:visited { FONT-SIZE: 11px; COLOR: #3a4f6c } .googlebottom A:active { FONT-SIZE: 11px; COLOR: #3a4f6c } .googlish { FONT-WEIGHT: bold; FONT-SIZE: 14px; COLOR: #00d } .googlish A:link { FONT-WEIGHT: bold; FONT-SIZE: 14px; COLOR: #00d } .googlish A:visited { FONT-WEIGHT: bold; FONT-SIZE: 14px; COLOR: #00d } .googlish A:active { FONT-WEIGHT: bold; FONT-SIZE: 14px; COLOR: #00d } .googlepagelinks { FONT-SIZE: 1.1em; LETTER-SPACING: 1px } .googlesmall { FONT-SIZE: 10px; COLOR: #434951 } .googlesmall A:link { FONT-SIZE: 10px; COLOR: #434951 } .googlesmall A:active { FONT-SIZE: 10px; COLOR: #434951 } .googlesmall A:visited { FONT-SIZE: 10px; COLOR: #434951 } LI.helprow { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 10px; PADDING-TOP: 0px } UL#help { PADDING-RIGHT: 0px; PADDING-LEFT: 15px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } OPTION.cat { FONT-WEIGHT: bold } OPTION.sub { FONT-WEIGHT: bold; COLOR: #555 } .caldate { PADDING-RIGHT: 4px; PADDING-LEFT: 4px; FONT-WEIGHT: bold; FONT-SIZE: 11px; PADDING-BOTTOM: 4px; MARGIN: 0px; COLOR: #777; PADDING-TOP: 4px; BACKGROUND-COLOR: #dfe6ef; TEXT-ALIGN: right } .warngood { COLOR: green } .warnbad { COLOR: red } #padandcenter { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 14px; MARGIN-LEFT: auto; MARGIN-RIGHT: auto; PADDING-TOP: 14px; TEXT-ALIGN: center } #profilename { FONT-WEIGHT: bold; FONT-SIZE: 28px } #calendarname { FONT-WEIGHT: bold; FONT-SIZE: 22px } #photowrap { PADDING-RIGHT: 6px; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; PADDING-TOP: 6px } #phototitle { FONT-SIZE: 24px; BORDER-BOTTOM: black 1px solid } #photoimg { MARGIN-TOP: 15px; TEXT-ALIGN: center } #ucpmenu { BORDER-RIGHT: #345487 1px solid; BORDER-TOP: #345487 1px solid; BORDER-LEFT: #345487 1px solid; WIDTH: 22%; LINE-HEIGHT: 150%; BORDER-BOTTOM: #345487 1px solid; BACKGROUND-COLOR: #f5f9fd } #ucpmenu P { PADDING-RIGHT: 5px; PADDING-LEFT: 9px; PADDING-BOTTOM: 6px; MARGIN: 0px; PADDING-TOP: 2px } #ucpcontent { BORDER-RIGHT: #345487 1px solid; BORDER-TOP: #345487 1px solid; BORDER-LEFT: #345487 1px solid; WIDTH: auto; LINE-HEIGHT: 150%; BORDER-BOTTOM: #345487 1px solid; BACKGROUND-COLOR: #f5f9fd } #ucpcontent P { PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 0px; PADDING-TOP: 10px } #ipsbanner { RIGHT: 5%; POSITION: absolute; TOP: 1px } #logostrip { BORDER-RIGHT: #345487 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #345487 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: #345487 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: #345487 1px solid; BACKGROUND-COLOR: #6ea1e3 } .logo { COLOR: #ffffff } .logo A:link { COLOR: #ffffff; TEXT-DECORATION: none } .logo A:visited { COLOR: #ffffff; TEXT-DECORATION: none } .logo A:active { COLOR: #ffffff; TEXT-DECORATION: none } .logo A:hover { COLOR: #000000; TEXT-DECORATION: underline } #submenu { BORDER-RIGHT: #bcd0ed 1px solid; BORDER-TOP: #bcd0ed 1px solid; FONT-WEIGHT: bold; FONT-SIZE: 10px; MARGIN: 3px 0px; BORDER-LEFT: #bcd0ed 1px solid; COLOR: #3a4f6c; BORDER-BOTTOM: #bcd0ed 1px solid; BACKGROUND-COLOR: #dfe6ef } #submenu A:link { FONT-WEIGHT: bold; FONT-SIZE: 10px; COLOR: #3a4f6c; TEXT-DECORATION: none } #submenu A:visited { FONT-WEIGHT: bold; FONT-SIZE: 10px; COLOR: #3a4f6c; TEXT-DECORATION: none } #submenu A:active { FONT-WEIGHT: bold; FONT-SIZE: 10px; COLOR: #3a4f6c; TEXT-DECORATION: none } #userlinks { BORDER-RIGHT: #c2cfdf 1px solid; BORDER-TOP: #c2cfdf 1px solid; BORDER-LEFT: #c2cfdf 1px solid; BORDER-BOTTOM: #c2cfdf 1px solid; BACKGROUND-COLOR: #f0f5fa } #navstrip { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 6px; PADDING-TOP: 6px } .activeuserstrip { PADDING-RIGHT: 6px; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; BACKGROUND-COLOR: #bcd0ed } .pformstrip { PADDING-RIGHT: 7px; MARGIN-TOP: 1px; PADDING-LEFT: 7px; FONT-WEIGHT: bold; PADDING-BOTTOM: 7px; COLOR: #3a4f6c; PADDING-TOP: 7px; BACKGROUND-COLOR: #d1dceb } .pformleft { BORDER-RIGHT: #c2cfdf 1px solid; PADDING-RIGHT: 6px; BORDER-TOP: #c2cfdf 1px solid; MARGIN-TOP: 1px; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; WIDTH: 10%; PADDING-TOP: 6px; BACKGROUND-COLOR: #f5f9fd } .pformleftw { BORDER-RIGHT: #c2cfdf 1px solid; PADDING-RIGHT: 6px; BORDER-TOP: #c2cfdf 1px solid; MARGIN-TOP: 1px; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; WIDTH: 40%; PADDING-TOP: 6px; BACKGROUND-COLOR: #f5f9fd } .pformright { PADDING-RIGHT: 6px; BORDER-TOP: #c2cfdf 1px solid; MARGIN-TOP: 1px; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; BACKGROUND-COLOR: #f5f9fd } .post1 { BACKGROUND-COLOR: #f8f8fd } .post2 { BACKGROUND-COLOR: #e7e9ee } .postlinksbar { PADDING-RIGHT: 7px; MARGIN-TOP: 1px; PADDING-LEFT: 7px; FONT-SIZE: 10px; PADDING-BOTTOM: 7px; PADDING-TOP: 7px; BACKGROUND-COLOR: #d1dceb } .row1 { BACKGROUND-COLOR: #f5f9fd } .row2 { BACKGROUND-COLOR: #dfe6ef } .row3 { BACKGROUND-COLOR: #eef2f7 } .row4 { BACKGROUND-COLOR: #e4eaf2 } .pinned_topic { BACKGROUND-COLOR: #d1dceb } .darkrow1 { BACKGROUND-COLOR: #6ea1e3 } .darkrow2 { COLOR: #3a4f6c; BACKGROUND-COLOR: #bcd0ed } .darkrow3 { COLOR: #3a4f6c; BACKGROUND-COLOR: #d1dceb } .hlight { BACKGROUND-COLOR: #dfe6ef } .dlight { BACKGROUND-COLOR: #eef2f7 } .titlemedium { PADDING-RIGHT: 7px; PADDING-LEFT: 7px; FONT-WEIGHT: bold; PADDING-BOTTOM: 7px; MARGIN: 0px; COLOR: #3a4f6c; PADDING-TOP: 7px; BACKGROUND-COLOR: #d1dceb } .titlemedium A:link { COLOR: #3a4f6c; TEXT-DECORATION: underline } .titlemedium A:visited { COLOR: #3a4f6c; TEXT-DECORATION: underline } .titlemedium A:active { COLOR: #3a4f6c; TEXT-DECORATION: underline } .maintitle { PADDING-LEFT: 6px; FONT-WEIGHT: bold; FONT-SIZE: 12px; PADDING-BOTTOM: 8px; VERTICAL-ALIGN: middle; COLOR: #ffffff; PADDING-TOP: 8px; LETTER-SPACING: 1px; BACKGROUND-COLOR: #6ea1e3 } .maintitle A:link { COLOR: #ffffff; TEXT-DECORATION: none } .maintitle A:visited { COLOR: #ffffff; TEXT-DECORATION: none } .maintitle A:active { COLOR: #ffffff; TEXT-DECORATION: none } .maintitle A:hover { TEXT-DECORATION: underline } .plainborder { BORDER-RIGHT: #345487 1px solid; BORDER-TOP: #345487 1px solid; BORDER-LEFT: #345487 1px solid; BORDER-BOTTOM: #345487 1px solid; BACKGROUND-COLOR: #f5f9fd } .tableborder { BORDER-RIGHT: #345487 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #345487 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: #345487 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: #345487 1px solid; BACKGROUND-COLOR: #6ea1e3 } .tablefill { BORDER-RIGHT: #345487 1px solid; PADDING-RIGHT: 6px; BORDER-TOP: #345487 1px solid; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; BORDER-LEFT: #345487 1px solid; PADDING-TOP: 6px; BORDER-BOTTOM: #345487 1px solid; BACKGROUND-COLOR: #f5f9fd } .tablepad { PADDING-RIGHT: 6px; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; BACKGROUND-COLOR: #f5f9fd } .tablebasic { BORDER-RIGHT: 0px; PADDING-RIGHT: 0px; BORDER-TOP: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: 0px; WIDTH: 100%; PADDING-TOP: 0px; BORDER-BOTTOM: 0px } .wrapmini { FLOAT: left; WIDTH: 25%; LINE-HEIGHT: 1.5em } .pagelinks { FLOAT: left; WIDTH: 35%; LINE-HEIGHT: 1.2em } .desc { FONT-SIZE: 10px; COLOR: #434951 } .edit { FONT-SIZE: 9px } .signature { FONT-SIZE: 10px; COLOR: #999999; LINE-HEIGHT: 150% } .postdetails { FONT-SIZE: 10px } .postcolor { FONT-SIZE: 12px; LINE-HEIGHT: 160% } .normalname { FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: #003 } .normalname A:link { FONT-SIZE: 12px } .normalname A:visited { FONT-SIZE: 12px } .normalname A:active { FONT-SIZE: 12px } .unreg { FONT-WEIGHT: bold; FONT-SIZE: 11px; COLOR: #900 } .searchlite { FONT-WEIGHT: bold; COLOR: #f00; BACKGROUND-COLOR: #ff0 } #QUOTE { BORDER-RIGHT: #000 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #000 1px solid; PADDING-LEFT: 2px; FONT-SIZE: 11px; PADDING-BOTTOM: 2px; BORDER-LEFT: #000 1px solid; COLOR: #465584; PADDING-TOP: 2px; BORDER-BOTTOM: #000 1px solid; FONT-FAMILY: Verdana, Arial; BACKGROUND-COLOR: #fafcfe } #CODE { BORDER-RIGHT: #000 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #000 1px solid; PADDING-LEFT: 2px; FONT-SIZE: 11px; PADDING-BOTTOM: 2px; BORDER-LEFT: #000 1px solid; COLOR: #465584; PADDING-TOP: 2px; BORDER-BOTTOM: #000 1px solid; FONT-FAMILY: Courier New, serif; BACKGROUND-COLOR: #fafcfe } .copyright { FONT-SIZE: 9px; LINE-HEIGHT: 12px; FONT-FAMILY: Verdana, Tahoma, Arial, Sans-Serif } .codebuttons { FONT-SIZE: 10px; VERTICAL-ALIGN: middle; FONT-FAMILY: verdana, helvetica, sans-serif } .forminput { FONT-SIZE: 11px; VERTICAL-ALIGN: middle; FONT-FAMILY: verdana, helvetica, sans-serif } .radiobutton { FONT-SIZE: 11px; VERTICAL-ALIGN: middle; FONT-FAMILY: verdana, helvetica, sans-serif } .checkbox { FONT-SIZE: 11px; VERTICAL-ALIGN: middle; FONT-FAMILY: verdana, helvetica, sans-serif } .textinput { FONT-SIZE: 12px; VERTICAL-ALIGN: middle; FONT-FAMILY: courier new, serif; BACKGROUND-COLOR: #e4eaf2 } .thin { PADDING-RIGHT: 0px; BORDER-TOP: #fff 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 6px; MARGIN: 2px 0px; LINE-HEIGHT: 140%; PADDING-TOP: 6px; BORDER-BOTTOM: #fff 1px solid } .purple { FONT-WEIGHT: bold; COLOR: purple } .red { FONT-WEIGHT: bold; COLOR: red } .green { FONT-WEIGHT: bold; COLOR: green } .blue { FONT-WEIGHT: bold; COLOR: blue } .orange { FONT-WEIGHT: bold; COLOR: #f90 } .voteprefix { COLOR: green } .movedprefix { COLOR: red } .clubprefix { COLOR: blue } .pinnedprefix { } .mstop { BORDER-RIGHT: #000 1px dotted; PADDING-RIGHT: 3px; BORDER-TOP: #000 1px dotted; PADDING-LEFT: 3px; FONT-WEIGHT: bold; FONT-SIZE: 10px; BACKGROUND: #e4eaf2; PADDING-BOTTOM: 3px; MARGIN: 8px auto 0px; BORDER-LEFT: #8394b2 4px solid; COLOR: #000; PADDING-TOP: 3px; BORDER-BOTTOM: 0px } .msmain { BORDER-RIGHT: #000 1px dotted; PADDING-RIGHT: 4px; BORDER-TOP: 0px; PADDING-LEFT: 4px; BACKGROUND: #fafcfe; PADDING-BOTTOM: 4px; MARGIN: 0px auto 8px; BORDER-LEFT: #8394b2 4px solid; COLOR: #465584; PADDING-TOP: 4px; BORDER-BOTTOM: #000 1px dotted } PRE { MARGIN: 0px } .gmstop { BORDER-RIGHT: #000 1px dotted; PADDING-RIGHT: 3px; BORDER-TOP: #000 1px dotted; PADDING-LEFT: 3px; FONT-WEIGHT: bold; FONT-SIZE: 10px; BACKGROUND: #faa298; PADDING-BOTTOM: 3px; MARGIN: 8px auto 0px; BORDER-LEFT: #8394b2 4px solid; COLOR: #000; PADDING-TOP: 3px; BORDER-BOTTOM: 0px } .gmsmain { BORDER-RIGHT: #000 1px dotted; PADDING-RIGHT: 4px; BORDER-TOP: 0px; PADDING-LEFT: 4px; BACKGROUND: #fafcfe; PADDING-BOTTOM: 4px; MARGIN: 0px auto 8px; BORDER-LEFT: #8394b2 4px solid; COLOR: #465584; PADDING-TOP: 4px; BORDER-BOTTOM: #000 1px dotted } PRE { MARGIN: 0px } Разделы сайта:
Главная · Журнал · C++ · Delphi · VB · Pascal · ASM · Java · Java Scripts · PalmOS · Книги ПРАВИЛА ФОРУМА Помощь Поиск Участники Календарь Избранное Магазин DigiMania RSS Здравствуйте, Гость ( Вход | Регистрация ) Выслать повторно письмо для активации Что даёт регистрация на форуме?
Форум на Исходниках.RU
Программирование
Алгоритмы
правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.)
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишите свою проблему, тем быстрее получите вразумительный совет
5. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке
Модераторы: GrAnd
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) Новая тема · Новое голосование
задача коммивояжера Подписаться на тему | Сообщить другу | Скачать/распечатать тему mkudritsky Сообщ. #16 от 5.08.04, 22:21 Junior
Профиль · PM
Рейтинг (т): 2
скажите, кто бы как решал задачу с n >=2 коммивояжерами и очень большим количеством точек, около 700. т.е. надо, что n коммивояжеров обошли в сумме все города, и не пересекались их пути.
Хоть ветка и датируется началом этого года, но для меня она актуальна и теперь.
Задача ставится немного иначе. Требуется найти ТОЧНОЕ решение задачи n-коммивояжеров при числе городов до 100. Вероятность получения решения - чем выше, тем лучше Элементы матрицы расстояний генерируется датчиком случайных чисел. Значения элементов матрицы ограничены 700 и являются натуральными числами.
Способ решения - композитный алгоритм метода динамического программирования и метода ветвей и границ.
Как известно, основной залог успеха при работе таких алгоритмов - применение как можно более точной нижней оценка оставшейся части маршрута коммивояжера.
Ну а теперь к делу. Вот, чего я пока достиг на поприще точного решения задачи коммивояжера и ее разновидностей (включая задачу n-коммивояжеров):
1. Разомкнутая задача коммивояжера на 100 городах. Нижняя оценка - решение задачи о назначениях. Вероятность получения решения на Pentium-IV 2.8ГГц и 200Мб RAM оценивается в 70%.
2. Замкнутая (классическая) задача коммивояжера на 70 городах. Условия экспериментов и нижняя оценка - те же.
Вероятность получения решения - 70%
Это все более ли менее понятно, ибо решение разомкнутой задачи коммивояжера (ЗК) всегда является нижней оценкой классической ЗК.
И, соответственно, задача о назначениях (ЗН) является более точной нижней оценкой для разомкнутой ЗК.
3. Замкнутая (классическая) задача n-коммивояжеров. Я считал, что каждый коммивояжер должен обслужить 10 городов.
Нижняя оценка - решение той же ЗН.
Обидно, но уже при 30 городах решение уже получается редко. По-видимому, решение ЗН уже не является достаточно точной нижней оценкой задачи n-коммивояжеров.
В общем, печально.
4. Наконец, самое интересное. Разомкнутая задача n-коммивояжеров. Эта задача отличается от классической задачи n-коммивояжеров тем, что маршрут каждого коммивояжера должен быть разомкнутым.
Увы, задача пока не решена и программа не написана. Причина - не могу составить нижнюю оценку решения этой задачи на базе ЗН.
Можно показать что нижней оценкой разомкнутой задачи n-коммивояжеров является специальным образом сформулированная ЗН. Удобнее ее сформулировать в терминах теории графов.
Вот формулировка классической ЗН.
На двудольном графе соответствия "N городов" - "N городов" надо найти минимальное взвешенное паросочетание мощности N.
А вот формулировка специфической ЗН, являющейся нижней оценкой разомкнутой задачи n-коммивояжеров.
На двудольном графе соответствия "N городов" - "N городов" надо найти минимальное взвешенное паросочетание мощности (N-n).
Наконец-то я добрался до вопросов
1. Является ли выделенная жирным шрифтом задача легкорешаемой задачей целочисленного программирования? И если ДА, то:
2. Где можно найти описание алгоритма ее решения?
P.S. 1. А почему это математиков в И-нете так мало общается?
2. Ищу людей, интересующихся получением точных решений ЗК большой размерности. tserega Сообщ. #17 от 6.08.04, 11:05
Profi
Профиль · PM
DigiMoney: 1
Рейтинг (т): 54
Цитата mkudritsky, 5.08.04, 22:21
На двудольном графе соответствия "N городов" - "N городов" надо найти минимальное взвешенное паросочетание мощности (N-n).
Задачу можно свести к "задаче о назначения" (которая, по-моему, решается "венгерским" алгоритмом за полиномиальное время)
___________
Р. Беллманн: "Если вы смогли решить задачу, значит это было упражнение; иначе - это научная проблема." mkudritsky Сообщ. #18 от 8.08.04, 14:28 Junior
Профиль · PM
Рейтинг (т): 2
Цитата (tserega @ 6.08.04) Цитата mkudritsky, 5.08.04, 22:21
На двудольном графе соответствия "N городов" - "N городов" надо найти минимальное взвешенное паросочетание мощности (N-n).
Задачу можно свести к "задаче о назначения" (которая, по-моему, решается "венгерским" алгоритмом за полиномиальное время)
Совершенно верно, задача о назначениях решается венгерским методом за полиномиальное время O(N**3).
Здесь можно применять не обязательно венгерский метод, а любой метод, основанный на двойственном симплекс-методе. Лично мне больше нравится графовый метод Эдмондса-Джонсона.
Однако я пока не вижу приема, позволяющего свести сформулированную задачу к классической Задаче о назначениях.
Более того, зная, как работает алгоритм графового метода Эдмондса-Джонсона, я не преисполнен оптимизма о возможности такого сведения. Сообщу, что алгоритм Эдмондса-Джонсона работает на основе процедуры поиска увеличивающей чередующейся цепи на двудольных графах (или, иначе говоря, алгоритм поиска максимального паросочетания на двудольном графе).
В этом алгоритме есть неприятная особенность - если вершина двудольного графа уже покрыта текущим паросочетанием, то она и дальше остается покрытой.
А вот в сформулированной мною задаче требуется найти не паросочетание мощности N (1/2 кол-ва вершин двудольного графа), а мощности (N-n)<n. И при этом ранее покрытая текущим паросочетанием вершина вершина должна в общем случае иметь возможность не попасть в искомое паросочетание мощности N-n.
Так что вопрос о легкорешаемости сформулированной задачи не является очевидным.
Я подумал, что может кто уже знаком с обозначенной проблематикой и подскажет, как мне дальше быть.
P.S. 1. Вообще исследование задачи коммивояжера (ЗК) и ее обобщений напоминает мне поход по минному полю. Приведу примеры.
А). Как известно, разомкнутая ЗК легко сводится к замкнутой (классической) ЗК методом введения дополнительного города с нулевыми расстояниями до остальных городов.
А вот как свести замкнутую ЗК к разомкнутой? Никто не подскажет?
А ведь в литературе эти две задачи считаются чуть ли не одинаковыми! Лично я, поразбиравшись в проблематике, так не считаю.
Б). Достаточно легко доказвается факт, что решение задачи о назначениях (ЗН) является нижней оценкой для решения любой замкнутой задачи n-коммивояжеров, построенной на N городах. В частности, для одной из таких замкнутых задач n-коммивояжеров решение ЗН явдляется точным решением.
В). На одной и той же совокупности N городов решение замкнутой ЗК в общем случае больше решения разомкнутой ЗК. В свою очередь решение разомкнутой ЗК в общем случае больше решения разомкнутой задачи n-коммивояжеров (n>=2).
Это довольно очевидные факты.
Поэтому решение ЗН является наиболее эффективной нижней оценкой именно для разомнутых ЗК.
Это проверено мною и на практике.
Поэтому я и стремлюсь найти эффективную нижнюю оценку решения разомкнутой задачи n-комивояжеров. Тем более, что эта задача лучшим образом моделирует мою проблематику. mkudritsky Сообщ. #19 от 10.08.04, 11:02 Junior
Профиль · PM
Рейтинг (т): 2
Сам себе и отвечу.
Да, скорее всего сформулированная выше нижняя оценка для решения разомкнутой задачи n-коммивояжеров является легкорешаемой комбинаторной задачей. То есть она на самом деле пригодна для решения ЗК большой размерности.
Более того, ее решение скорее всего требует мЕньших вычислительных затрат, нежели решение полной задачи о назначениях (ЗН).
На пальцах поясню, откуда взялась такая уверенность.
1. Как известно, решение общей ЗН строится следующим образом.
На базе общего двудольного графа соответствия "N городов"-"N городов" пошагово формируется усеченный граф соответствия, включающий ребра, для которых органичения двойственной задачи выполняются как равенства. Для остальных ребер ограничения двойственной задачи - строгие неравенства.
2. На построенном усеченном графе на каждом шаге ищется парасочетание максимальной мощности. Это для выполнения ограничений прямой задачи. Каждый шаг приводит к тому, что в искомое минимальное взвешенное паросочетание добавляется одно ребро.
3. Так никто нас не заставляет шагать до тех пор, пока максимальное паросочетание на усеченном двудольном графе не станет мощности N (выполнены все ограничения прямой задачи).
Процедуру можно прервать, когда в текущем паросочетании будет N-n ребер
В соответствии с принципом оптимальности Беллмана будет найдено решение сформулированной модификации задачи о назначениях. Осталось только теоретически обосновать все эти рассуждения.
P.S. Если бомонду интересно, то готов сообщить о результатах. tserega Сообщ. #20 от 10.08.04, 12:27
Profi
Профиль · PM
DigiMoney: 1
Рейтинг (т): 54
Цитата mkudritsky, 8.08.04, 14:28
А вот в сформулированной мною задаче требуется найти не паросочетание мощности N (1/2 кол-ва вершин двудольного графа), а мощности (N-n)<n. И при этом ранее покрытая текущим паросочетанием вершина вершина должна в общем случае иметь возможность не попасть в искомое паросочетание мощности N-n.
Так мы же можем строить поток минимальной стоимости в двудолном графе (к этой задаче сводится "задача о назначениях"), увеличивая поток на единицу. Таким образом, спустя N-n шагов, получим поток мощности N-n единиц.
Или я где-то наглючил (точно не помню алгоритм построения потока минимальной стоимости )?
Кстати, буквально вчера видел одну олимпиадную задачу, которая сводилась к поиску "цепи комивояджера" (незамкнутый маршрут по всем вершинам) с 100 городами. Решение должно укладыватся в секунду. Так что эта задача алгоритмически проще, чем ЗК
___________
Р. Беллманн: "Если вы смогли решить задачу, значит это было упражнение; иначе - это научная проблема." mkudritsky Сообщ. #21 от 12.08.04, 07:15 Junior
Профиль · PM
Рейтинг (т): 2
Так мы же можем строить поток минимальной стоимости в двудолном графе (к этой задаче сводится "задача о назначениях"), увеличивая поток на единицу. Таким образом, спустя N-n шагов, получим поток мощности N-n единиц.
Или я где-то наглючил (точно не помню алгоритм построения потока минимальной стоимости)
Я выше сказал примерно о том же самом. Что поток в сети, состоящей из двудольного графа, что поиск на нем максимального паросочетания - одно и то же.
Одно плохо - для решения обозначенной разновидности ЗН мне скорее всего придется серьезно пересмотреть существующую уже программу для решения классической ЗН. А может и нет... Словом, надо смотреть.
P.S. 1. Что касается решения разомкнутой задачи коммивояжера для 100 городов на школьной Олимпиаде, то скорее всего там требуется получить ее приближенное решение каким-нибудь наперед заданным методом. Например, методом ближайшей точки с прогнозом по методу ближайшей точки (или еще каким-нибудь корявым приближенным методом).
А вот если говорить о получении точного решения разомкнутой ЗК при числе городов порядка 100, то тут ИМХО и алгоритмы, и программы составляются и пишутся очень непросто. Точное решение можно получить только методом ветвей и границ или его разновидностями. Так что школьникам для начала пришлось бы родить какую-либо нижнюю оценку, типа задачи о назначениях (кстати, далеко не самая лучшая нижняя оценка решения ЗК трудоекмости O(N**3)). А потом уже рожать алгоритм ветвления.
Приведу свой пример.
Программу решения ЗН (нижняя оценка ЗК) я рожал около месяца, занимаясь проблематикой по часу в день. Правда, все процедуры старался строить наиболее оптимальным образом, ибо софт предполагается на реализацию.
Что касается алгоритма ветвления, то я его строил на специальном графе. Если нижнюю оценку решения ЗК положить равной нулю, то поиск на этом графе своидится к решению ЗК методом динамического программирования. Одну только структуру данных я продумывал недели три. Ведь программирование подобных задач - это далеко не то же самое, что, например, решение алгебраических уравнений на ПЭВМ, где формулы на бумаге почти один-в-один перекочевывают в программу...
Ну а программу я писал и отлаживал несколько месяцев!
2. Ну а теперь небольшой теоретический лекбез, что такое задача коммивояжера. Она относится к труднорешаемым комбинаторным задачам, т.е. для ее решения неизвестны полиномиальные алгоритмы. И скорее всего таковых нет, хотя этот факт пока еще не доказан. Пусть число городов равно N.
а). Тогда время решения ЗК методом динамического программирования оценивается примерно как 2**N.
б). Время решения ЗК методом ветвей и границ оценивается величиной N**5, если в качестве нижней оценки применять какой-либо алгоритм кубичной трудоемкости (например, алгоритм решения ЗН). Но это только ПРИ УДАЧНО РАЗВИВАЮЩЕМСЯ ПРОЦЕССЕ ВЕТВЛЕНИЯ. Достаточно просто найти матрицу, при которой даже методо ветвей и границ становится, увы, экспоненциальным. Чем точнее нижняя оценка, тем труднее найти такую матрицу.
г). Ну а теперь к фактам. На самых современных ПЭВМ задачу о назначениях O(N**3) можно достаточно просто решить для N=10000. Требуется несколько сот мегабайт памяти и выполнение 10**12 элементарных операций. PIV-3ГГц должен справиться с задачей примерно за час.
Что касается точного решения задачи коммивояжера, то в лучшем случае можно расчитывать на N порядка несколько сотен. На Мехмате МГУ вроде как решают ЗК на полных матрицах для N<300. При этом вероятность получения решения далеко не равна 100%. Есть много примеров, когда алгоритм расходится. Про время счета ничего определенного сказать нельзя - оно может меняться от нескольких минут до нескольких часов и часто процесс счета завершается аварийно (чаще всего памяти не хватает, но иногда и времени). Это как повезет с процессом ветвления.
Теперь о методе динамического программирования. При N=100 потребуется выполнить 2**100 или примерно 10**30 элементарных операций. Если ПЭВМ выполняет эл операцию за 10**-10 сек, то для решения такой ЗК потребуется 10**20 сек. Для сравнения время существования Земли оценивается величной 10**18 сек. Кстати, лично я не разделяю мнение о проблеме памяти в методе динамического программирования. По моим расчетным данным на ПЭВМ узким звеном является не память, а время счета. Проблема метода динамического программирования в другом - экспоненциальный рост и потребной памяти, и числа эл операций, потребных для решения ЗК.
Резюме: теперь, господа, Вам понятно с чем мы тут связались в этой ветке?
А школьникам даже для квалифицированного обсуждения подобных вещей надо минимум закончить Мехмат МГУ или Физтех, а также овладеть главами спецматематики. mkudritsky Сообщ. #22 от 18.12.04, 09:36 Junior
Профиль · PM
Рейтинг (т): 2
На двудольном графе соответствия "N городов" - "N городов" надо найти минимальное взвешенное паросочетание мощности (N-n).
Как всегда, ларчик просто открывался. Цитированная нижняя оценка для разомкнутой задачи N-коммивояжеров легко сводится к классической задаче о назначениях. Надо только на n увеличить одну из "долей" двудольного графа соответсвия "кандидаты"-"должности". И поиск надо организовывать по малой стороне полученной "трапеции". 1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей) 0 пользователей: « Предыдущая тема | Алгоритмы | Следующая тема »
Форум на Исходниках.RU · Алгоритмы
Страницы: (2) 1 [2] все Новая тема · Новое голосование
Powered by Invision Power Board(U) v1.2 © 2003 IPS, Inc. u="u1624.10.spylog.com";d=document;nv=navigator;na=nv.appName;p=1; bv=Math.round(parseFloat(nv.appVersion)*100); n=(na.substring(0,2)=="Mi")?0:1;rn=Math.random();z="p="+p+"&rn="+rn;y=""; y+=""; y+=""; y+=""; d.write(y);if(!n) { d.write("