Алгоритм поиска оптимальных групп

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

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

Одна операция чтения может считывать непрерывную последовательность ячеек из массива, поэтому можно вернуть группу из нескольких значений из одной операции чтения. Максимальное количество смежных местоположений, которые могут быть прочитаны за одну операцию, - 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 как есть.

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

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


person Ian Goldby    schedule 14.09.2010    source источник
comment
Я собирался сказать, что вы всегда можете группировать смежные элементы с одинаковым временем (группа B в вашем последнем примере), но это может быть неверно в угловых случаях, когда в игру вступает M. Это действительно указывает на стратегию построения все более крупных групп с разумными правилами. Насколько велик размер вашей задачи?   -  person phkahler    schedule 14.09.2010
comment
Похоже, это может быть NP-Complete или, по крайней мере, NP-Hard проблема в теоретически оптимальном случае. Вы можете попробовать опубликовать его на CS Theory Stack Exchange.   -  person Daisy Sophia Hollman    schedule 14.09.2010
comment
@phkahler: В моем конкретном случае M составляет около 100, размер массива может быть от 1 до 30000 или около того, но обычно несколько сотен, а количество мест требуется от 1 до 100 или около того.   -  person Ian Goldby    schedule 14.09.2010
comment
Я подозревал, что это может быть проблема NP-Hard. Если это так, то почти оптимальное решение будет приемлемым, если нет патологических случаев, из-за которых оно сильно не сработает. Я попробую CS Theory Stack Exchange, если в течение нескольких дней не получу здесь хорошего ответа.   -  person Ian Goldby    schedule 14.09.2010
comment
Привет, извините за придирки, но решение для вашего первого примера не оптимально (по крайней мере, так я прочитал правила). В этом случае чтение массива Entrire было бы оптимальным, потому что это только 1 чтение в секунду.   -  person    schedule 14.09.2010
comment
@jdv: Все примеры относятся к M = 6, то есть одна группа не может охватывать более 6 локаций, и все они должны быть смежными.   -  person Ian Goldby    schedule 15.09.2010


Ответы (1)


Эта проблема имеет то же свойство нестабильности при добавлении новых элементов, что и аналогичные 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
person Rex Kerr    schedule 14.09.2010
comment
Хорошо, я снова вернусь к этому. К сожалению, вышеупомянутый алгоритм не работает в последнем примере, если все элементы обновляются с одинаковой скоростью - вы получаете те же три группы, тогда как вы должны получить только две. Я пытаюсь понять, могу ли я настроить алгоритм, чтобы исправить это, но кажется принципиально трудным заставить его предпочитать большую группу, чтобы удовлетворить то, что по сути является нелокальным критерием (минимизация количества групп). - person Ian Goldby; 27.09.2010
comment
Вы можете неоднократно пытаться преобразовать тройки в пары до тех пор, пока никакие тройки не будут улучшены, если их переписать как пары. - person Rex Kerr; 27.09.2010
comment
Я добавил немного больше к исходному вопросу. Возможно, мне следует объяснить, почему меня это так беспокоит. Я ожидаю, что в большинстве практических случаев количество групп в оптимальном случае будет небольшим: может быть, всего одна, две или три. Таким образом, добавление только одной дополнительной группы является, условно говоря, очень большими дополнительными затратами. Это заставляет меня задуматься, может ли атака полным перебором быть ответом ... - person Ian Goldby; 28.09.2010
comment
Я думаю, что ключевым моментом является отсутствие законных частичных модификаций решения. Какие еще проблемы NP-Complete / Hard существуют с этим свойством и как они решаются? - person Ian Goldby; 28.09.2010
comment
@Ian - свойство, заключающееся в том, что любое локальное изменение может распространяться на всю остальную часть решения, присуще всем задачам NP-типа. Есть два пути: (1) исчерпывающий поиск (разумно, конечно; например, если есть отрезок 0, который слишком велик для одного чтения, вы разбиваете проблему на две подзадачи) и (2 ) приблизительные эвристики, которые в среднем работают достаточно хорошо, но обязательно терпят неудачу в конкретных проблемных случаях. Мое решение было типа (2). - person Rex Kerr; 28.09.2010
comment
Я пришел к выводу, что во всех проблемах NP-типа, которые я рассматривал при исследовании этой проблемы, вы можете внести небольшое локальное изменение в решение, и оно все равно будет действительным решением, хотя, вероятно, менее оптимальным, например поменять местами два города в задаче коммивояжера. Но в последнем примере здесь нет никаких локальных изменений, которые я могу сделать, что приведет к все еще действующему решению. Однако я переоцениваю это - если я смогу найти способ обозначить решение таким образом, чтобы недопустимые решения не имели представления, тогда всегда была бы возможна локальная модификация. Не уверен, возможно ли это. - person Ian Goldby; 28.09.2010
comment
@Ian - Вы просто думаете о неправильном типе локальной модификации. Вы всегда можете разделить одно чтение на два, что является локальной модификацией. Но эта локальная модификация нелегко приведет вас к глобальному решению - вы попали в ловушку локального минимума. И другие проблемы - например. коммивояжер - точно так же. Вы можете застрять на хорошем, но неоптимальном маршруте, и вам придется все переделывать, чтобы выбраться на действительно кратчайший путь. В любом случае, если проблема небольшая и оптимальность критична, выполните поиск методом перебора. В противном случае, возможно, вы сможете смириться с некоторыми недостатками. - person Rex Kerr; 28.09.2010
comment
Спасибо за действительно полезный комментарий. Я слишком долго смотрел на эту проблему и не видел леса за деревьями. Я понял, что модификация может законно увеличить функцию стоимости на пути к лучшему решению, но почему-то упустил идею разделения группы. Это действительно разблокирует блокировку и означает, что я мог бы использовать такой алгоритм, как имитация отжига, чтобы увидеть, можно ли улучшить решение из вашего алгоритма сглаженных обратных скоростей. - person Ian Goldby; 29.09.2010
comment
Так получилось, что я также нашел достаточно эффективный поиск методом перебора, который позволяет избежать рассмотрения недействительных группировок. Поскольку недействительных группировок гораздо больше, чем допустимых, это значительно сокращает пространство поиска. У него также есть приятная особенность, заключающаяся в том, что первая попытка группировки является приемлемой альтернативой, поэтому я могу безопасно остановить алгоритм, скажем, через 50 мсек, если к тому времени он еще не завершился. Спасибо за вашу помощь. - person Ian Goldby; 29.09.2010
comment
Я полагаю, я должен упомянуть, что, несмотря на устранение недействительных группировок, размер проблемы все еще увеличивается «комбинаторно», поэтому она все еще становится невыполнимой, когда N становится даже достаточно большим. - person Ian Goldby; 19.03.2013