Я задал этот вопрос о переполнении стека некоторое время назад: Проблема: продажа Боба . Кто-то предложил также разместить здесь вопрос.
Кто-то уже задавал вопрос, связанный с этой проблемой, здесь - минимальный вес леса данной мощности - но, насколько я понимаю, это не помогает мне с моей проблемой. На 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 )
Чтобы выполнить условия:
- P M A k ≤ P M B k , для 0≤ k <K
- Σ (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 пары вблизи экстремума, общая стоимость будет выше.
источник
Ответы:
Я также разместил это на вашем первоначальном вопросе о переполнении стека:
Задача является NP-полной для общего случая. Это может быть продемонстрировано с помощью сокращения на 3 раздела (который все еще является сильной NP-полной версией упаковки бункера).
Пусть w 1 , ..., w n будут весами объектов экземпляра с 3 разделами, пусть b будет размером бина, а k = n / 3 количество бинов, которые могут быть заполнены. Следовательно, существует 3 раздела, если объекты могут быть разделены таким образом, чтобы в бине было ровно 3 объекта.
Для сокращения мы устанавливаем N = kb, и каждый бин представлен b ценовыми метками одной и той же цены (представьте, что P i увеличивается с каждым b- м метком). Пусть t i , 1≤ i ≤ k , будет ценой меток, соответствующих i- му бину. Для каждого w i у нас есть один продукт S j количества w i + 1 (назовем это корневым продуктом w i ) и другой продукт w i - 1 количества 1, который должен быть дешевле, чем S j (Назовите эти продукты отпуска).
Для t i = (2b + 1) i , 1≤ i ≤ k , существует 3 раздела, если и только если Боб может продать за 2b Σ 1≤ i ≤ k t i :
Теперь все еще может быть решение о продаже Боба с 3 корневыми метками за цену, но их отпускные продукты не носят одинаковые ценовые метки (как бы сливаются корзины). Скажем , самая дорогая ценники этикетки корневого продукт ж I , который имеет более дешевый помеченные отпуска продукт. Это означает, что 3 корневых метки w i , w j , w lТеги с самой дорогой ценой не складываются до б . Следовательно, общая стоимость продуктов, помеченных по этой цене, составляет не менее 2b + 1 .
Следовательно, такое решение имеет стоимость t k (2b + 1) + некоторую другую стоимость назначения. Поскольку оптимальная стоимость для существующего 3-разбиения составляет 2b Σ 1≤ i ≤ k t i , мы должны показать, что только что рассмотренный случай хуже. Это тот случай, если t k > 2b Σ 1≤ i ≤ k-1 t i (обратите внимание, что в сумме сейчас k-1 ). Настройка т я= (2b + 1) i , 1≤ i ≤ k , это так. Это также справедливо, если не самый дорогой ценник - «плохой», а любой другой.
Итак, это деструктивная часть ;-) Однако, если число различных ценников является постоянным, вы можете использовать динамическое программирование для его решения за полиномиальное время.
источник
Это продолжение ответа Геро . Идея состоит в том, чтобы изменить его конструкцию, чтобы показать сильную NP-твердость.
Следовательно, заявленный выигрыш возможен только в том случае, если все конечные продукты имеют такой же приз, что и их корневой продукт, что означает, что существует 3 раздела.
Также кросс-пост на оригинальный вопрос переполнения стека.
источник
Это звучит как вопрос теории игр. В этом случае очень простое решение для перебора:
Предположим, что ограничения представляют некоторые инварианты вида
Решение состоит в том, чтобы продолжать добавлять сначала ограничения, а затем элементы. Например: скажем, n = 10, и есть 2 ограничения, A1B1 и A2B2. Затем есть три дочерних элемента к корневому узлу (уровень 2). У каждого из этих 3 узлов будет 7 дочерних уровня 3, у каждого из 21 - 6 на уровне 4 и т. Д. По сути, вы выполняете все возможные комбинации.
и вырастить дерево. Хотя с самого начала это выглядит как ужасное решение, я чувствую, что вы можете отказаться от погони за очень дорогими листьями, используя некоторую эвристику и обрезку ...
источник