Подтвердить что ты не робот

Электронная коммерция: алгоритм расчета скидок

Мне нужен экспертный совет по сложному вопросу.

Сценарий:

  • веб-сайт электронной коммерции
  • много продуктов
  • множество скидок, смешанных с этими продуктами.

Продукт идентифицируется уникальным ProductID и имеет торговую цену. Очень классический сценарий. Продукт также может иметь одну или несколько скидок.

Скидка может быть разных типов. Одним из примеров скидки является:

  • Купите два или более набора продуктов и получите X процентов от каждого продукта.

Позиция может иметь только одну скидку, поэтому после того, как позиция была уценена, она недоступна для других скидок.

Данные тестового примера:

  • Продукт-1: $10
  • Продукт-2: $10
  • Продукт-3: $50
  • Продукт-4: $100

Discount-A: купите два или более и получите 20% от любого из следующих продуктов.

  • Продукт-1
  • Продукт-2
  • Product-3
  • Product-4

Discount-B: купите продукт и получите 50% от следующего продукта

  • Продукт-3

Сценарий тестирования 1:

Корзина: содержит позиции с:

  • Product-1
  • Product-3
  • Product-4

Расчет # 1:

  • Скидка-A: Продукт-1, Продукт-3, Продукт-4 = $2 + $10 + $20 = $32
    • = общая сумма 32 $.

Расчет # 2:

  • Скидка-A: Продукт-2, Продукт-4 = $2 + $20 = $22
  • Скидка-B: Продукт-3 = $25
    • = $22 + $25 = $47 общая экономия

Это означает, что комбинация Discount-A и Discount-B предоставит наилучшую скидку для клиента.

Сценарий тестирования 2:

Корзина: содержит позиции с:

  • Product-3
  • Product-4

Расчет # 1:

  • Скидка-А: Продукт-3, Продукт-4 = $10 + $20 = $30
    • = общая сумма 30 долларов.

Расчет # 2:

  • Скидка-B: Продукт-3 = $25
    • = $25 общая экономия

Это означает, что применение Discount-A даст наилучшую скидку для клиента.


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

Обычно в корзине 30-40 позиций с каждой скидкой по 0-3.

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

В настоящее время алгоритм, который я применяю для скидок, - это что-то вроде:

  • Снимите скидки в корзине.
  • Получите все уникальные ProductID для LineItems в корзине
  • Получите все скидки для этих продуктов ProductID
  • Для каждой скидки (неупорядочен)
    • Применить скидку, если она удовлетворена позициями, не связанными со скидкой
      • Позиции флага со скидкой как дисконтированные

Но этого недостаточно, так как он не тестирует различные комбинации позиций/скидок.

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

Надеюсь услышать от вас:)

4b9b3361

Ответ 1

Предполагая, что:

  • Вы можете рассчитать все доступные скидки на основе вашей корзины.
  • В каждом продукте может быть применена только одна скидка
  • Каждая скидка может быть использована только раз

Тогда проблема становится такой, которая называется проблемой assignment и может быть оптимально решена в O (n ^ 3) с помощью венгерский алгоритм.

Вам нужно будет вычислить матрицу M [a, b], содержащую деньги, сэкономленные при использовании скидки a на продукте b. (Если скидка не применяется, установите деньги в 0.)

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

Если у вас нет одинакового количества скидок и продуктов, добавьте фиктивные скидки (с нулевой экономией) или фиктивные продукты (опять же с нулевой экономией), пока количество скидок не будет соответствовать количеству продуктов.