Оптимальный (минимальный) путь.
От: fAX Израиль  
Дата: 24.04.02 09:06
Оценка:
Нужен алгоритм.
Вход — двухмерный массив точек.
Выход — порядок обхода этих точек, исходя из следующих критериев:

Самое непонятное тут, как изначально организовать точки. Если какой-нибудь алгоритм (Форда, если не ошибаюсь) из теории графов для нахождения минимальных расстояний между всеми точками, то ему нужно O(n^3), а при входе O(10^5) это очень дорого, но в крайнем случае, подойдёт. Кроме того, как эффективно построить граф из массива точек.

Какие-то идеи?

Заранее спасибо,
fAX.
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re: Оптимальный (минимальный) путь.
От: Bell Россия  
Дата: 24.04.02 09:12
Оценка:
Здравствуйте fAX, Вы писали:

fAX>Нужен алгоритм.

fAX>Вход — двухмерный массив точек.
fAX>Выход — порядок обхода этих точек, исходя из следующих критериев:
fAX>
fAX>Самое непонятное тут, как изначально организовать точки. Если какой-нибудь алгоритм (Форда, если не ошибаюсь) из теории графов для нахождения минимальных расстояний между всеми точками, то ему нужно O(n^3), а при входе O(10^5) это очень дорого, но в крайнем случае, подойдёт. Кроме того, как эффективно построить граф из массива точек.


fAX>Какие-то идеи?


fAX>Заранее спасибо,

fAX>fAX.

Очень похоже на задачу коммивояжера. Для решения этой задачи используется симплекс-метод.
Алгоритм Форда же предназначен для поиска кратчайших путей между всеми вершинами графа. Причем эти не обязательно проходят через все вершины.
Или я неправильно понял постановку?
Любите книгу — источник знаний (с) М.Горький
Re[2]: Оптимальный (минимальный) путь.
От: fAX Израиль  
Дата: 24.04.02 09:19
Оценка:
Здравствуйте Bell, Вы писали:

fAX>>Самое непонятное тут, как изначально организовать точки. Если какой-нибудь алгоритм (Форда, если не ошибаюсь) из теории графов для нахождения минимальных расстояний между всеми точками, то ему нужно O(n^3), а при входе O(10^5) это очень дорого, но в крайнем случае, подойдёт. Кроме того, как эффективно построить граф из массива точек.


fAX>>Какие-то идеи?


fAX>>Заранее спасибо,

fAX>>fAX.

B>Очень похоже на задачу коммивояжера. Для решения этой задачи используется симплекс-метод.

B>Алгоритм Форда же предназначен для поиска кратчайших путей между всеми вершинами графа. Причем эти не обязательно проходят через все вершины.
B>Или я неправильно понял постановку?

Утешили. . Она-то — NP-полная! Хотя и есть хорошие приближения. Вопрос тут и в том, насколько они хороши на входе 10^5+. Но основная проблема — построить граф, как я уже писал.
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re[3]: Оптимальный (минимальный) путь.
От: fAX Израиль  
Дата: 24.04.02 09:25
Оценка:
Да! Про алгоритм Форда я сказал, т.к. будь в моём распоряжении матрица расстояний — дальше всё просто и понятно — путешествуй себе исходя из критериев. Оптимизация будет локальной — но всё же лучше, чем ничего. Но, к сожалению, такая матрица потребует 10^10 элементов.
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re: Оптимальный (минимальный) путь.
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.04.02 10:55
Оценка:
Здравствуйте fAX, Вы писали:

fAX>Нужен алгоритм.

fAX>Вход — двухмерный массив точек.
fAX>Выход — порядок обхода этих точек, исходя из следующих критериев:
fAX>
fAX>Самое непонятное тут, как изначально организовать точки. Если какой-нибудь алгоритм (Форда, если не ошибаюсь) из теории графов для нахождения минимальных расстояний между всеми точками, то ему нужно O(n^3), а при входе O(10^5) это очень дорого, но в крайнем случае, подойдёт. Кроме того, как эффективно построить граф из массива точек.


fAX>Какие-то идеи?

Точно говорю — должен быть человеческий алгоритим. Уж больно норма красивая. Так сходу в голову ничего не приходит, но попробую покумекать.
Чтобы обнадежить, могу рассказать байку про стандартную задачку, которую дают в НГУ математикам первого курса: дано множество точек на плоскости, надо построить окружность минимального радиуса, которая покрывает их все.
Классический подход: берем тройку точек, проводим окружность через них (очевидно, что искомая окружность будет проходить как минимум через три точки множества), проверяем, все ли внутри. полный перебор. Время работы ~N^4. Решения проверялисm на множествах в ~100 точек.
Мой друг, помогая человеку получить построил алгоритм, время работы которого ~N^N. Проверяли на множестве в 16000 точек.
Мораль: не все печальные теоремы бывают применимы в частном случае.В конкретной задаче могут найтись удачные ограничения, и решение будет намного эффективнее общего.
fAX>Заранее спасибо,
fAX>fAX.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Оптимальный (минимальный) путь.
От: fAX Израиль  
Дата: 24.04.02 11:26
Оценка:
Здравствуйте Sinclair, Вы писали:

fAX>>Какие-то идеи?

S>Точно говорю — должен быть человеческий алгоритим. Уж больно норма красивая. Так сходу в голову ничего не приходит, но попробую покумекать.
S>Чтобы обнадежить, могу рассказать байку про стандартную задачку, которую дают в НГУ математикам первого курса: дано множество точек на плоскости, надо построить окружность минимального радиуса, которая покрывает их все.
S>Классический подход: берем тройку точек, проводим окружность через них (очевидно, что искомая окружность будет проходить как минимум через три точки множества), проверяем, все ли внутри. полный перебор. Время работы ~N^4. Решения проверялисm на множествах в ~100 точек.
S>Мой друг, помогая человеку получить построил алгоритм, время работы которого ~N^N. Проверяли на множестве в 16000 точек.
S>Мораль: не все печальные теоремы бывают применимы в частном случае.В конкретной задаче могут найтись удачные ограничения, и решение будет намного эффективнее общего.
fAX>>Заранее спасибо,
fAX>>fAX.

Дык надежда меня и питает .
А задача твоя, возможно и проще решается, т.к. convex hull (извини, по-русски не знаю) = O (N*LogN) + O(N^2) на нахождение наибольшего диаметра (можно, думается, и за N*LogN).

Hо всё же спасибо.
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re[4]: Оптимальный (минимальный) путь.
От: Кодт Россия  
Дата: 24.04.02 11:53
Оценка: 3 (1)
Здравствуйте fAX, Вы писали:

fAX>Да! Про алгоритм Форда я сказал, т.к. будь в моём распоряжении матрица расстояний — дальше всё просто и понятно — путешествуй себе исходя из критериев. Оптимизация будет локальной — но всё же лучше, чем ничего. Но, к сожалению, такая матрица потребует 10^10 элементов.


Я так понял, требуется программа управления плоттером...

А так ли нужен наилучший способ (который получится решением задачи коммивояжера)?

Для такого большого числа точек можно предположить, что они сгруппированы в некие кластеры (расстояния внутри кластера существенно меньше, чем межкластерные).

В противном случае — когда точки расбросаны более-менее равномерно — сымитируем работу матричного принтера.
1. отсортируем точки по той координате, которая более "накладная" (скажем, по X)
2. нарежем пространство на полосы некоторой ширины по X
3. в пределах каждой полосы отсортируем точки по Y
В пределах полосы движемся от точки к точке. (преимущественное изменение координаты Y, незначительное Y)

Выбор направления ( Y++ | Y-- ) — либо волюнтаристский, либо решается задача динамического программирования.

Итак, вернемся к кластерам.

Сначала строится дерево минимальной длины, соединяющее все точки.
— берем две произвольных точки, соединяем их дугой (это будет зародыш дерева)
— берем очередную точку (A),
— — добавляем дугу к самой ближней из вершин дерева (B),
— — затем находим вторую по близости вершину (C)
— — находим самую длинную дугу на пути, соединяющем вершины B & C
— — если она длиннее, чем |AC|, то удаляем эту дугу и добавляем дуги AB и AC,
— — иначе добавляем только AB.

Далее выявляем кластеры (определяем некоторую критическую длину дуги дерева и считаем, что вершины, связанные дугами меньшей длины, принадлежат одному кластеру, а большей — разным).

Критерий может быть, например, таким: в одном кластере — не более N точек. Или диаметр кластера не более D.

Сгруппировав точки, в каждом кластере решаем задачу коммивояжера, а затем — решаем задачу уже между кластерами как неделимыми образованиями.
Перекуём баги на фичи!
Re[5]: Оптимальный (минимальный) путь.
От: fAX Израиль  
Дата: 24.04.02 12:32
Оценка:
Здравствуйте Кодт, Вы писали:

К>Здравствуйте fAX, Вы писали:


fAX>>Да! Про алгоритм Форда я сказал, т.к. будь в моём распоряжении матрица расстояний — дальше всё просто и понятно — путешествуй себе исходя из критериев. Оптимизация будет локальной — но всё же лучше, чем ничего. Но, к сожалению, такая матрица потребует 10^10 элементов.


К>Я так понял, требуется программа управления плоттером...

Близко, очень близко — но с логической точки зрения (а ничего другого меня в данный момент не интересует ;) )

К>А так ли нужен наилучший способ (который получится решением задачи коммивояжера)?

Я и не сказал лучший — но достаточно хорошее приближение.

К>Для такого большого числа точек можно предположить, что они сгруппированы в некие кластеры (расстояния внутри кластера существенно меньше, чем межкластерные).


К>В противном случае — когда точки расбросаны более-менее равномерно — сымитируем работу матричного принтера.

К>1. отсортируем точки по той координате, которая более "накладная" (скажем, по X)
К>2. нарежем пространство на полосы некоторой ширины по X
К>3. в пределах каждой полосы отсортируем точки по Y
К>В пределах полосы движемся от точки к точке. (преимущественное изменение координаты Y, незначительное Y)
Это то, что есть сейчас. К сожалению обостряется п.3.

К>Выбор направления ( Y++ | Y-- ) — либо волюнтаристский, либо решается задача динамического программирования.

Извините, не понял...

К>Итак, вернемся к кластерам.


К>Сначала строится дерево минимальной длины, соединяющее все точки.

К>- берем две произвольных точки, соединяем их дугой (это будет зародыш дерева)
К>- берем очередную точку (A),
К>- — добавляем дугу к самой ближней из вершин дерева (B),
К>- — затем находим вторую по близости вершину (C)
К>- — находим самую длинную дугу на пути, соединяющем вершины B & C
К>- — если она длиннее, чем |AC|, то удаляем эту дугу и добавляем дуги AB и AC,
К>- — иначе добавляем только AB.

К>Далее выявляем кластеры (определяем некоторую критическую длину дуги дерева и считаем, что вершины, связанные дугами меньшей длины, принадлежат одному кластеру, а большей — разным).


К>Критерий может быть, например, таким: в одном кластере — не более N точек. Или диаметр кластера не более D.


К>Сгруппировав точки, в каждом кластере решаем задачу коммивояжера, а затем — решаем задачу уже между кластерами как неделимыми образованиями.


Спасибо огромное. Это похоже на решение. Тоже склонялся к BSP, но так делить на кластеры я не думал. Ещё раз спасибо.

ЗЫ. А ни у кого нет алгоритма приближения коммивояжёра? Буду очень благодарен за информацию.
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re[6]: Оптимальный (минимальный) путь.
От: Кодт Россия  
Дата: 24.04.02 14:52
Оценка: 3 (1)
Здравствуйте fAX, Вы писали:


К>>В противном случае — когда точки расбросаны более-менее равномерно — сымитируем работу матричного принтера.

К>>1. отсортируем точки по той координате, которая более "накладная" (скажем, по X)
К>>2. нарежем пространство на полосы некоторой ширины по X
К>>3. в пределах каждой полосы отсортируем точки по Y
К>>В пределах полосы движемся от точки к точке. (преимущественное изменение координаты Y, незначительное Y)
fAX>Это то, что есть сейчас. К сожалению обостряется п.3.

К>>Выбор направления ( Y++ | Y-- ) — либо волюнтаристский, либо решается задача динамического программирования.

fAX>Извините, не понял...

Смысл такой. Есть полосы (будем считать их неделимыми). У каждой из них есть два края
(Ymin, Ymax).
Нужно определить направление прохода каждой полосы.
Понятно, что суммарная длина проходов полос — величина постоянная и не зависит от выбора направлений. Следовательно, нужно минимизировать переходы от одной полосы к другой (следующей).

Пусть
Ai,Bi - концевые точки i-й полосы

Vi - направление прохода i-й полосы (от Ai к Bi либо наоборот). Принимает значения a (B->A) | b (A->B)

L[i,i+1] - длина перехода от i к i+1 полосе.
L[i,i+1] = f(Vi,Vi+1) - есть 4 варианта (AiAi+1, AiBi+1, BiAi+1, BiBi+1)

L[0,n] - суммарная длина переходов
L[0,n] = f(V0..Vn) - очевидно, с такой размерностью полный перебор делать бессмысленно.

Динамическое программирование - это принятие наилучшего решения на каждом шаге.

Как это сделать в данном случае?

Пусть мы нашли две последовательности V'0..i и V"0..i такие, что
V'i = "a" и V"i = "b",
а все остальные члены последовательностей дают минимальные L'[0..i] и L"[0..i].

Добавим следующий член (V'i+1, V"i+1).

Всего 4 варианта:
(1) V'0..i "a", L = L'[0..i] + L(AiBi+1) --> V'0..i+1
(2) V'     "b",     L'         L(AiAi+1)     V"
(3) V"     "a",     L"         L(BiBi+1)     V'
(4) V"     "b"      L"         L(BiAi+1)     V"

Из (1) и (3) выберем минимальный и получим новую последовательность V',
из (2) и (4) - получим V".

В конце концов у нас есть два оптимальных варианта, один (V') заканчивается на An, другой(V") - на Bn. Выберем более короткий.

Сложность алгоритма — O(N) (один проход) (не считая предварительной сортировки точек).
Затраты памяти — O(N) — два вектора V', V".
В процессе работы не нужно менять векторы местами — что из них закончилось на "a" — то и есть V'.
Затраты на вычисление длины — O(N) — используем 2 сумматора.

К>>Итак, вернемся к кластерам.


К>>Сначала строится дерево минимальной длины, соединяющее все точки.

К>>- берем две произвольных точки, соединяем их дугой (это будет зародыш дерева)
К>>- берем очередную точку (A),
К>>- — добавляем дугу к самой ближней из вершин дерева (B),
К>>- — затем находим вторую по близости вершину (C)
К>>- — находим самую длинную дугу на пути, соединяющем вершины B & C
К>>- — если она длиннее, чем |AC|, то удаляем эту дугу и добавляем дуги AB и AC,
К>>- — иначе добавляем только AB.

К>>Далее выявляем кластеры (определяем некоторую критическую длину дуги дерева и считаем, что вершины, связанные дугами меньшей длины, принадлежат одному кластеру, а большей — разным).


К>>Критерий может быть, например, таким: в одном кластере — не более N точек. Или диаметр кластера не более D.


К>>Сгруппировав точки, в каждом кластере решаем задачу коммивояжера, а затем — решаем задачу уже между кластерами как неделимыми образованиями.


fAX>Спасибо огромное. Это похоже на решение. Тоже склонялся к BSP, но так делить на кластеры я не думал. Ещё раз спасибо.


Дерево здесь нужно только для эффективной группировки точек на кластеры (предполагая, что исходные данные неупорядочены).

Если они уже как-либо сгруппированы, то можно и по-другому.

Например, накладывается сетка с шагом, соизмеримым с ожидаемым диаметром кластера.
Точки группируются по ячейкам сетки.
Затем соседние заполненные ячейки анализируются на предмет объединения точек в кластеры.

Можно укрупнять сетку несколько раз.

fAX>ЗЫ. А ни у кого нет алгоритма приближения коммивояжёра? Буду очень благодарен за информацию.
Перекуём баги на фичи!
Re[7]: Оптимальный (минимальный) путь.
От: fAX Израиль  
Дата: 24.04.02 15:12
Оценка:
Здравствуйте Кодт, Вы писали:

fAX>>Извините, не понял...


К>Смысл такой. Есть полосы (будем считать их неделимыми). У каждой из них есть два края

К>(Ymin, Ymax).
К>Нужно определить направление прохода каждой полосы.
К>Понятно, что суммарная длина проходов полос — величина постоянная и не зависит от выбора направлений. Следовательно, нужно минимизировать переходы от одной полосы к другой (следующей).

К>Пусть

К>
К>Ai,Bi - концевые точки i-й полосы

К>Vi - направление прохода i-й полосы (от Ai к Bi либо наоборот). Принимает значения a (B->A) | b (A->B)

К>L[i,i+1] - длина перехода от i к i+1 полосе.
К>L[i,i+1] = f(Vi,Vi+1) - есть 4 варианта (AiAi+1, AiBi+1, BiAi+1, BiBi+1)

К>L[0,n] - суммарная длина переходов
К>L[0,n] = f(V0..Vn) - очевидно, с такой размерностью полный перебор делать бессмысленно.

К>Динамическое программирование - это принятие наилучшего решения на каждом шаге.

К>Как это сделать в данном случае?

К>Пусть мы нашли две последовательности V'0..i и V"0..i такие, что
К>V'i = "a" и V"i = "b",
К>а все остальные члены последовательностей дают минимальные L'[0..i] и L"[0..i].

К>Добавим следующий член (V'i+1, V"i+1).

К>Всего 4 варианта:
К>(1) V'0..i "a", L = L'[0..i] + L(AiBi+1) --> V'0..i+1
К>(2) V'     "b",     L'         L(AiAi+1)     V"
К>(3) V"     "a",     L"         L(BiBi+1)     V'
К>(4) V"     "b"      L"         L(BiAi+1)     V"

К>Из (1) и (3) выберем минимальный и получим новую последовательность V',
К>из (2) и (4) - получим V".

К>В конце концов у нас есть два оптимальных варианта, один (V') заканчивается на An, другой(V") - на Bn. Выберем более короткий.
К>

К>Сложность алгоритма — O(N) (один проход) (не считая предварительной сортировки точек).
К>Затраты памяти — O(N) — два вектора V', V".
К>В процессе работы не нужно менять векторы местами — что из них закончилось на "a" — то и есть V'.
К>Затраты на вычисление длины — O(N) — используем 2 сумматора.
Спасибо за разъяснение.


К>Дерево здесь нужно только для эффективной группировки точек на кластеры (предполагая, что исходные данные неупорядочены).


К>Если они уже как-либо сгруппированы, то можно и по-другому.


К>Например, накладывается сетка с шагом, соизмеримым с ожидаемым диаметром кластера.

К>Точки группируются по ячейкам сетки.
К>Затем соседние заполненные ячейки анализируются на предмет объединения точек в кластеры.

К>Можно укрупнять сетку несколько раз.


Да, но будет ли это эффективней? Ведь этот анализ намного сложнее. Можно, конечно, нечто среднее: в каждой ячейке построить дерево, а потом их смешивать и находить кластеры? (В дереве можно будет и по размеру, и по расстоянию разделять)

fAX>>ЗЫ. А ни у кого нет алгоритма приближения коммивояжёра? Буду очень благодарен за информацию.
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re[3]: Оптимальный (минимальный) путь.
От: Sinclair Россия https://github.com/evilguest/
Дата: 25.04.02 09:51
Оценка:
Здравствуйте fAX, Вы писали:

fAX>Здравствуйте Sinclair, Вы писали:


fAX>>>Какие-то идеи?

fAX>Дык надежда меня и питает .
fAX>А задача твоя, возможно и проще решается, т.к. convex hull (извини, по-русски не знаю) = O (N*LogN) + O(N^2) на нахождение наибольшего диаметра (можно, думается, и за N*LogN).
Упс! Сорри, очепятался — конечно N*N
fAX>Hо всё же спасибо.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Оптимальный (минимальный) путь.
От: fAX Израиль  
Дата: 25.04.02 12:16
Оценка:
Здравствуйте Sinclair, Вы писали:

S>Упс! Сорри, очепятался — конечно N*N :)

Segodnja videl algoritm (determ N*LogN) i esh,e odin so srednim O(N) i worst case O(N^2). Poslednij pohozh na tvoj.

Sorry za translit
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re[2]: Оптимальный (минимальный) путь.
От: Олег Куликов США  
Дата: 29.04.02 06:57
Оценка:
Здравствуйте Bell, Вы писали:

B>Очень похоже на задачу коммивояжера.


Не похоже, а она и есть.

B>Для решения этой задачи используется симплекс-метод.


Ни в коем случае. Задача многоэкстремальная, а он дает локальное решение.
И немедленно выпил...
Re: Оптимальный (минимальный) путь.
От: Олег Куликов США  
Дата: 29.04.02 07:08
Оценка: 3 (1)
Здравствуйте fAX, Вы писали:

fAX>Нужен алгоритм.


Попробуй метод отжига (Simulated annealing method).

http://www.ulib.org/webRoot/Books/Numerical_Recipes/bookcpdf/c10-9.pdf
И немедленно выпил...
Re[4]: Оптимальный (минимальный) путь.
От: mab Россия http://shade.msu.ru/~mab
Дата: 14.05.02 12:42
Оценка:
Здравствуйте Sinclair, Вы писали:

S>Здравствуйте fAX, Вы писали:


fAX>>Здравствуйте Sinclair, Вы писали:


fAX>>>>Какие-то идеи?

fAX>>Дык надежда меня и питает .
fAX>>А задача твоя, возможно и проще решается, т.к. convex hull (извини, по-русски не знаю) = O (N*LogN) + O(N^2) на нахождение наибольшего диаметра (можно, думается, и за N*LogN).
S>Упс! Сорри, очепятался — конечно N*N
fAX>>Hо всё же спасибо.

convex hull всю жизнь по-русски называлось выпуклой оболочкой
Выражение O(N*LogN) + O(N^2) кажется как минимум странным,
поскольку оно есть просто O(N^2).
Диаметр множества точек несложно ищется за O(N*log N),
если предварительно построить выпуклую оболочку алгоритмом
Грэхема.

Кстати говоря, алгоритм, который в этом треде был жестоко
обозван "алгоритмом Форда", по-настоящему называется
алгоритмом Флойда.
Re[2]: Оптимальный (минимальный) путь.
От: mab Россия http://shade.msu.ru/~mab
Дата: 14.05.02 12:46
Оценка:
B>Очень похоже на задачу коммивояжера. Для решения этой задачи используется симплекс-метод.

Интересное утверждение, но все же вряд ли коммивояжер решается
симплекс-методом, поскольку последний ничего кроме линейного
программирования не умеет, а последнее решается за
полиномиальное время (методом эллипсоидов, алгоритмом Кармаркара).
Re[5]: Оптимальный (минимальный) путь.
От: fAX Израиль  
Дата: 14.05.02 13:49
Оценка:
Здравствуйте mab, Вы писали:

fAX>>>Здравствуйте Sinclair, Вы писали:


fAX>>>>>Какие-то идеи?

fAX>>>Дык надежда меня и питает ;-).
fAX>>>А задача твоя, возможно и проще решается, т.к. convex hull (извини, по-русски не знаю) = O (N*LogN) + O(N^2) на нахождение наибольшего диаметра (можно, думается, и за N*LogN).
S>>Упс! Сорри, очепятался — конечно N*N :)
fAX>>>Hо всё же спасибо.

mab>convex hull всю жизнь по-русски называлось выпуклой оболочкой

mab>Выражение O(N*LogN) + O(N^2) кажется как минимум странным,
mab>поскольку оно есть просто O(N^2).
O (N*LogN) — convex hull (eto ja znaju). A minimal`nyj diametr, kak ja i napisal, ochevidnym sposobom O(N^2), i pripisal "(можно, думается, и за N*LogN)". Takim obrazom "+" byl razdelitelem ;). V lubom sluchaet, mne prosto "ne ponravilos`" n^4, potomu i napisal. (Bol`she vsego mne ponravilos` N^N pri N=16000).


mab>Диаметр множества точек несложно ищется за O(N*log N),

mab>если предварительно построить выпуклую оболочку алгоритмом
mab>Грэхема.
Da, ja potom poiskal.

mab>Кстати говоря, алгоритм, который в этом треде был жестоко

mab>обозван "алгоритмом Форда", по-настоящему называется
mab>алгоритмом Флойда.
Nadejus`, on ne obiditsja ;). U menja ochen` plohaja pamjat` na imena. Otchego chasto stradaju. :(

Sorry for translit.
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re[3]: Оптимальный (минимальный) путь.
От: fAX Израиль  
Дата: 14.05.02 14:02
Оценка:
Здравствуйте mab, Вы писали:

B>>Очень похоже на задачу коммивояжера. Для решения этой задачи используется симплекс-метод.


mab>Интересное утверждение, но все же вряд ли коммивояжер решается

mab>симплекс-методом, поскольку последний ничего кроме линейного
mab>программирования не умеет,...
Вы absolutno pravy, t.k. линейное программирование в P, a коммивояжер в NP

mab>...а последнее решается за

mab>полиномиальное время (методом эллипсоидов, алгоритмом Кармаркара).

Mozhno i linejno s konstantoj (v d izmerenijah):
1) Cd = 2^(2^d)
2) Cd = 3^(d^2).
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re[6]: Оптимальный (минимальный) путь.
От: mab Россия http://shade.msu.ru/~mab
Дата: 16.05.02 13:30
Оценка:
fAX>O (N*LogN) — convex hull (eto ja znaju). A minimal`nyj diametr, kak ja i napisal, ochevidnym sposobom O(N^2), i pripisal "(можно, думается, и за N*LogN)". Takim obrazom "+" byl razdelitelem . V lubom sluchaet, mne prosto "ne ponravilos`" n^4, potomu i napisal. (Bol`she vsego mne ponravilos` N^N pri N=16000).fAX>

Да, плюс-разделитель — это прикольно!

fAX>Nadejus`, on ne obiditsja . U menja ochen` plohaja pamjat` na imena. Otchego chasto stradaju.


Ну это, конечно, не важно. Просто есть ведь еще и алгоритм Форда-Беллмана,
только он ищет не попарные расстояния, а от фиксированной вершины.
Зато время его работы не O(N^3), а O(N*M), где M — число ребер, это
позволяет получить неслабый выигрыш на разреженных графах.
Да и вообще раз уж расстояния неотрициательны, то нужно использовать
Дейкстру (например, с фибоначчиевыми кучами, что дает O(M+N*logN))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.