Bob's Sale (изменение порядка пар с ограничениями для минимизации суммы продуктов)

15

Я задал этот вопрос о переполнении стека некоторое время назад: Проблема: продажа Боба . Кто-то предложил также разместить здесь вопрос.

Кто-то уже задавал вопрос, связанный с этой проблемой, здесь - минимальный вес леса данной мощности - но, насколько я понимаю, это не помогает мне с моей проблемой. На StackOverflow также стоит посмотреть ответ с самым высоким рейтингом.

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


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

У Боба есть магазин, и он хочет продать. В его магазине есть несколько товаров, и у него есть определенное целое количество единиц каждого товара на складе. У него также есть несколько смонтированных на полках ценников (столько же, сколько продуктов), на которых уже напечатаны цены. Он может разместить любой ценник на любом товаре (единая цена за один предмет для всего его запаса этого товара), однако некоторые товары имеют дополнительное ограничение - любой такой товар может быть не дешевле, чем определенный другой товар.

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


Данный:

  • N - количество товаров и ценников
  • S i , 0≤ i <N - количество на складе товара с индексом i (целое число)
  • P j , 0≤ j <N - цена на ценнике с индексом j (целое число)
  • K - количество дополнительных пар ограничений
  • A k , B k , 0≤ k <K - индексы произведений для дополнительного ограничения
    • Любой индекс продукта может появляться не более одного раза в B. Таким образом, граф, образованный этим списком смежности, на самом деле является набором направленных деревьев.

Программа должна найти:

  • M i , 0≤ i <N - отображение индекса продукта на индекс ценовой цены (P M i - цена продукта i )

Чтобы выполнить условия:

  1. P M A k ≤ P M B k , для 0≤ k <K
  2. Σ (S i × P M i ) при 0≤ i <N минимально

Обратите внимание, что если бы не первое условие, решением было бы просто отсортировать этикетки по цене и продукты по количеству и сопоставить их напрямую.

Типичные значения для ввода будут N, K <10000. В реальной проблеме есть только несколько отличных ценников (1,2,3,4).


Вот один пример того, почему большинство простых решений (включая топологическую сортировку) не будут работать:

У вас есть 10 товаров с количеством от 1 до 10 и 10 ценников с ценами от 1 до 10. Есть одно условие: товар с количеством 10 не должен быть дешевле, чем товар с количеством 1.$$$

Оптимальное решение:

Price, $   1  2  3  4  5  6  7  8  9 10
Qty        9  8  7  6  1 10  5  4  3  2

с общей стоимостью 249 Если вы разместите 1,10 пары вблизи экстремума, общая стоимость будет выше.$

Владимир Пантелеев
источник
Хм, предварительно отформатированный блок для примера внизу запутался, и я не уверен, как это исправить (синтаксис Markdown StackOverflow и теги <pre> здесь не работают).
Владимир Пантелеев
Разметка для предварительно отформатированного блока не была распознана, поскольку знаки доллара рассматривались как разделитель TeX (хотя я не знаю, почему разметка TeX разрушает разметку для предварительно отформатированного блока). Поскольку , похоже, не существует «правильного» способа избежать знаков доллара , я исправил это специальным образом.
Цуёси Ито
в чем вопрос? Вы хотите (эффективный) алгоритм для поиска оптимального решения? твердость? приблизительное решение?
Маркос Вильягра,
1
@ Это спасибо. @Marcos - извините, я ищу алгоритм для решения этой проблемы, надеюсь, достаточно быстрый, чтобы я мог реализовать его в своем проекте. Существует много идей для приблизительного решения, поэтому было бы предпочтительным точное решение.
Владимир Пантелеев
1
Для чего это стоит, я думаю, что связанный вопрос ( cstheory.stackexchange.com/q/4904/751 ) рассматривает случай, когда цены состоят из k единиц и N − k нулей.
Мм

Ответы:

6

Я также разместил это на вашем первоначальном вопросе о переполнении стека:


Задача является NP-полной для общего случая. Это может быть продемонстрировано с помощью сокращения на 3 раздела (который все еще является сильной NP-полной версией упаковки бункера).

Пусть w 1 , ..., w n будут весами объектов экземпляра с 3 разделами, пусть b будет размером бина, а k = n / 3 количество бинов, которые могут быть заполнены. Следовательно, существует 3 раздела, если объекты могут быть разделены таким образом, чтобы в бине было ровно 3 объекта.

Для сокращения мы устанавливаем N = kb, и каждый бин представлен b ценовыми метками одной и той же цены (представьте, что P i увеличивается с каждым b- м метком). Пусть t i , 1≤ ik , будет ценой меток, соответствующих i- му бину. Для каждого w i у нас есть один продукт S j количества w i + 1 (назовем это корневым продуктом w i ) и другой продукт w i - 1 количества 1, который должен быть дешевле, чем S j (Назовите эти продукты отпуска).

Для t i = (2b + 1) i , 1≤ ik , существует 3 раздела, если и только если Боб может продать за 2b Σ 1≤ ik t i :

  • Если существует решение для 3-секционного разбиения, то все продукты b, соответствующие объектам w i , w j , w l , которые назначены одному и тому же бину, могут быть помечены с одинаковой ценой без нарушения ограничений. Таким образом, решение имеет стоимость 2b Σ 1≤ ik t i (поскольку общее количество продуктов с ценой t i равно 2b ).
  • Рассмотрим оптимальное решение продажи Боба. Прежде всего обратите внимание, что в любом решении более 3 корневых продуктов имеют одинаковую ценовую метку, для каждого такого «слишком большого» корневого продукта есть более дешевый ценник, который привязан к менее чем 3 корневым продуктам. Это хуже, чем любое решение, если на одну ценовую марку приходится ровно 3 корневых продукта (если они существуют).
    Теперь все еще может быть решение о продаже Боба с 3 корневыми метками за цену, но их отпускные продукты не носят одинаковые ценовые метки (как бы сливаются корзины). Скажем , самая дорогая ценники этикетки корневого продукт ж I , который имеет более дешевый помеченные отпуска продукт. Это означает, что 3 корневых метки w i , w j , w lТеги с самой дорогой ценой не складываются до б . Следовательно, общая стоимость продуктов, помеченных по этой цене, составляет не менее 2b + 1 .
    Следовательно, такое решение имеет стоимость t k (2b + 1) + некоторую другую стоимость назначения. Поскольку оптимальная стоимость для существующего 3-разбиения составляет 2b Σ 1≤ ik t i , мы должны показать, что только что рассмотренный случай хуже. Это тот случай, если t k > 2b Σ 1≤ ik-1 t i (обратите внимание, что в сумме сейчас k-1 ). Настройка т я= (2b + 1) i , 1≤ ik , это так. Это также справедливо, если не самый дорогой ценник - «плохой», а любой другой.

Итак, это деструктивная часть ;-) Однако, если число различных ценников является постоянным, вы можете использовать динамическое программирование для его решения за полиномиальное время.

Геро Грайнер
источник
7

Это продолжение ответа Геро . Идея состоит в том, чтобы изменить его конструкцию, чтобы показать сильную NP-твердость.

Tязнак равно(2б+1)яTязнак равнояпзнак равно2бΣ1яКTя

веся-1пп

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

Ке(К)NО(1)NО(К)


Также кросс-пост на оригинальный вопрос переполнения стека.

Рико Джейкоб
источник
Я не могу принять два ответа, поэтому я просто должен поблагодарить вас за понимание :)
Владимир Пантелеев
0

Это звучит как вопрос теории игр. В этом случае очень простое решение для перебора:

Предположим, что ограничения представляют некоторые инварианты вида

S-> AkSBk | AkBkS | SAkBk

Решение состоит в том, чтобы продолжать добавлять сначала ограничения, а затем элементы. Например: скажем, n = 10, и есть 2 ограничения, A1B1 и A2B2. Затем есть три дочерних элемента к корневому узлу (уровень 2). У каждого из этих 3 узлов будет 7 дочерних уровня 3, у каждого из 21 - 6 на уровне 4 и т. Д. По сути, вы выполняете все возможные комбинации.

                A1B1 --- Уровень 1 
               / | \
              / | \
             / | \
            / | \
    A1A2B2A1 A1B1A2B2 A2B2A1B1 --- Уровень 2

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

CMR
источник