минимальное умножение против проблемы с набором покрытия

У меня есть набор I = {P1, P2, ..., Pm} и n конечных подмножеств I, обозначаемых R1, R2,..., Rn следующим образом:

R1 = {P1, P2}

R2 = {P2, P4}

R3 = {P2, P3, P4}

R4 = {P1, P2, P4}

....

где Pi обозначает целое число.

Для каждого Ri я хочу вычислить произведение всех его элементов. Моя цель состоит в том, чтобы использовать как можно меньше умножений и делений, разделяя некоторые общие части между Ri (i=1,2,...,n).

Например, если я могу сначала вычислить P2 * P4, то этот результат можно использовать для вычисления произведения всех элементов для R3 и R4.

Обратите внимание, что деление также допускается. Например, я могу сначала вычислить A=P1*P2*P3*P4, затем использовать A/P1 для вычисления произведения всех элементов для R3 и использовать A/P3 для R4.

Если я хочу использовать минимальные умножения и деления для вычисления всех произведений для каждого подмножества I, будет ли это проблемой покрытия множества? NP-полный? Кстати, не могли бы вы дать формулировку линейной программы Integer, чтобы описать ее так же, как здесь .

Любые предложения будут высоко оценены!

редактирование сообщества: дополнительные предположения:

  • деления разрешены, та же стоимость, что и умножения
  • нет повторяющихся элементов в заданном множестве. например R5 = {P1, P1, P1, P2} запрещено

person John Smith    schedule 30.05.2012    source источник
comment
Да, это разрешено. Например, я могу сначала вычислить A=P1*P2*P3*P4, затем использовать A/P1 для вычисления произведений всех элементов для R3 и использовать A/P3 для R4.   -  person John Smith    schedule 30.05.2012
comment
Интересная проблема. Кажется, что стандартное решение должно было быть разработано десятилетия назад, но самое близкое, что я могу найти, это статьи об оптимизации порядка умножения матриц. Даже без деления я не думаю, что это покрытие набора (по крайней мере, наивно), потому что P1*P2 и P2*P4 вместе покрывают R4, но не дают нужного продукта.   -  person Ted Hopp    schedule 30.05.2012
comment
Я предполагаю, что деления считаются умножением?   -  person ninjagecko    schedule 30.05.2012
comment
Конечно! Воспринимайте каждую из них как операцию, требующую одного флопа.   -  person John Smith    schedule 30.05.2012
comment
Могут ли элементы повторяться, например. R5 = {P1, P1, P1, P2}?   -  person ninjagecko    schedule 30.05.2012
comment
Нет. Мы предполагаем, что в каждом наборе нет дубликатов.   -  person John Smith    schedule 30.05.2012
comment
Считаете ли вы время на расчет минимальных операций частью стоимости или вас это не волнует (например, предвычислимое)? Вы предполагаете параллельное или непараллельное оборудование?   -  person ninjagecko    schedule 30.05.2012
comment
В настоящее время эта проблема основана на непараллельном оборудовании. Во-первых, независимо от времени, я хочу минимизировать время умножения и деления. Следующим шагом, если это возможно, меня будет интересовать минимизация времени (например, предварительное вычисление). Это две тесно связанные проблемы.   -  person John Smith    schedule 30.05.2012
comment
Проблема значительно усложняется, если Пи не являются простыми числами. Являются ли Pi простыми числами?   -  person Ricky Bobby    schedule 30.05.2012


Ответы (3)


Рассмотрим граф ваших элементов Ri без ребер. Теперь мы позволяем себе добавлять ребра следующим образом:

  • Добавьте направленное ребро между Ra→Rb, аннотированное частным Rb/Ra.

Например, мы можем нарисовать ребро R1→R3 со стоимостью умножения на R1/R3< /sub> = P3*P4/P1

Сделайте это для всех узлов, чтобы у вас было |R|2 ребер.

Теперь, если вы только использовали промежуточные результаты, вы могли бы использовать алгоритм минимального связующего дерева для решения этой проблемы. Я считаю, что алгоритмы MST очень близки к линейным по количеству ребер (фактор обратного Аккермана растет медленнее, чем log(log(log(...log(n)...)))); могут быть даже рандомизированные алгоритмы линейного времени по количеству ребер, например. http://www.akira.ruc.dk/~keld/teaching/algoritmedesign_f04/Artikler/07/Karger95.pdf Таким образом, этот базовый алгоритм займет |R|2 времени.

Однако вы лишите себя действительно оптимальных ответов, если будете использовать только промежуточные результаты, потому что можно использовать «импровизированные» выражения, которые мы извлекаем из воздуха для достижения лучшей производительности. Например, вы можете рассмотреть такой сценарий:

R1 = {P2, P3, P4, P5}
R2 = {P1, P3, P4, P5}
R3 = {P1, P2, P4, P5}
R4 = {P1, P2, P3, P5}
R5 = {P1, P2, P3, P4}

Оптимальное решение — вычислить P1*P2*P3*P4*P5, а затем разделить на Pi, в результате чего получится 9 операций. Принимая во внимание, что описанный выше метод будет делать что-то вроде R1=P2*P3*P4*P5, а затем выполнять умножение и деление каждый раз, чтобы перейти R1→R2, R2→R3, R3→R4, R4→R5, в результате чего получается 11 операций. (Если бы у нас не было деления, у нас было бы тоже 9 операций: b=P1*P2 c=b*P3 r5=c*P4 r4=c*P5, d=P4*P5, r3=b*d, e= P3*d, r1=e*P2, r2=e*P1.Хотя я думаю, что можно было бы создать ситуации, когда деление было бы необходимо, но, похоже, не могу найти его; если я не могу его найти, возможно, дело в том, что на самом деле это простая задача с полиномиальным временем.)

Этот метод я буду называть методом «экспромтного выражения». Если мы решим вычислить импровизированное выражение (одну невозвратную стоимость в начале), это уменьшит затраты на все будущие вычисления для прохождения ребра, если мы решим его использовать (поскольку может возникнуть выбор количества импровизированных выражений для использования).

Это подводит нас к очень незначительному побочному примечанию:

Theorem:
  You should have at least one intermediate expression of each 
  length up to the maximum size of any R.
Proof (induction):
  To build up a product of size N, you will need to do 
  have a product of size N-1.

Учитывая эту теорему, оказывается, что мы немного ошиблись выше. Оптимальным решением было запомнить P1*P2*P3 и P1*P2*P3*P4 в процессе вычисления P1*P2*P3*P4*P5. Тогда мы можем получить R5 бесплатно (и R4 всего одним умножением другим способом, к сожалению, по той же цене, что и раньше), уменьшив общую стоимость с 9 до 8. Это приводит нас к дикому предположению, что выполнение http://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm с произвольным ребра также могут дать оптимальное решение после очень долгого времени.

В любом случае, как нам включить такую ​​систему в наше решение? Мы не можем добавить узел, потому что это испортит алгоритм MST. Для каждого ребра, где умножение или деление на импровизированное выражение E не приведет к тому, что некоторое P будет иметь мощность, превышающую p (например, для p = 2 мы разрешаем промежуточные импровизированные выражения, которые создают продукты, такие как P1 * P4^2 / P3, но запрещают что-то вроде P2^3), мы выполняем это умножение и разделение на краю, и создайте два новых края. (Мы можем сделать это несколько раз или в будущем.) Мы также делаем это для всех подмножеств ребра, которые мы запоминаем, как описано выше. Стоимость этого метода, если вы используете алгоритм MST, заключается в том, что количество ребер сильно увеличивается, поэтому, возможно, (|R| + #newedges)2 = (|R|^|P|) 2 может быть, в худшем случае, значительно увеличивая время, необходимое для поиска оптимального ответа.

Таким образом, кажется, что более общая проблема является NP-сложной, как предположение; отзовитесь кто-нибудь, если это не так. Однако вы, возможно, можете использовать эвристику для угадывания полезных импровизированных выражений. Например, если вы видите «большое» подмножество R с «высокой плотностью обычных P», вы можете сгенерировать «уловку», которая является произведением всех общих P. Если вы сделаете это для всех «больших/плотных скоплений обычных P», которые вы видите среди подмножеств ваших R, а затем запустите MST, вы можете получить несколько лучшие ответы без необходимости выполнять более общий поиск. Вы даже можете запустить алгоритм, помогающий обнаруживать такие сгустки, например, алгоритм иерархической кластеризации.

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

person ninjagecko    schedule 30.05.2012
comment
Я должен прокомментировать свой ответ: после некоторых экспериментов я не смог найти ситуацию, когда жадный алгоритм не дает оптимального результата и без деления. Жадный алгоритм выглядит следующим образом: [...] - person ninjagecko; 04.06.2012
comment
[...] Храните кеш продуктов. Создавайте новые продукты следующим образом: рассмотрите все пути от каждого продукта в кеше до каждого R. Подумайте, как каждый термин в пути уменьшит размер вашей задачи (например, рассмотрите ab-›ab c-›abcd: переписать каждое R, заменив abcd-›x0, ab*c -›x1, вычислить новую стоимость, сравнить все пути). Замените каждый R. Это разработка того, что я назвал эвристикой в ​​​​своем ответе. - person ninjagecko; 04.06.2012
comment
отличные предложения! Просто интересно, является ли метод MST почти оптимальным? - person John Smith; 04.06.2012

Без делений это похоже на задачу ВЫЧИСЛЕНИЕ АНСАМБЛА, как описано в Gary & Johnson и, следовательно, NP-полный.

[PO9] АНСАМБЕЛЬНЫЕ ВЫЧИСЛЕНИЯ

INSTANCE: Набор C подмножеств конечного множества A, положительное целое число J.

ВОПРОС: Существует ли последовательность S = (z_1 ‹- x_1 U y_1, z_2 ‹- x_2 U y_2, ..., z_j ‹- x_j U y_j) операций объединения j ‹= J, где каждый x_i и y_i либо { a} для некоторого a в A или z_k для некоторого k ‹ i, такого, что x_i и y_i не пересекаются, 1 ‹= i ‹= j, и такого, что для каждого подмножества c в C существует некоторое z_i, 1 ‹= i ‹ = j, что идентично C.

Ваш набор I соответствует A, каждый R_i соответствует элементу C, а умножение соответствует объединению множеств.

person mhum    schedule 31.05.2012
comment
Что J в ENSEMBLE COMPUTING соответствует моей задаче? - person John Smith; 04.06.2012
comment
J — максимальное количество разрешенных умножений. Строчными буквами j является количество фактических умножений. Естественно превратить проблемы оптимизации в проблемы принятия решений, наложив ограничение на то, что нужно оптимизировать, например: превратить минимизацию числа умножений в «Могу ли я сделать это менее чем за J умножений?». - person mhum; 04.06.2012
comment
R_i соответствует элементу C? Я думаю, что это должно быть произведение всех элементов в R_i, соответствующее элементу C. Не могли бы вы подтвердить это? Спасибо! - person John Smith; 06.06.2012
comment
Да, это более-менее одно и то же. При такой постановке задачи нам не обязательно различать набор R_i и произведение всех элементов в R_i, поскольку мы могли просто выбрать каждый P_i как различные простые числа. - person mhum; 06.06.2012
comment
Благодарю. Кстати, что вы думаете о аппроксимации радио алгоритма Ниндзягекко? - person John Smith; 07.06.2012

Во-первых, вам не нужно разделение

Деление здесь не нужно, это всегда будет лишний расчет.

Если вам нужно разделить, это означает, что вы уже сделали умножение, поэтому, если вы делите, вы отменяете уже проделанную работу.

Например, если вы вычисляете Pi*Pj*Pk путем деления Pi*Pj*Pk*Pn на Pn, это означает, что вы рассчитали Pi*Pj*Pk*Pn раньше и, следовательно, рассчитали Pi*Pj*Pk раньше.

(Я предполагаю, что все ваши числа являются простыми числами)

мое решение

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

Вы можете начать строить дерево суффиксов с помощью Ri .

Тогда число умножения будет числом ребер в дереве.

Пример:

Используя ваш пример, дерево суффиксов будет:

       P2
      / \
     P4 P1
    / \ 
   P3 P1

Вы получаете 4 умножения:

M1=P1*P2

M2=P2*P4

M3=M2*P1

M4=M2*P3

Нахождение минимального числа умножений эквивалентно построению суффиксного дерева с минимальным количеством ребер.

Надеюсь, это поможет.

person Ricky Bobby    schedule 30.05.2012
comment
Я должен объяснить -1: Например, если вы вычисляете PiPjPk, разделив PiPjPkPn на Pn, это означает, что вы вычислили Pi< i>PjPkPn раньше, поэтому вы рассчитали PiPjPk раньше.. Это не означает, что вы рассчитали PiPjPk до. Это означает, что вы рассчитали коэффициент Pi*Pj*Pk*Pn раньше. Например: Pi*Pj и Pk*Pn. Это не значит, что деления не нужны, просто приведенное выше не является доказательством. - person ninjagecko; 31.05.2012
comment
@ninjagecko Спасибо за ваш комментарий. Я постараюсь обновить свое доказательство. Я почти уверен, что деление здесь не нужно. (если у вас нет контрпримера) И суффиксные деревья кажутся мне интересным подходом. - person Ricky Bobby; 31.05.2012
comment
@RickyBobby, означает ли здесь предположение о простых числах, что Pi является атомарным, и его нельзя разложить на произведение двух множителей? - person John Smith; 05.06.2012
comment
@JohnSmith, да, это означает, что Pi нельзя разложить на произведение 2 Pk и Pj. Например, если R1={60} и R2 = {2,3,5}, тогда вы можете вычислить произведение элемента в R2 только с одним делением: 60/2 вместо 2 умножений: 2*3*5. Предположение, что числа не все являются простыми числами, значительно усложняет вашу задачу. - person Ricky Bobby; 05.06.2012
comment
@RickyBobby, как построить суффиксное дерево с минимальным количеством ребер? Рефы есть? - person John Smith; 06.09.2012