|
Алгоритм поиска крайних точек среди множества | ☑ | ||
---|---|---|---|---|
0
ИС-2
naïve
13.08.13
✎
08:19
|
Есть зоны с множеством входящих в них точек (географические координаты).
Как определить среди них крайние, чтобы потом построить многоугольник и очертить зону? Есть какой-то несложный алгоритм, кроме тупого перебора? |
|||
1
jsmith82
13.08.13
✎
08:20
|
бинарный поиск
|
|||
2
jsmith82
13.08.13
✎
08:23
|
||||
3
jsmith82
13.08.13
✎
08:23
|
||||
4
jsmith82
13.08.13
✎
08:27
|
||||
5
1Сергей
13.08.13
✎
08:31
|
в трехмерном пространстве?
|
|||
6
jsmith82
13.08.13
✎
08:37
|
вот работающий пример на
http://www.psychedelicdevelopment.com/grahamscan/ |
|||
7
jsmith82
13.08.13
✎
08:37
|
+(6) на javascript
|
|||
8
Лодырь
13.08.13
✎
08:46
|
Топикстартер недвусмысленно намекает что у него не плоскость, а поверхность земного шара.
|
|||
9
Lama12
13.08.13
✎
09:00
|
Не совсем в теме, но разве нельзя, для данной задачи, точки с трехмерными координатами представить в виде проекций на 3 плоскости?
|
|||
10
Лодырь
13.08.13
✎
09:11
|
(9) Насколько я понимаю, при стандартной развертке, прямые на плоскости превратятся в кривые на сфере и наоборот.
|
|||
11
Lama12
13.08.13
✎
09:14
|
(10) Сомнения понял.
|
|||
12
vde69
модератор
13.08.13
✎
09:16
|
задача автора это часть алгоритма
wiki:%D2%F0%E8%E0%ED%E3%F3%EB%FF%F6%E8%FF_%C4%E5%EB%EE%ED%E5 |
|||
13
Лодырь
13.08.13
✎
09:16
|
||||
14
ИС-2
naïve
13.08.13
✎
11:33
|
(3) спс
(5) думаю в пределах одного города землю можно считать плоской |
|||
15
ИС-2
naïve
16.08.13
✎
13:03
|
||||
16
ИС-2
naïve
16.08.13
✎
13:51
|
||||
17
dk
16.08.13
✎
14:13
|
нафига внешние пакеты? очень много данных и время поиска критично?
можно тупо в 1с 1. выбрать крайнюю точку (максимум или минимум по любой из координат) 2. строить линию к остальным точкам и проверять лежат ли все остальные точки множества (слева или справа от линии) 3. если все точки множества слева или справа, то это тоже крайняя точка - сохраняем и идем дальше 4. если не крайняя, то идем дальше --- тока надо придумать что делать если все точки на одной линии |
|||
18
Лодырь
16.08.13
✎
14:20
|
(17) Если все оставшиеся на линии - выбираем самую дальнюю от текущей и завершаем работу. Если на первом шаге все лежат на 1 линии - идем в соседний отдел убивать шутника а потом таки включаем самую дальнюю точку и завершаем работу.
|
|||
19
Fragster
модератор
16.08.13
✎
14:25
|
а я представил себе алгоритм с преобразованием в полярные координаты, поиск точки с минимальным углом и (если несколько) максимальным расстоянием. Сдвиг обычной системы координат в эту точку, повторение. как только дойдем 2й раз до 1 и той же точки - профит.
|
|||
20
Лодырь
16.08.13
✎
14:34
|
(19) Это все варианты алгоритма Джарвиса. По сути одно и тоже.
|
|||
21
ИС-2
naïve
16.08.13
✎
15:13
|
(17) сказали, что там есть. В алгоритме предполагается что фигура выпуклая, а у меня может быть любая. Аналогия с проведением точек в конверте (центральная точка).
Задачу я сформулировал не корректно. Мне надо "обтянуть" точки, а не просто выделить крайние. Т.е может получиться и "сосиска" и "полумесяц" и т.д. |
|||
22
Зойч
16.08.13
✎
15:15
|
(21) если проводить фигуру по крайним точкам то НЕ может получиться полумесяц
|
|||
23
dk
16.08.13
✎
15:17
|
(21) http://savepic.su/2986683.png левый или правый вариант?
|
|||
24
ИС-2
naïve
16.08.13
✎
15:20
|
(23) левый
|
|||
25
dk
16.08.13
✎
15:21
|
(24) а если усложнить http://savepic.su/2970299.png ? )))
|
|||
26
Rie
16.08.13
✎
15:22
|
(24) Сформулируй задачу корректно - и люди к тебе потянутся.
(Но тебе это будет уже не нужно - поскольку при правильной формулировке решение будет сразу видно). |
|||
27
ИС-2
naïve
16.08.13
✎
15:29
|
(25) http://itmages.ru/image/view/1170409/599a3270
(26) у меня есть понимание того, что хочу. Определить зоны где есть клиенты на карте. Но сформулировать... |
|||
28
vde69
модератор
16.08.13
✎
15:32
|
что-то мне подсказывает:
wiki:Задача_коммивояжёра#.D0.9C.D0.B5.D1.82.D1.80.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B0.D1.8F_.D0.B7.D0.B0.D0.B4.D0.B0.D1.87.D0.B0 данная задача гарантировано лежив в алгоритме из (12) |
|||
29
dk
16.08.13
✎
15:32
|
(27)а почему не http://savepic.su/2953914.png ?
|
|||
30
Rie
16.08.13
✎
15:35
|
||||
31
vde69
модератор
16.08.13
✎
15:37
|
вообще большенство не линейных задач комбинаторики строятся на триангуляции Делона
|
|||
32
Rie
16.08.13
✎
15:42
|
(0) Попробую догадаться...
Построй отрезки между всеми точками. Удали пересекающиеся. Удали внутренние. (Строить _все_ - не обязательно). (Внимательно читай, что vde69 пишет). |
|||
33
vde69
модератор
16.08.13
✎
15:49
|
(32) тут есть маленькая загвостка...
если у нас 10 000 точек сколько будет отрезков "Построй отрезки между всеми точками" ??? а если точек будет лям :) я реализовывал в 1с триангуляцию на подобных массивах точек :) |
|||
34
Rie
16.08.13
✎
15:51
|
(33) Тут есть большая загвоздка - а что именно хочет ТС?
Насчёт "маленькой загвоздки" - это да. Поэтому на тебя и ссылаюсь. Но пусть сначала хоть какое-то решение найдёт. При малых n. И убедится, что это - то, что ему надо. А то будет искать эффективный алгоритм не для того. dk ведь не зря примерчики подкидывал. |
|||
35
ИС-2
naïve
16.08.13
✎
15:56
|
попробую в начале (17) и хоть посмотрю, что получиться
|
|||
36
Rie
16.08.13
✎
15:58
|
(35) Получишь правый вариант из (23).
|
|||
37
vde69
модератор
16.08.13
✎
16:01
|
вот еще прикольный алгоритм, пригодный например для минимальной топологиии сети wiki:Минимальное_остовное_дерево
|
|||
38
bahmet
16.08.13
✎
16:04
|
(27) мдя..судя по рисунку меньше играть в танки надо.
Почему внутренние точки сверху удостоились войти в крайние, а внизу нет. Это типа гравитация сверху вниз и нить провисла?)) |
|||
39
NS
16.08.13
✎
16:10
|
http://e-maxx.ru/algo/convex_hull_graham
Построение выпуклой оболочки обходом Грэхэма Даны N точек на плоскости. Построить их выпуклую оболочку, т.е. наименьший выпуклый многоугольник, содержащий все эти точки. Мы рассмотрим метод Грэхэма (Graham) (предложен в 1972 г.) с улучшениями Эндрю (Andrew) (1979 г.). С его помощью можно построить выпуклую оболочку за время O (N log N) с использованием только операций сравнения, сложения и умножения. Алгоритм является асимптотически оптимальным (доказано, что не существует алгоритма с лучшей асимптотикой), хотя в некоторых задачах он неприемлем (в случае параллельной обработки или при online-обработке). |
|||
40
vde69
модератор
16.08.13
✎
16:16
|
(39) в 90х я использовал поиск по наименьшему углу, не знаю есть такие алгоритмы так сказать академически, но тогда сам придумал и само работало, на XT контур из 10 000 точек строило около минуты, работало :)
|
|||
41
NS
16.08.13
✎
16:17
|
(40) Наименьший угол - это сложность O(n^2), что неприемлемо на практике.
|
|||
42
vde69
модератор
16.08.13
✎
16:19
|
(41) не совсем, там для каждой точки есть 4 четверти, и в зависимости от ее расположение анализировать нужно максимум 1/2 а идеале 1/4 углов
|
|||
43
Fragster
модератор
16.08.13
✎
16:21
|
(41) это наихудший вариант
|
|||
44
NS
16.08.13
✎
16:32
|
(42) ? О(1/4*n*n)=O(n*n), по определению.
(43) Всегда O(n^2) |
|||
45
Torquader
17.08.13
✎
00:05
|
А если решать задачу последовательно:
1) Берём три точки - получаем треугольник. 2) Последовательно добавляем точки - если точка оказывается внутри фигуры-многогранника, то она внутренняя, если она выходит за какую-то грань, то добавляется два отрезка, если за несколько граней, то происходит спрямление, то есть выкидываются точки, ставшие внутренними. |
|||
46
NS
17.08.13
✎
00:32
|
(45) В ветке приведен алгоритм, про который доказано что он асимптотически лучший.
|
|||
47
Torquader
17.08.13
✎
01:04
|
(46) Так я и не претендую на лучший.
Для реализации достаточно, чтобы алгоритм был понятный. P.S. если переходить к тетраэдрам и плоскостям, то можно и в объёме также действовать. |
|||
48
Лодырь
17.08.13
✎
10:38
|
Уважаемые, а вы таки смогли понять чего хочет топикстартер указывая что он хочет "обтянуть крайние точки, а не просто выделить крайние". Потому что не будет однозначного решения в его случае.
Какой из вариантов больше нравится топикстартеру в случае всего лишь 5 точек? http://screencast.com/t/OpDlGQ8FGmzl |
|||
49
Torquader
17.08.13
✎
11:08
|
(48) Крайние точки - фигура должна быть выпуклой, то есть решение однозначно.
Конечно, если допустить невыпуклые фигуры, тогда все точки получаются крайними, так как их множество дискретно. |
|||
50
Лодырь
17.08.13
✎
12:38
|
(49) Читай (21) и смотри (27). Там ясно написано, что он хочет не обязательно выпуклую оболочку ) А критериев не приводится. Сдается мне что ему придется копать в сторону разделов кластерного анализа, а именно построения оболочек кластера (cluster hull)
|
|||
51
NS
17.08.13
✎
13:05
|
(50) Если он сам не знает чего хочет - никто помочь не сможет.
|
|||
52
Torquader
17.08.13
✎
16:46
|
(51) Видимо, он хочет не "множество", а оптимальный маршрут, чтобы посетить всех клиентов, но это совершенно другая задача.
В принципе, если грамотно поставить критерии "правильности" и решать задачу на экстремум функционала, то решение будет найдено. |
|||
53
ИС-2
naïve
28.08.13
✎
14:16
|
сделал по принципу черного ящика. Использовал пакет R.
Вот сценарий для выполнения: X<-read.table("//1c/Coordinates/InPutCoord.txt", dec=",", sep = "\t") #X<-read.table("D:/R/InPutCoord.txt", dec=",", sep = "\t") as.matrix(X) chull(as.matrix(X)) Y<-chull(as.matrix(X)) write(Y, "//1c/Coordinates/ExtremeCoord.txt", 1) |
|||
54
acsent
28.08.13
✎
14:21
|
(53) почему Chull?
|
|||
55
ИС-2
naïve
28.08.13
✎
14:33
|
(54) потому, что сказали использовать chull . Вот так.
Что еще можно использовать? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |