На первом этапе можно протестировать простой жадный алгоритм.
У меня такое чувство, что более логично определить перекрывающиеся (расширенные) наборы, а затем определить не расширенные.
Давайте выберем K (= M?) Точек как можно дальше от всех остальных.
Я предполагаю, что здесь можно выбрать такие экстремальные точки, 1
и 6
в вашем примере.
Обратите внимание, что начальное количество точек может быть меньше, чем M.
- Эти начальные точки Pi определяют K множеств Si.
- Затем каждый Si дополняется необходимыми соседями Pi.
- Для каждого набора мы можем определить количество точек, у которых достаточно соседей.
- Если K
- , если все точки находятся в наборе свсе их соседи: СТОП.
- Выберите набор с наименьшим количеством удовлетворенных баллов, т.е. со всеми своими соседями.В этом наборе определите точки с наименьшим количеством пропавших соседей.Выберите случайным образом такую точку и завершите набор с отсутствующими соседями этой точки
- и переходите к шагу 3, пока не будет удовлетворен критерий остановки.
Вариант состоит в том, чтобы продолжить процесс до тех пор, пока каждый набор не наберет необходимое количество удовлетворенных баллов.
Каждый случайный процесс может обеспечить свое решение.Несколько попыток могут быть выполнены параллельно на разных узлах.
В вашем простом примере процесс предоставляет решение немедленно:
- S0 = {1} -> S0 = {1, 2, 3, 4, 5}
- S1 = {6} -> S1 = {6, 5, 4, 3, 2}
Может случиться, что два разных набора имеют одинаковое удовлетворенное очко,Даже если эта точка должна оставаться в каждом расширенном наборе, ее можно удалить из одного из нерасширенного набора
Одно из обоснований этого алгоритма: я считаю само собой разумеющимся, что крайние точки должны находиться в разных нерасширенных наборах.Это подразумевает, что их соседи должны присутствовать в соответствующем расширенном множестве Si.