:: Игры Разума
Re: Поиск ближайшей точки
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Goodwin
Кстати, про ошибки в алгоритмах: пока они выдают одинаковые результаты
Тут Вы ошибаетесь. Запустите несколько раз, алгоритм paul иногда выдает другие результаты, что впрочем не удивительно, если к нему присмотреться (ведь модуль разности векторов и разность модулей - это не одно и то же).
А вот в этом, специально построенном примере, уже Игоря метод выдает другой результат.
set Deleted off
_screen.FontSize=7
clear
rand(-1)
create cursor points (PointId i, coordX i, coordY i, ds b)
*!* for lnRow=1 to 10^5
*!* insert into points values (lnRow, rnd(), rnd(), 0)
*!* endfor
insert into points values (1, 7*1024, 7*1024, 0)
insert into points values (2, 9*1024, 0, 0)
replace all ds with sqrt(coordX^2+coordY^2)
index on ds tag ds
index on bintoc(coordx)+bintoc(coordy) tag xy
index on CoordX tag x
index on CoordY tag y
nDeltaStart=1024
nDeltaStep=8
nPointX=0
nPointY=0
*!* nPointX=rnd()
*!* nPointY=rnd()
nDS=sqrt(nPointX^2+nPointY^2)
for i=1 to 2
scan1()
scan1()
Igor()
Igor()
Goodwin()
Goodwin()
Paul()
Paul()
endfor
function rnd
return 2000000*(rand()-.5)
function Igor
s=seco()
lnDelta=nDeltaStart
do while _tally=0 or lnDelta=nDeltaStart
lnDelta=lnDelta*nDeltaStep
select * from points ;
where CoordX between nPointX-lnDelta and nPointX+lnDelta ;
and CoordY between nPointY-lnDelta and nPointY+lnDelta ;
into cursor OutCrs nofilter
enddo
lnMinDistance=-1
lnMinPointId=0
scan
lnDistance=d()
if lnDistance<lnMinDistance or lnMinPointId=0
lnMinDistance=lnDistance
lnMinPointId=pointId
endif
endscan
use in OutCrs
sele points
?'igor', lnMinPointId, lnMinDistance, seco()-s
endfunc
function Paul
s=seco()
lnDelta=nDeltaStart
lnMinDistance=-1
lnMinPointId=0
set Order To ds
set Near on
do while lnMinPointId=0 or lnMinDistance>lnDelta
seek nDS-lnDelta
scan rest while ds<=nDS+lnDelta
lnDistance=d()
if lnDistance<lnMinDistance or lnMinPointId=0
lnMinDistance=lnDistance
lnMinPointId=pointId
endif
endscan
lnDelta=lnDelta*nDeltaStep
enddo
set Near off
?'paul', lnMinPointId, lnMinDistance, seco()-s
endfunc
function scan1
lnMinDistance=-1
lnMinPointId=0
s=seco()
set Order To
scan
lnDistance=d()
if lnMinDistance=-1 or lnDistance<lnMinDistance
lnMinDistance=lnDistance
lnMinPointId=PointId
endif
endscan
?'scan', lnMinPointId, lnMinDistance, seco()-s
endfunc
function goodwin
s=seco()
set Near On
set Order To xy
seek bintoc(nPointX)
seek bintoc(coordx)+bintoc(nPointY)
lnMinDistance=d()
lnMinPointId=pointId
seek bintoc(nPointX-lnMinDistance)
scan rest while coordX<=nPointX+lnMinDistance
lnDistance=d()
if lnDistance<lnMinDistance
lnMinDistance=lnDistance
lnMinPointId=pointId
endif
endscan
set Near off
?'goodwin', lnMinPointId, lnMinDistance, seco()-s
endfunc
function d
return sqrt((nPointX-coordX)^2+(nPointY-coordY)^2)
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Владимир Максимов
Я на эти "грабли" тоже радостно налетел. В смысле - идея хорошая, но надо поправить. А идея в корне не верна!
Нет, идея верна, ее именно что надо подправить. Квадраты лучше кругов тем, что позволяют для отбора содержащихся в нем точек использовать заранее созданные индексы. Нужно таким способом найти минимальный квадрат, в котором есть точка, описать вокруг него круг. В нем заведомо будет точка, на которой достигается минимум. Затем надо вокруг этого круга описать еще один квадрат. Его сторона будет в sqrt(2) раз больше стороны первого квадрата и минимальная точка будет заведомо внутри него. Отбираем все точки внутри этого квадрата (с помощью того же индекса!) и далее уже используем перебор.
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
PaulWist
Хорошо, чем численное решение непрерывной ф-ии будет отличаться от решения когда есть дискреты приращения по X и Y, только одним - величиной приращения, по другому не бывает - это численное решение, а не аналитическое.
В градиентном методе вычисляются частные производные в заданных точках, на основании которых определяется, в какую сторону и какой величины сделать шаг. Он вовсе не обязан попадать в какую-либо заранее определенную сетку. Он может попасть в любую точку. Там сетки, как таковой, вообще нет.

Цитата:
Согласен, не единственно возможный, НО единственный дающий однозначное решение во всей области определения.
Вовсе не единственный. Метод, который я описал в предыдущем посте, тоже дает однозначное решение, но не предполагает полного перебора.
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
leonid
PaulWist
Хорошо, чем численное решение непрерывной ф-ии будет отличаться от решения когда есть дискреты приращения по X и Y, только одним - величиной приращения, по другому не бывает - это численное решение, а не аналитическое.
В градиентном методе вычисляются частные производные в заданных точках, на основании которых определяется, в какую сторону и какой величины сделать шаг. Он вовсе не обязан попадать в какую-либо заранее определенную сетку. Он может попасть в любую точку. Там сетки, как таковой, вообще нет.
...

Леонид.

Как в градиентном методе на основе экспериментальных (дискретных) точек строится функционал - обычно методом МНК, те задаётся вид полинома и вычисляются его коэффициенты, это первое.

Второе, от гипотизы полинома зависит совпадут ли значения в узловых точках с заданной точностью, в простейшем случае применяют кусочно-линейную апроксимацию, те между точками строится "прямая-плоскость-итп".

Поэтому, тангенс угла наклона будет определяться узловыми точками, собственно "нафига" вычислять градиент с шагом меньше чем шаг узлов - это только создавать себе трудности полагаясь на правильность гипотезы.

Более того, принятие решения о направлении движения больше узлового диапазона - это уже фактически метод случайного поиска.

Частные производные я намереннно не упоминал, поскольку принцип от этого не меняется, только возникают дополнительные тонкости в виде пространственных "сёдел" итп, кстати и в одномерном можно получить "седло".

leonid
Цитата:
Согласен, не единственно возможный, НО единственный дающий однозначное решение во всей области определения.
Вовсе не единственный. Метод, который я описал в предыдущем посте, тоже дает однозначное решение, но не предполагает полного перебора.

Ссылку приведи.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
PaulWist
leonid
PaulWist
Хорошо, чем численное решение непрерывной ф-ии будет отличаться от решения когда есть дискреты приращения по X и Y, только одним - величиной приращения, по другому не бывает - это численное решение, а не аналитическое.
В градиентном методе вычисляются частные производные в заданных точках, на основании которых определяется, в какую сторону и какой величины сделать шаг. Он вовсе не обязан попадать в какую-либо заранее определенную сетку. Он может попасть в любую точку. Там сетки, как таковой, вообще нет.
...

Леонид.

Как в градиентном методе на основе экспериментальных (дискретных) точек строится функционал - обычно методом МНК, те задаётся вид полинома и вычисляются его коэффициенты, это первое.

Второе, от гипотизы полинома зависит совпадут ли значения в узловых точках с заданной точностью, в простейшем случае применяют кусочно-линейную апроксимацию, те между точками строится "прямая-плоскость-итп".

Поэтому, тангенс угла наклона будет определяться узловыми точками, собственно "нафига" вычислять градиент с шагом меньше чем шаг узлов - это только создавать себе трудности полагаясь на правильность гипотезы.

Более того, принятие решения о направлении движения больше узлового диапазона - это уже фактически метод случайного поиска.

Частные производные я намереннно не упоминал, поскольку принцип от этого не меняется, только возникают дополнительные тонкости в виде пространственных "сёдел" итп, кстати и в одномерном можно получить "седло".

Метод градиентного спуска


Цитата:
leonid
Цитата:
Согласен, не единственно возможный, НО единственный дающий однозначное решение во всей области определения.
Вовсе не единственный. Метод, который я описал в предыдущем посте, тоже дает однозначное решение, но не предполагает полного перебора.

Ссылку приведи.
Собственно "в предыдущем посте" это и была ссылка.
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Леонид, ты совершенно прав, просто туго соображаю в 2 часа ночи.
1) Отсекать нужно именно квадрат, а не прямоугольник. потому что...
2) После отсечения квадрата искать нужно ТОЛЬКО внутри вписанного в него круга (ну или чуть перефразируя - принимать в расчёт только те точки, для которых расстояние до искомой <=Delta) - т.к. действительно точки в "углах" квадрата могут быть не ближайшими.
3) Если в результате "поиска в круге" ничего не найдено, то следующий шаг должен быть в умножении Delta на SQRT(2) - т.е. переходим к "описанной" окружности и соответсвенно описанному вокруг этой описанной окружности квадрату - в нём уже гарантировано будут точки. Альтернативно (и чуть более оптимально) - таки определить на шаге 2 минимальное расстояние внутри квадрата (всей его площуди полностью), НО если это расстояние окажется > Delta то расшиить квадрат поиска до величины этого расстояния (т.е. добавить те "потенциальные" области вне первого квадрата) в которых могут быть более оптимальные точки.
Замечание насчёт Locate принимается - да, это может дать очень неплохой выигрыш - более того, можно улучшить алгоритм, проводя после "нахождения" точек внутри квадрата несколько операций "уменьшения" квадрата поиска - причём сами коэффициенты как "расширения" так и "сужения" области поиска можно подбирать - не обязательно именно "удваивать" размер - я даже склоняюсь к увеличению дельты более чем в 2 раза за шаг - а то в моём примере пришлось проводить 11 расширений зоны поиска, прежде чем был найден первый "непустой" квадрат.


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 02.03.10 15:34
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Вот полный вариант этой идеи.
#DEFINE DEBUG_OUT
#DEFINE START_DELTA 1
#DEFINE DELTA_GROWTH 4
#DEFINE DELTA_REDUCTION 0.7
LOCAL lnSec
lnSec = SECONDS()
? SearchI(50000,1000), SECONDS() - m.lnSec
FUNCTION SearchI (tnX, tnY)
LOCAL lnOldSelect, lnDelta, lnDelta2, lnRes
lnOldSelect = SELECT()
SELECT Points
lnDelta = START_DELTA
#IFDEF DEBUG_OUT
? "Start lnDelta:", m.lnDelta
#ENDIF
LOCATE FOR BETWEEN(x, m.tnX-m.lnDelta, m.tnX+m.lnDelta) AND ;
BETWEEN(Y, m.tnY-m.lnDelta, m.tnY+m.lnDelta)
DO WHILE !FOUND("Points")
lnDelta = MIN(INT(m.lnDelta*DELTA_GROWTH), 2^31)
#IFDEF DEBUG_OUT
? "Square growth lnDelta:", m.lnDelta
#ENDIF
LOCATE FOR BETWEEN(x, m.tnX-m.lnDelta, m.tnX+m.lnDelta) AND ;
BETWEEN(Y, m.tnY-m.lnDelta, m.tnY+m.lnDelta)
ENDDO
lnDelta2 = m.lnDelta
DO WHILE FOUND("Points") AND m.lnDelta > 1
lnDelta = m.lnDelta2
lnDelta2 = FLOOR(m.lnDelta*DELTA_REDUCTION)
#IFDEF DEBUG_OUT
? "Square reduction lnDelta2:", m.lnDelta2
#ENDIF
LOCATE FOR BETWEEN(x, m.tnX-m.lnDelta2, m.tnX+m.lnDelta2) AND ;
BETWEEN(Y, m.tnY-m.lnDelta2, m.tnY+m.lnDelta2)
ENDDO
* lnDelta гарантировано содержащий точку квадрат
#IFDEF DEBUG_OUT
? "Stage 1 square lnDelta:", m.lnDelta
#ENDIF
SELECT * FROM Points ;
WHERE x BETWEEN m.tnX-m.lnDelta AND m.tnX+m.lnDelta ;
AND Y BETWEEN m.tnY-m.lnDelta AND m.tnY+m.lnDelta ;
INTO CURSOR t1 NOFILTER
#IFDEF DEBUG_OUT
? "Points in stage 1 square:", _TALLY
#ENDIF
SELECT TOP 1 *, ;
SQRT((m.tnX-x)^2+(m.tnY-Y)^2) Distance ;
FROM t1 ;
INTO CURSOR t2 ;
ORDER BY Distance
IF t2.Distance < m.lnDelta
#IFDEF DEBUG_OUT
? "Solution found in stage 1 square:", t2.ID, t2.x, t2.Y, t2.Distance
#ENDIF
lnRes = t2.ID
ELSE
#IFDEF DEBUG_OUT
? "Suboptimal solution found in stage 1 square:", t2.ID, t2.x, t2.Y, t2.Distance
#ENDIF
lnDelta = CEILING(t2.Distance)
#IFDEF DEBUG_OUT
? "Stage 2 square lnDelta:", m.lnDelta
#ENDIF
SELECT * FROM Points ;
WHERE x BETWEEN m.tnX-m.lnDelta AND m.tnX+m.lnDelta ;
AND Y BETWEEN m.tnY-m.lnDelta AND m.tnY+m.lnDelta ;
INTO CURSOR t1 NOFILTER
#IFDEF DEBUG_OUT
? "Points in stage 2 square:", _TALLY
#ENDIF
SELECT TOP 1 *, ;
SQRT((m.tnX-x)^2+(m.tnY-Y)^2) Distance ;
FROM t1 ;
INTO CURSOR t2 ;
ORDER BY Distance
#IFDEF DEBUG_OUT
? "Solution found in stage 2 square:", t2.ID, t2.x, t2.Y, t2.Distance
#ENDIF
lnRes = t2.ID
ENDIF
USE IN SELECT("t2")
USE IN SELECT("t1")
SELECT (m.lnOldSelect)
RETURN m.lnRes
ENDFUNC
Из существенным минусов - вырождается в 2 полных сканирования (что есть очень, очень медленно), если задать координаты заведомо далеко от области где есть точки (при том "по диагонали" от области с точками), например (-1e8, -1e8) при нахождении точек только в положительных координатах. Причём, как я понимаю, побороть этот эффект при данном алгоритме невозможно в принципе (если первый квадрат "захватит" ровно точку 0,0 - она окажется в самом углу этого квадрата, и потому по определению будет субоптимальной - т.е. придётся расширять область поиска - а такое "расширение" по сути есть *SQRT(2), что включит в облать поиска огромный массив точек - даже возможно их все).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
В дополнение: на обработке "второго квадрата" можно сэкономить, если рассматривать не все его точки, а только "новые" - т.е. добавив в условие отбора AND id NOT IN (SELECT id FROM t2) - но при этом конечно же надо заполнить результат поиска в первом квадрате и сравнивать с ним... Хотя для "равномерно" заполненного поля и поиска внутри этого поля по идее существенного выигрыша не будет - там и так немного точек попадает в квадрат.
Плюс к тому алгоритм находит лишь первую подходящую точку - можно его чуть изменить, чтобы он находил ВСЕ "равноудалённые".


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
leonid
PaulWist
leonid
PaulWist
Хорошо, чем численное решение непрерывной ф-ии будет отличаться от решения когда есть дискреты приращения по X и Y, только одним - величиной приращения, по другому не бывает - это численное решение, а не аналитическое.
В градиентном методе вычисляются частные производные в заданных точках, на основании которых определяется, в какую сторону и какой величины сделать шаг. Он вовсе не обязан попадать в какую-либо заранее определенную сетку. Он может попасть в любую точку. Там сетки, как таковой, вообще нет.
...

Леонид.

Как в градиентном методе на основе экспериментальных (дискретных) точек строится функционал - обычно методом МНК, те задаётся вид полинома и вычисляются его коэффициенты, это первое.

Второе, от гипотизы полинома зависит совпадут ли значения в узловых точках с заданной точностью, в простейшем случае применяют кусочно-линейную апроксимацию, те между точками строится "прямая-плоскость-итп".

Поэтому, тангенс угла наклона будет определяться узловыми точками, собственно "нафига" вычислять градиент с шагом меньше чем шаг узлов - это только создавать себе трудности полагаясь на правильность гипотезы.

Более того, принятие решения о направлении движения больше узлового диапазона - это уже фактически метод случайного поиска.

Частные производные я намереннно не упоминал, поскольку принцип от этого не меняется, только возникают дополнительные тонкости в виде пространственных "сёдел" итп, кстати и в одномерном можно получить "седло".

Метод градиентного спуска


...

И-и-и что, это я изучал в 1981 -82г в курсе вычислительной математики (смотрика, ещё кое что помню из "верхней" школы )

В чем противоречие между моими словами и приведенной ссылкой?

А так же, чем отличается ЧИСЛЕННОЕ "решение" градиента для непрерывной ф-ии и для ф-ии заданной дискретами?


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
PaulWist
И-и-и что, это я изучал в 1981 -82г в курсе вычислительной математики (смотрика, ещё кое что помню из "верхней" школы )
Да. Кое что...

Цитата:
А так же, чем отличается ЧИСЛЕННОЕ "решение" градиента для непрерывной ф-ии и для ф-ии заданной дискретами?
Для "ф-ии заданной дискретами" (заметим, что в нашем случае - это совершенно произвольное множество точек, без какой либо сетки и какого либо шага) метод градиентного спуска, который Вы называете '"решение" градиента', вообще не определен, поскольку для таких функций не определено понятие градиента, да и экстремума, кстати, тоже.

Цитата:
В чем противоречие между моими словами и приведенной ссылкой?

Вот в этом и состоит. Но если после прочтения ссылки это все еще не понятно, то подумайте, как Вы будете считать частные производные для таких функций, хотя бы приближенно?
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
leonid
Цитата:
А так же, чем отличается ЧИСЛЕННОЕ "решение" градиента для непрерывной ф-ии и для ф-ии заданной дискретами?
Для "ф-ии заданной дискретами" (заметим, что в нашем случае - это совершенно произвольное множество точек, без какой либо сетки и какого либо шага) метод градиентного спуска, который Вы называете '"решение" градиента', вообще не определен, поскольку для таких функций не определено понятие градиента, да и экстремума, кстати, тоже.

Строго говоря ДА.

Но ищем-то мы численным методом, те берём начальную точку (в ней значение ф-ии известно), берём приращение, вычисляем в нём значение ф-ии, ищем градиент, делаем новый шаг, проверяем на min/max.

В простейшем случае кусочно-линейная апроксимация, где фактически градиент уже определён, приращения известны, значение ф-ии известно.

leonid
Цитата:
В чем противоречие между моими словами и приведенной ссылкой?

Вот в этом и состоит. Но если после прочтения ссылки это все еще не понятно, то подумайте, как Вы будете считать частные производные для таких функций, хотя бы приближенно?

А как будет считаться частная производная для аналитической ф-ии и чем этот расчет в принципе будет отличаться от заданных дискретов (только шагом приращения)?


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата регистрации: 03.05.2006
Игорь, в реальной задаче искомая точка будет не сильно далеко от существующих, так что алгоритм в самый раз.

Но зачем уменьшать квадрат?
Время на уменьшение тратится больше,
чем на перебор всего квадрата.

А для того, что б искомая точка точно оказалась в квадрате
достаточно после находжения хоть одой точки
увеличить delta на sqrt(2).

И, да, важно сбросить индекс с points перед locate

В этом варианте скорость поиска увеличивается на 20-40%:
FUNCTION SearchI3 (tnX, tnY)
local laRes(1), lnDelta
lnDelta = START_DELTA
LOCATE FOR BETWEEN(x, m.tnX-m.lnDelta, m.tnX+m.lnDelta) AND ;
BETWEEN(Y, m.tnY-m.lnDelta, m.tnY+m.lnDelta)
DO WHILE !FOUND()
lnDelta = MIN(INT(m.lnDelta*DELTA_GROWTH), 2^31)
LOCATE FOR BETWEEN(x, m.tnX-m.lnDelta, m.tnX+m.lnDelta) AND ;
BETWEEN(Y, m.tnY-m.lnDelta, m.tnY+m.lnDelta)
ENDDO
m.lnDelta=ceil(m.lnDelta*sqrt(2))
SELECT id, (x-m.tnX)^2+(y-m.tnY)^2 FROM Points ;
WHERE x BETWEEN m.tnX-m.lnDelta AND m.tnX+m.lnDelta ;
AND Y BETWEEN m.tnY-m.lnDelta AND m.tnY+m.lnDelta ;
order by 2 top 1 INTO array laRes
RETURN laRes(1)


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
PaulWist
Строго говоря ДА.
Кстати, в математике как раз и принято говорить строго.

Цитата:
где фактически градиент уже определён
Не определен он там и в помине.

Цитата:
А как будет считаться частная производная для аналитической ф-ии и чем этот расчет в принципе будет отличаться от заданных дискретов (только шагом приращения)?
Простите, а Вы знаете хотя бы, что такое аналитическая функция?
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
leonid
Не определен он там и в помине.

X Y

1 1
2 2
4 4
3 3
0 0

X - аргумент, Y значение ф-ии, как думаете известен ли тангенс угла наклона (градиент) для ф-ии проходящей через эти точки и можно ли для нахождения экстремума использовать градиент

leonid
Цитата:
А как будет считаться частная производная для аналитической ф-ии и чем этот расчет в принципе будет отличаться от заданных дискретов (только шагом приращения)?
Простите, а Вы знаете хотя бы, что такое аналитическая функция?

Э-э-э, определение не помню, можно посмотреть в инете, но лень

Хорошо, переформулирую вопрос:

А как будет считаться частная производная для ф-ии заданной в аналитическом виде и чем этот расчет в принципе будет отличаться от заданных дискретов.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
PaulWist
тангенс угла наклона (градиент)
Увы. Тангенс угла наклона - это скаляр, а градиент - вектор. Нельзя путать скаляры и векторы. Два балла. Переэкзаменовка осенью.
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
leonid
PaulWist
тангенс угла наклона (градиент)
Увы. Тангенс угла наклона - это скаляр, а градиент - вектор. Нельзя путать скаляры и векторы. Два балла. Переэкзаменовка осенью.

Это справедливо

В приведенном примере это роли не играет, тангенс угла наклона умноженный на единичный вектор даст градиент.

Ладно, спасибо за реплики, до осени


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Вообще градиент определяется для функций от двух и более переменных. И метод градиентного спуска именно для таких используется. И шаг там делается не вдоль координатных линий (это метод покоординатного спуска), а под углом, который определяется градиентом. Если функция определена на сетке, то шагая под произвольным углом в узел сетки фиг попадешь. На сетке другие методы используют. А вот для поиска минимума функции, заданной на произвольном дискретном множестве (как в нашем случае), думаю, кроме полного перебора, вообще никакой теории не существует. Хоть это вовсе не означает, что в каждом конкретном случае нельзя найти что-нибудь получше.
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Квадрат уменьшать не обязательно, но в зависимости от таблицы это может дать большой выигрыш. Другое дело КАК его уменьшать - мне было лень изобретать какой-нить "метод половинного деления" или ещё чего для обратного уменьшения - а вот коэффициент подобрать - это да, это имеет смысл - 0.7 слишком плохой, всего на 1 шаг его хватит, 0.8 и то лучше...
Зачем это вообще нужно - формально для уменьшения пространства "перебираемых" точек. Более "человеческим" языком - на примере. Предположим, что ближайшая точка от искомой расположена в квадрате с "полу-шириной" 1025 единиц - более того, расположена она именно на расстоянии 1025 единиц (т.е. она есть оптимум). Если мы начинали поиск с 1 и "удваивали" дельту, то "найдём" мы её на 12 шаге, в квадрате "полушириной" 2048 единиц. Вполне может оказаться, что в таком большом квадрате будет несколько тысяч точек, тогда как в квадрате размером скажем 1050 (всего-то 3 шага редукции с коэффициентом 0.8) точек будет всего пару штук. Если же отказаться заодно и от 2-х ступенчатого поиска, а сразу перейти к квадрату размером Delta*SQRT(2) что уже составит 2900 точек. Уменьшая размер квадрата поиска, мы тем самым уменьшаем количество точек подвергаемых перебору!
Всё это исходит из той особенности, что LOCATE по полностью оптимизируемому условию работает быстрее как отбора по этому условию, так и конечно же последующей проверки "лишних" точек - в случае если под условие попадает не 1-2, а скажем порядка тысячи точек.
Конечно же если у нас "идеально равномерное" заполнение поверхности, то это не играет особой роли (если до шага N ничего не было найдено, то маловероятно что на шаге N будет найдено сразу много тысяч точек) - но вот если на поверхности есть "скопления точек" и есть достаточно большие "совершенно пустые" области - тогда этот шаг будет не лишним - в худшем случае он ничего не изменит, зато в "лучшем" он "уполовинит" плотное скопление точек. А цена - всего-то 2-3 очень быстрых поиска (по сути проверки).

P.S. Про индекс - точнее про то, что в момент работы процедуры поиска НЕ должно быть никакого активного тега - это совершенно верное уточнение - иначе LOCATE будет уже не таким "мгновенным"...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата регистрации: 03.05.2006
Логично.
Экспериментировал с равномерно заполненными полями
и поэтому не подумал о возможности "кучкования".

Думаю, можно считать задачу решённой.
Всем спасибо за идеи и замечания.
Игорю отдельное спасибо.


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер




Исправлено 1 раз(а). Последнее : Goodwin, 04.03.10 11:16
Ratings: 0 negative/0 positive
Re: Поиск ближайшей точки
medstrax
Забанен

Сообщений: 5964
Дата регистрации: 23.03.2007
Приведенное решение конечно замечательно. Но, как выяснилось, и близко не лежало рядом с теорией.Когда я говорил о предварительном нахождении областей, содержащих точки, расстояние от которых до заданной точки минимально по сравнению с расстояниями до других точек множества - мысль была оказывается в нужном направлении, это так называемые многоугольники Вороного. С их помощью по теории данная задача - "задача о поиске ближайшего соседа" - решается оптимальным образом. Интересующихся отсылаю к книге "Вычислительная геометрия:введение" Ф.Препарата, М.Шеймос, глава 5
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 16 (Гостей: 16)

© 2000-2024 Fox Club 
Яндекс.Метрика