Имя: Пароль:
IT
 
Алгоритм поиска крайних точек среди множества
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
кто-то использовал пакет R http://cran.gis-lab.info/

хочу его приспособить для задачи
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
(27) Август... Опытные телепяты - лечатся от жары на пляжах Египта.
jsmith82 и vde69 уже кучу алгоритмов предложили. Но, видать, телепатией они не страдают.
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 . Вот так.

Что еще можно использовать?