алгоритм поиска ближайшего объекта - PullRequest
1 голос
/ 26 мая 2019

Мне нужно отобразить синие объекты на красные по расстоянию.Центр каждого объекта известен.Желтые и зеленые объекты, если они показаны, являются подсказками.Они помогают определить, какой красный объект является более важным.

Например, в ситуации, показанной на рисунке ниже:

  • Нижний синий объект должен быть сопоставлен с самым нижним правым краснымобъект, так как зеленый и желтый объекты очень близки к этому красному объекту.
  • Правый синий объект должен быть сопоставлен с верхним правым красным объектом, поскольку он ближе к нему.

enter image description here

У меня есть наивное решение, но я не совсем уверен, что делать вместо «????»ниже

У вас есть какие-либо предложения?

Мое наивное решение в виде псевдокода:

for each BLUE:
   find group P=(YELLOW_BLUE, GREEN_BLUE and RED_BLUE) when each object in P is the closest to BLUE
   vector<RED> redCandidates
   for each O in P:
       if O is YELLOW OR O is GREEN
          find closest RED to O 
          insert RED to redCandidates

   if size of redCandidates is 0 -> return RED_BLUE
   else if size of redCandidates is 1 -> return redCandidates[0] since hint has more weight to the decision
   else if size of redCandidates is > 1 -> ???? 

ОБНОВЛЕНИЕ1 После рассмотрения проблемы минимальной стоимости потока , предложенной @ldog, я решил использовать венгерский алгоритм .Я создал двудольный график, где каждый синий узел связан с каждым красным узлом, а веса на краях - это расстояние между синим и красным.enter image description hereТеперь, прежде чем я решу график, мне нужно применить награды по краям, где желтый / зеленый близки к красному.Я не совсем понимаю, как это сделать.Скажем, расстояние между синим 1 и красным 4 равно D_1_4 = 10, а расстояние между желтой подсказкой 11 и красным 4 равно D_4_11 = 3. Так что, поскольку D_1_4> D_4_11, я должен просто добавить вознаграждение к краю 1_4?Или я должен добавить вознаграждение к каждому ребру, которое входит в узел 4, что означает ребра 1_4, 2_4 и 3_4?

1 Ответ

1 голос
/ 28 мая 2019

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

Вот несколько предложений:

  1. Используйте пересечение над объединением для решения вопроса о том, как назначить сходство для перекрывающихся областей.
  2. Есть много способов, которыми вы можете попытаться сделать то, что выражаете словами, количественно, и, следовательно, сможете оптимизировать. Один из разумных способов количественно выразить то, что вы выразили словами, - это проблема минимизации, о которой я расскажу ниже.

При минимизации следует назначить один синий прямоугольник ровно одному красному прямоугольнику (учитывая то, что вы сказали мне). Зеленый и желтый прямоугольники являются подсказками и не включены в это ограничение, они просто используются для изменения того, какой красный прямоугольник предпочтительнее другие. Чтобы формализовать то, что вы описали словами, у нас есть набор красных прямоугольников R и набор синих прямоугольников B. Есть m красные коробки и n синие коробки с m >= n. Каждое соединение синей рамки i с красной рамкой j имеет предпочтение w_{ij} (это предпочтение предварительно рассчитывается с учетом блоков подсказок, а также пространственной близости.)

Мы хотим вычислить:

           max \sum_{i<j} w_{ij}x_{ij}
 such that 
           \sum_{k} x_{ik} = 1, \sum_{l} x_{lj} = 1, x_{ik} \in {0,1}

Переменная x_{ij} равна 1, если и только если синему прямоугольнику i присвоено красное поле j, в противном случае - 0.

Эта проблема (является Полностью унимодулярной ) и может быть решена за полиномиальное время. Фактически, это может быть решено как пример общей проблемы Поток минимальной стоимости . Для этого определите узел на графике для каждого синего поля i и узел на графике для каждого красного поля j. Соедините каждый синий узел с каждым красным узлом (направленный синий-> красный) с ребром с весом -w_{ij} и емкостью 1. Соедините каждый синий узел с источником (направленный источник -> синий) с ребром емкости 1 и весом 0 Подключите каждый красный узел к приемнику (направленный красный-> приемник) с ребром емкости 1 и весом 0. Дайте источнику предложение n, а потребителю - n. Вычислите минимальный поток затрат на этом графике (см., Например, лимон ), и полученный поток дает максимальное решение (альтернативно минимальный поток).

Подробно описав это, я вижу, что это уже общий подход [1] для решения именно таких проблем, как ваша. Здесь - это реализация.

YMMV в зависимости от того, насколько хороши ваши веса. Возможно, вы захотите попробовать подход машинного обучения для определения оптимальных весов, используя базовый набор данных истинности и итеративное уточнение. Уточнение может быть вычислено для фиксированного набора синих и красных базовых блоков истинности путем уточнения весов w_{ij} до тех пор, пока все другие возможные назначения, отличные от основного показателя, не будут иметь более низкий показатель оптимизации, чем базовый уровень. Это можно сделать итеративно, используя любую структуру или технику обучения с максимальным запасом, в сочетании с методом, который я описал выше (и, по-видимому, описан в [1].)

[1] Чжан, Ли, Неватия: Глобальная ассоциация данных для отслеживания нескольких объектов с использованием сетевых потоков, CVPR (2008).

...