Алгоритм поиска оптимальных групп - PullRequest
11 голосов
/ 14 сентября 2010

Устройство содержит массив местоположений, некоторые из которых содержат значения, которые мы хотим периодически читать.

Наш список местоположений, которые мы хотим периодически читать, также указывает, как часто мы хотим их читать.Разрешается читать значение чаще, чем указано, но не реже.

Одна операция чтения может считывать непрерывную последовательность местоположений из массива, поэтому можно вернуть группу из нескольких значений изодна операция чтения.Максимальное количество смежных местоположений, которые могут быть прочитаны в одной операции, составляет M.

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

(Бонусные баллы начисляются, если алгоритм, позволяющий это сделать, допускает постепенные измененияв список местоположений - т.е. добавление или удаление одного местоположения в / из списка не требует пересчета групп с нуля!)

Я попытаюсь прояснить это с некоторыми примерами, где M = 6.

Следующая диаграмма показывает массив местоположений.Числа представляют желаемый период чтения для этого местоположения.

| 1 | 1 |   |   | 1 |   |   |   |   |   | 5 |   | 2 |
\-------------------/                   \-----------/
     group A                               group B

В этом первом примере группа A читается каждую секунду, а группа B - каждые 2 секунды.Обратите внимание, что местоположение, которое должно читаться каждые 5 секунд, фактически читается каждые 2 секунды - это нормально.

| 1 |   |   |   |   | 1 | 1 |   | 1 |
\-----------------------/\----------/
         group A            group B         (non-optimal!)

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

| 1 |   |   |   |   | 1 | 1 |   | 1 |
\---/               \---------------/
group A                  group B            (optimal)

Наконец, пример, где три группы лучше, чем две:

| 5 |   |   |   |   | 1 | 1 |   |   |   |   | 5 |
\-----------------------/\----------------------/
        group A                  group B    (non-optimal)

Это решение требует двух групповых чтений в секунду.Лучшее решение заключается в следующем:

| 5 |   |   |   |   | 1 | 1 |   |   |   |   | 5 |
\---/               \-------/               \---/
group A              group B               group C

Для этого требуется два чтения каждые 5 секунд (группы A и C) и одно чтение каждую секунду (группа B): 1,4 чтения группы в секунду.

Редактировать: (Существует еще лучшее решение для этого примера, если вы разрешите чтение быть непериодическим. На 1-й секунде прочитайте обе группы первого решения. На секундах 2, 3, 4 и 5 прочитайте группу B второгорешение. Повторите. Это приводит к 1,2 чтениям группы в секунду. Но я собираюсь запретить это, потому что это сделает код ответственным за планирование чтений намного более сложным.)

Я посмотрел алгоритмы кластеризации, но этоне проблема кластеризации.Я также нашел Алгоритм для распределения списка чисел по N группам при определенных условиях , что указывало на проблему «упаковки бина», но я не думаю, что это тоже.

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

Добавлены новые примеры 28 сентября 2010 года:

Это похоже на предыдущий пример, но всеОбновление предметов с той же скоростью.Теперь две группы лучше, чем три:

| 1 |   |   |   |   | 1 | 1 |   |   |   |   | 1 |
\-----------------------/\----------------------/
        group A                  group B          (optimal)

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

| 1 |   |   |   |   | 1 | 1 |   |   |   |   | 1 | 1 |   |   |   |   | 1 |
\---/               \-------/               \-------/               \---/
group A              group B                 group C               group D  (non-optimal)
\-----------------------/\----------------------/\----------------------/
        group A                  group B                  group C           (optimal)

Это можно улучшить до трех смежных групп в каждой из 6. Рекс предложил (комментарий ниже), что я могу попробовать объединить триплеты в пары.Но в этом случае мне пришлось бы объединить квартет в триплет, потому что не существует легального промежуточного соглашения, в котором A + B + C (или B + C + D) можно переставить в пару, оставив D как есть.

Первоначально я думал, что это свидетельствует о том, что в общем случае нет гарантии того, что новое действительное решение может быть создано из существующего действующего решения путем локальной модификации.Это означало бы, что такие алгоритмы, как имитация отжига, генетические алгоритмы и т. Д., Можно использовать для уточнения неоптимального решения.

Но Рекс указал (комментарий ниже), что вы всегда можете разделить существующую группу на две. Несмотря на то, что это всегда увеличивает функцию стоимости, все это означает, что решение должно выйти из своего локального минимума для достижения глобального минимума.

1 Ответ

4 голосов
/ 14 сентября 2010

Эта проблема обладает тем же свойством нестабильности при добавлении новых элементов, что и аналогичные проблемы с NP-завершением, поэтому я полагаю, что она тоже есть.Поскольку я подозреваю, что вам нужно что-то, что работает достаточно хорошо, а не доказательство того, почему это сложно, я сосредоточусь на алгоритме, чтобы дать приблизительное решение.

Я бы решил эту проблему, преобразовав это в графгде бины были оценены в 1 / N, если их нужно было читать N раз в секунду, и размыть график с шириной M (например, 6), достигнув пика в оригинале.(Для 6 я мог бы использовать взвешивание (1/6 1/5 1/4 1/3 1/2 1 1/2 1/3 1/4 1/5 1/6).) Затем бросать мусорные ведра на все местныеМаксимумы (сортируйте пары по расстоянию друг от друга и сначала закрывайте близкие пары максимумов).Теперь у вас есть большинство ваших самых важных ценностей.Затем перехватите все пропущенные группы, расширив существующие чтения или добавив новые чтения, если это необходимо.В зависимости от структуры, вы можете захотеть добавить некоторые уточнения, смещая места между чтениями, но если вам повезет, это даже не понадобится.

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

Просто чтобы посмотреть, как это будет работать с вашими данными, случай с двумя группамивыглядят как (умножение на 60, чтобы мне не приходилось отслеживать дробные веса)

 60 30 20 15 12 10 00 00 00   <- contribution from left-most location
 10 12 15 20 30 60 30 20 15   <- second
 00 10 12 15 20 30 60 30 20   <- third
 00 00 00 10 12 15 20 30 60   <- rightmost
 --------------------------
 70 42 47 50 74 B5 B0 80 95   (using "B" to represent 11)
 ^^             ^^       ^^   Local maxima
   -------------  -------
     dist=6        dist=4
               |===========|  <- Hit closely-spaced peaks first
|==|                          <- Then remaining

Итак, все готово, и решение оптимально.

Для трех группНапример, взвешивая «5» как «1/5» и умножая все на 300, чтобы снова не было дробей,

060 030 020 015 012 010 000 000 000 000 000 000   <- from 5 on left
050 060 075 100 150 300 150 100 075 060 050 000   <- 1 on left
000 050 060 075 100 150 300 150 100 075 060 050   <- on right
000 000 000 000 000 000 010 012 015 020 030 060   <- 5 on right
-----------------------------------------------
110 140 155 190 262 460 460 262 190 155 140 110
                   |=======|                      <- only one peak, grab it
===                                         ===   <- missed some, so pick them back up
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...