Динамическое программирование: минимальные потери и минимальная партия

Я работаю над проектом, в котором мне нужно создать данные в таком оптимизированном формате, чтобы он не сильно замедлял фреймворк.
Проблема в:
Предположим, вы заказали 12 единиц из моего интернет-магазина продукта. И для этого продукта у меня есть 5 разных пачек предложить это большое количество от.
Предположим, что массив связок с серийный номер как ключ а также максимальное количество единиц, доступных в этом пакете в качестве значения как:

$arr = array(
array('sr_no1'=>5),
array('sr_no2'=>7),
array('sr_no3'=>2),
array('sr_no4'=>9),
array('sr_no5'=>12)
);

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

  1. должно быть минимальное количество потерь, как если бы вы заказывали 11 единиц, тогда вы бы дали 9 + 2-11 = 0 потерь вместо того, чтобы давать 12-11 = 1 потери
  2. значение должно быть выбрано из минимального количества лотов / пакетов, например, если вы заказываете 12 единиц, тогда 5 + 7-12 = 0 потерь и 12-12 = 0 потерь, поэтому мы выберем массив (‘sr_no5’ => 12) для раздавать запрошенное количество.

Я пытался найти решение за последние 3 дня.

Рассмотрим контрольные примеры для заказанного количества, равного 12, 11 или 6.
или 35 или 30 и т. д.

В результате мне нужны массивы, которые мы выберем для распределения величин, таких как массив (‘sr_no5’ => 12) для выдачи 12 единиц упорядоченного количества и массив массивов (‘sr_no3’ => 2), массив ( ‘sr_no4’ => 9) для выдачи 11 единиц количества.

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

ПРИМЕЧАНИЕ: все значения выше, как количество / единица заказа, нет. из
пучки
, Максимально доступная единица в каждой связке переменные и могут
изменить на любое нет. случаев.

1

Решение

Не уверен в алгоритме, но вы можете просмотреть все возможные результаты, назначив каждому пакету двоичный файл с 0 или 1. 11000 будет равно 5 + 7 + 0 + 0 + 0 (12), 00010 будет равно 0 + 0 + 0 + 9 +0 и т. Д.

Затем создайте мастер-массив на основе этого псевдо-двоичного значения и итоговой суммы.

Затем отфильтруйте по совпадению (или ближайшему совпадению) и посмотрите, какой из результатов имеет наименьшее количество единиц.
Это грубо, но будет работать.

0

Другие решения

Это похоже на алгоритм из 3 частей:

  1. Получить массив со всеми возможными комбинациями пакетов
  2. Отфильтруйте возможные решения: все решения, которые дают точно или больше элементов, чем необходимо
  3. Заказ по предпочтению ( PHP: сортировка массивов ):
    1. Сначала те с минимальными отходами
    2. Сначала те, которые тратят меньше количества связок
    3. Сначала те, которые тратят меньшие связки

Вы можете оптимизировать код, объединяющий части 1 а также 2, фильтрация возможных решений при создании массива. Вероятно, существует много возможных шаблонов программирования или даже библиотек для достижения такой цели. В зависимости от количества пакетов, влияющих на каждый случай, было бы слишком много, чтобы оптимизировать так много.

-1

По вопросам рекламы [email protected]