Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
1

Карта высоты

06.01.2013, 18:36. Показов 669. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте

Есть ф-ция
C++
1
float GetZ( int xi, int yi )
Которая принимает 2 целых числа и возвращает значение высоты (z-координату)
И дана точка P как 3 float числа (xf, yf, zf)

Нужно найти такие xi, yi для которых расстояние до точки P минимально
Min((xf - xi)^2 + (yf - yi)^2 + (zf - GetZ(xi, yi))^2)

Можно кэшировать Z, создавать любые доп данные, деревья и.т.п. Если вещь известная - буду благодарен за ссылки на теорию

Спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.01.2013, 18:36
Ответы с готовыми решениями:

Определение высоты треугольника
Здравствуйте. Дано задание составить блок-схему по задаче. Задача ниже. Определить высоту...

Посоветуйте алгоритм нахождения максимальной высоты
Есть STL-файл (информация о фигуре в нём хранится в виде координат вершин треугольников). Пример:...

AVL-деревья - не вижу высоты у деревьев
Почему тут: type AVLTree = ^AVLNode; AVLNode = record key: key_type; left:...

Какое количество топлива необходимо для спуска с высоты A до высоты B
Имя входного файла | input.txt ...

9
419 / 381 / 163
Регистрация: 03.01.2013
Сообщений: 966
11.01.2013, 18:28 2
Вам нужно посмотреть литературу по численным методам оптимизации.
В математическом виде Ваша задача есть задача минимизации функции многих переменных без ограничений.
Есть так называемые методы нулевого порядка - методы Нелдера-Мида, Хука-Дживса и др., методы первого порядка - градиентный спуск и пр.
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
11.01.2013, 19:48  [ТС] 3
Цитата Сообщение от monochromer Посмотреть сообщение
Вам нужно посмотреть литературу по численным методам оптимизации.
В математическом виде Ваша задача есть задача минимизации функции многих переменных без ограничений.
Есть так называемые методы нулевого порядка - методы Нелдера-Мида, Хука-Дживса и др., методы первого порядка - градиентный спуск и пр.
Меня интересует не сам "факт нахождения" а скорость его выполнения, т.е. создание эффективных структур данных для поиска. Если "просто найти" - мне достаточно перебрать все значения ф-ции в "окне" по x/y (размер окна легко вычисляется). Однако это неприемлемо медленно.

Обратите внимание что xi, yi - целые числа, значения ф-ции в узлах может быть предрасчитано.
0
419 / 381 / 163
Регистрация: 03.01.2013
Сообщений: 966
12.01.2013, 01:13 4
Я, конечно, не вчитывался, но есть, например, монография Хохлюк "ПАРАЛЛЕЛЬНЫЕ АЛГОРИТМЫ ЦЕЛОЧИСЛЕННОЙ
ОПТИМИЗАЦИИ".
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
12.01.2013, 03:00  [ТС] 5
Цитата Сообщение от monochromer Посмотреть сообщение
Я, конечно, не вчитывался, но есть, например, монография Хохлюк "ПАРАЛЛЕЛЬНЫЕ АЛГОРИТМЫ ЦЕЛОЧИСЛЕННОЙ ОПТИМИЗАЦИИ".
Ага, целые числа - вот книжка с подходящим названием Было бы конечно прекрасно если бы порылся в книжках/гугле - и нужный алгоритм нашелся. Но вот почему-то так бывает не всегда...
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4300 / 2091 / 431
Регистрация: 19.07.2009
Сообщений: 3,162
Записей в блоге: 24
12.01.2013, 03:04 6
Мне не понятно, почему эта задача не может решаться так же, как задача минимизации функции
Код
F(xi,yi) = (xf - xi)^2 + (yf - yi)^2 + (zf - GetZ(xi, yi))^2
Если функция GetZ является тяжелой, то вычисление F будет занимать столько же времени, сколько и GetZ. Тогда ведь уже не будет так принципиально, какой вид имеет функция F(xi,yi), кроме, может быть, того факта, что
F(x,y) > R^2 при (x-xf)^2 + (y-yf)^2 > R^2, где R = zf - GetZ(xf,yf),
посему можно искать минимум только в R-окрестности точки (xf,yf).

Если R мало (~10 точек), то можно рассчитать значение F в каждом из (2R)^2 точек около (xf,yf) и выбрать наименшую. Просто, не очень напряжно.

А если R велико, то тогда лучше сделать упор на минимизации числа точек, в которых производится рассчёт F (или GetZ). Тогда, как я понимаю, вся существенная оптимизация будет заключена в выборе наиболее оптимального метода поиска минимума. Я не прав?

Пример
Пусть задана поверхность
Код
GetZ(x,y) = K * Abs(x)
и пусть рассматриваем K=1000, xf=yf=0, zf=1000.
Тогда F(xf,yf)=zf^2 = 1 000 000.
Для человека задача решается просто: достаточно «повернуть» фигуру на угол arctg(K), чтоб поверхность стала горизонтальной, и посчитать расстояние до точки с теми же самыми (x,y) в повёрнутой системе координат.

А сколько действий нужно машине, чтоб отыскать эту точку?
P.S. для указанных параметров расстояние будет меньше 1.
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
12.01.2013, 03:42  [ТС] 7
Цитата Сообщение от Mysterious Light Посмотреть сообщение
F(x,y) > R^2 при (x-xf)^2 + (y-yf)^2 > R^2, где R = zf - GetZ(xf,yf),
посему можно искать минимум только в R-окрестности точки (xf,yf).
Лучше искать не в окрестности, а начиная от (int(xf), int(yf)). Тогда находя меньший радиус можно сужать окно. Впрочем проблему это не решает

Цитата Сообщение от Mysterious Light Посмотреть сообщение
Если R мало (~10 точек), то можно рассчитать значение F в каждом из (2R)^2 точек около (xf,yf) и выбрать наименшую. Просто, не очень напряжно.
Не сказал бы (400 вызовов GetZ). Это было бы просто и хорошо для единичного расчета. Но этот поиск - базовая операция которая должна выполняться миллионы раз (для разных точек P). Да и начальный радиус может быть не 10 а напр 100.

Цитата Сообщение от Mysterious Light Посмотреть сообщение
А если R велико, то тогда лучше сделать упор на минимизации числа точек, в которых производится рассчёт F (или GetZ). Тогда, как я понимаю, вся существенная оптимизация будет заключена в выборе наиболее оптимального метода поиска минимума. Я не прав?
Неясно в чем эта оптимальность (откуда Вы ее возьмете). Попытки получить какую-то аналитику GetZ ни к чему не ведут - эта ф-ция не аналитическая. Очевидно надо как-то кешировать, но пока не знаю как
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4300 / 2091 / 431
Регистрация: 19.07.2009
Сообщений: 3,162
Записей в блоге: 24
12.01.2013, 04:06 8
Цитата Сообщение от Igor3D Посмотреть сообщение
Не сказал бы (400 вызовов GetZ). Это было бы просто и хорошо для единичного расчета. Но этот поиск - базовая операция которая должна выполняться миллионы раз (для разных точек P). Да и начальный радиус может быть не 10 а напр 100.
Под R понимается zf-GetZ(xf,yf).
Уточню: Вам необходимо для каждой пары целых чисел (xf,yf) найти пару целых чисел (xi,yi), минимизирующих расстояние F(xi,yi)?

Цитата Сообщение от Igor3D Посмотреть сообщение
Неясно в чем эта оптимальность (откуда Вы ее возьмете). Попытки получить какую-то аналитику GetZ ни к чему не ведут - эта ф-ция не аналитическая. Очевидно надо как-то кешировать, но пока не знаю как
Пусть известно, что GetZ(x,y) от y не зависит, тогда расстояние есть функция одного аргумента F(x) = x^2 + (zf-GetZ(x,yf))^2.
Пусть к тому же R=zf-GetZ(xf,yf) >> 1000 и пусть известно, что производная GetZ меняется слабо на расстояниях порядка R.
Для такой одномерной задачи можно применить метод дихотомии:
Берём точки x1=xf-R и x2=xf+R в качестве опорных, считаем значение в них, а также значение в xm=(x1+x2)/2=xf. Выбираем один из двух отрезков, в котором минимум.
Повторяем шаг: берём среднюю точку, считаем GetZ и F, выбираем один из 2 отрезков, где лежит минимум.
Для точности 1, которой нам достаточно, чтоб определить целое xi, достаточно совершить log2(R) шагов, то есть вычислить всего log2(R) раз функцию GetZ на разных аргументах. Это лучше, чем считать R точек Вашим методом, то есть вызывать GetZ R раз.
Условие на производную накладнываются для того, чтобы не попасть в локальный минимум, что является характерной проблемой дихотомии. Я не знаю, с какими поверхностями Вы работаете, но нарушения этого правила может быть для сильно волнистых и искаженных поверхностей.
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
12.01.2013, 15:49  [ТС] 9
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Под R понимается zf-GetZ(xf,yf).
Уточню: Вам необходимо для каждой пары целых чисел (xf,yf) найти пару целых чисел (xi,yi), минимизирующих расстояние F(xi,yi)?
Аттач: постановка в виде картинки. К какой вершине (вертексу) ближе всего красный шарик?

Модель гор (карта высоты) создана с постоянным шагом по x, y и фиксирована. Для каждого запроса своя точка флоты (xf, yf. zf). Однако предположения о том что высота (z) меняется достаточно медленно, имеет известное кол-во максимумов и.т.п. - ничего этого нет
Миниатюры
Карта высоты  
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
13.01.2013, 12:16  [ТС] 10
Дополнительные детали

Проблема в том что стандартные деревья (напр BSP, AABB, и др) в данной ситуации работают плохо, медленно. Вот если бы ввести доп ограничение, напр "ближайший на расстоянии не большем D" - тогда все сводится "к известным образцам". Но взять достаточно малый D в задаче негде. Приходится брать первый, если он велик, то дерево не может отсечь ноды. Скорость гораздо хуже пресловутого логарифма
0
13.01.2013, 12:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.01.2013, 12:16
Помогаю со студенческими работами здесь

Найти координаты основания высоты, уравнения стороны, высоты, медианы
A(2,-3), B(17,-3), C(11,15) Найти a) координаты основания высоты BD треугольника ABC б) найти...

Вычислить, какое количество единиц топлива необходимо для спуска шара с высоты B до высоты A
Полетав немного на модифицированном воздушном шаре, Шурик отметил неприятную вещь: шар всегда...

Автоматическое изменение высоты сразу нескольких элементов управления при изменении высоты формы
Здравствуйте! Подскажите пожалуйста, возможно ли настроить автоматическре изменение высоты сразу...

Найти координаты точки пересечения высоты AH и высоты BG треугольника
Треугольник задан координатами своих вершин A(x1;y1), B(x2;y2), C(x3;y3). Найти координаты точки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru