Nano Hash - криптовалюты, майнинг, программирование

Ближайшая точка из списка для каждой точки другого списка

У меня есть популяция так называемых «Точек», которые ищут еду. Каждая точка имеет значение «sight_», которое указывает диапазон, в котором она может видеть еду. Положение каждой точки сохраняется как pair<uint16_t,uint16_t>. Позиции всех источников пищи указаны в виде vector<pair<uint16_t,uint16_t>>.

Теперь я хочу рассчитать ближайший источник пищи для каждой точки, которую эта точка может видеть. И я не хочу рассчитывать расстояние каждой комбинации.

Моя идея состояла в том, чтобы создать копию вектора еды, отсортировав одну копию по x, а другую по y. Затем найдите интервал [x-sight, x+sight] соответственно [y-sight, y+sight] в векторах, а затем создайте пересечение обоих. Я прочитал set_intersection, но он требует, чтобы оба диапазона были отсортированы по одному и тому же правилу.

Любые идеи, как я мог это сделать? Также может быть, что моя идея - это просто неправильный подход.

Спасибо, IceFreez3r.

Редактировать: я сделал некоторые приближения во время выполнения:
Сортировка еды: n log n
Интервал поиска для одной координаты и одной точки: 2 log n (нижняя и верхняя граница)
Если мы предполагаем равное распределение источников пищи, мы можем сначала вычислить границу, которая оценивается ближе к середине, а затем вычислить вторую границу в оставшемся интервале. Это сократит время выполнения до: log n + log(n/2) (Только что понял, что это, вероятно, не *эта* мощная:log(n/2) =~ log(n) - 1)
Построить пересечение: #x * #y =~ (n * view/testgroundsize)^2
Вычислить точное расстояние для каждой еды на пересечении: n * (sight/testgroundsize)^2

Сумма: 2 n log n + 2 * #Dots * (log n + log(n/2) + (n * прицел/размер тестовой площадки)^2 + n * (прицел/размер тестовой площадки)^2)
Сумма с ограничением одна координата: n log n + #Dots * (log n + log(n/2) + n * прицел/размер тестовой площадки)

Я сделал несколько тестов и просто рассчитал приведенные выше формулы на ходу:

int dots = dots_.size();
int sum = 2 * n * log(n) + 2 * dots * (log(n) + log(n/2) + pow(n * (sum_sight / dots) / testground_size_,2) + n * pow((sum_sight / dots) / testground_size_, 2));
int sum2 = n * log(n) + dots * (log(n) + log(n/2) + n * (sum_sight / dots) / testground_size_);
cout << n*dots << endl << sum << endl << sum2 << endl;

Оказалось, что идея Intersection просто плоха. Хотя идея ограничиться одной координатой, по крайней мере, лучше, чем грубая сила.
Я еще не думал об идее сетки @Daniel Jour

20.12.2019

Ответы:


1

Вы вступаете в целое поле интересных подходов к этой проблеме. Термины для Google — это двоичное разбиение пространства, деревья квадрантов и, конечно же, поиск ближайшего соседа.

Относительно простой, но эффективный подход, когда точки разбросаны гораздо больше, чем их «видимый диапазон»:

  1. Выберите значение «размер сетки».
  2. Создайте карту из координат сетки в список/набор сущностей
  3. Для каждого источника пищи: поместите их на карту в их координатах сетки.
  4. Для каждой точки: поместите их на карту в их координаты сетки и также в соседние "ячейки" сетки. Размер окрестности зависит от размера сетки и значения видимости точки.
  5. Для каждой записи на карте, которая содержит хотя бы одну точку: либо выполните этот алгоритм рекурсивно с меньшим размером сетки, либо используйте подход грубой силы: проверьте каждую точку в этой ячейке сетки по каждому источнику пищи в этой ячейке сетки.

Это линейный алгоритм по сравнению с подходом квадратичного перебора.

Расчет координат сетки: grid_x = int(x / grid_size) ... то же самое для других координат.

Окрестность: steps = ceil(sight_value / grid_size) .. окрестность представляет собой квадрат со стороной 2×steps + 1 с центром в координатах сетки точки

20.12.2019

2

Я считаю ваш подход неверным. Это можно проверить математически. Вместо этого вы можете рассчитать величину вектора, соединяющего точку с источником пищи, с помощью теоремы Пифагора и убедиться, что эта величина меньше предела наблюдения. Это касается исключительно определения относительного расстояния, определяемого декартовой системой координат, и стандартной единицей измерения. Что касается вопросов эффективности, в первую очередь необходимо определить, является ли применяемый подход с точки зрения вычислений в действительности менее эффективным с точки зрения времени, даже если логический компонент, ответственный за определенные расчеты, в силу этой альтернативы внедрение, занимает меньше времени. Грубо говоря, идеальным является тот, в котором затрачиваемое время уменьшается, а не просто численно ограничивается посредством рефакторинга. Теперь, если дело обстоит так, что положение точки может быть определено как любые два числа, которые можно выбрать, это, конечно, подразумевает систему отсчета, называемую базисом, а также систему, локальную для рассматриваемой точки. В отношении обоих можно количественно определить положение и другие подобные характеристики и свойства. В результате этого наблюдения может показаться, что вам нужно n*2 структур данных, где n — количество точек в окружении, содержащих отсортированные значения относительно каждой точки, и, откровенно говоря, неясно, так это или нет. подход будет даже работать или является оптимальным. Вы указываете проектное и программное ограничение, заключающееся в том, что решение не должно вычислять расстояния от каждой точки до каждого источника пищи. Но для этого необходимо реализовать другие подобные процедуры, чтобы получить правильные результаты. Эти комментарии сделаны в связи с моим обсуждением эффективности. Поэтому вам может быть лучше просто рассчитать расстояние в каждом случае. Это несколько элегантно.

21.12.2019
  • Я не понимаю, какие структуры данных вы имеете в виду. Но если подвести итог, вы думаете, что мой подход медленнее, и вместо этого я должен использовать грубую силу, верно? 22.12.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..