Или путешествующий продавец играет в Magic!
Я думаю, что это довольно интересная алгоритмическая задача. Любопытно, есть ли у кого-нибудь хорошие предложения по его решению или если он уже разрешен известным способом.
TCGPlayer.com продает коллекционные карточки для различных игр, в том числе Magic the Gathering. Вместо того, чтобы просто продавать карты из своего инвентаря, они на самом деле являются перепродавцами у нескольких поставщиков (50+). Каждый поставщик имеет различный инвентарь карт и другую цену за карту. Каждый поставщик также взимает фиксированную ставку для доставки (обычно). Учитывая все это, как можно найти лучшую цену за колоду карт (скажем, 40-100 карт)?
Просто найти лучшую цену для каждой карты не получится, потому что если вы закажете 10 карт из 10 разных поставщиков, тогда вы оплачиваете доставку 10 раз, но если вы закажете все 10 от одного поставщика, вы оплата доставки один раз.
В ту ночь я написал простой скребок HTML (используя HTML Agility Pack), который захватывает все разные цены для каждой карты, а затем находит всех продавцов, которые несут все карты в колоде, суммирует цены на карты у каждого поставщика и сортирует по цене. Это было очень легко. Общие цены оказались близкими к общей медианной цене для всех карт.
Я заметил, что некоторые из отдельных карт оказались намного выше средней цены. Это ставит вопрос о разделении заказа на несколько поставщиков, но только в том случае, если можно будет сэкономить достаточно денег, разделив заказ до покрытия дополнительной доставки (каждый добавленный поставщик добавит еще одну стоимость доставки).
Похоже, что лучшая цена, вероятно, будет включать только несколько разных поставщиков, но если карты достаточно дороги (и некоторые из них), тогда в теории упорядочение каждой карты у другого поставщика все равно может привести к экономии средств, чтобы оправдать всю дополнительную доставку.
Если бы вы решили заняться этим, как бы вы это сделали? Чистая грубая сила, определяющая все возможные комбинации комбинаций карт/поставщиков? Процесс, который, скорее всего, будет выполнен в моей жизни, по-видимому, будет включать методическую серию оценок по фиксированному числу итераций. У меня есть пара идей, но мне любопытно, что другие могут предложить.
Я больше ищу алгоритм, чем реальный код. В настоящее время я использую .NET, хотя это имеет значение.