2013-05-11 5 views
2

Я работаю на модуль доставки для вина, и было интересно, если кто-то может дать мне руку - в основном:PHP - самая низкая стоимость на основе случае размеры

Вино может быть погружено в случаях 8, 12 или 15 бутылок, каждая со своей ценой. Модуль должен принять общее количество бутылок в заказе и разработать, какая комбинация случаев дает самую низкую цену. Например, в порядке, равном 31 бутылке, самая низкая цена составляет 1 случай 15 и два случая 8 (вместо 2 случаев 15 и 1 из 8, или 2 из 12 и один из 8). В настоящее время у меня есть следующий, который почти работает, но пропускает несколько возможных комбинаций

foreach ($rates as $case_size => $case_price) 
    { 
     $price = floor($total_bottles/$case_size) * $case_price; 
     $rem = $total_bottles % $case_size; 
     if($rem > 12) 
     { 
     //needs to use another case of 15 
     $price = $price + $rates[15]; 
     } 
     elseif($rem > 8) 
     { 
     //needs an extra case of 12 
     $price = $price + $rates[12]; 
     } 
     elseif($rem > 0) 
     { 
     //needs an extra case of 8 
     $price = $price + $rates[8]; 
     } 
     $quotes[] = $price; 
    } 

    return min($quotes); 
+0

Кажется немного лишним. Если клиент А купил 27 бутылок, и программа выяснила, как вставить его, тогда у вас есть ответ для всех будущих клиентов, которые заказывают 27 бутылок. Нет необходимости пересчитывать снова и снова. Я бы использовал раскладной лист или что-то, чтобы узнать, что лучше всего работает, а затем использовать массив с параметрами. – RST

+0

Я вижу вашу точку зрения, но в каждой стране есть свой набор ставок для каждого размера каждого случая, поэтому он становится немного сложным. На самом деле не нужно составлять таблицу для каждой страны для каждого возможного количества заказа. Конечно, это способ сделать это программно – Dave

+0

Итак, сделайте поиск, используя количество бутылок и целевую страну в качестве входных данных.Не должно быть слишком сложно создать таблицу поиска. С другой стороны: действительно ли нужно оптимизировать это до максимума в пользу клиента? – Sven

ответ

0

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

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

function fit_case($number, $case_size) { 
    $rem = $number % $case_size; 
    $next_size=magic_voodo0(); 
    if($rem==0) {  //if perfectly fills it you're done 
      return ($number/$case_size)*$rates[$case_size]; 
    } else if(($rem % $next_size)/$next_size>.5) {    
    //if over 50% fills the next case add the next smaller case 
      return floor($number/$case_size)*$rates[$case_size]+fit_case($rem, $next_size); 
     } else {  //otherwise back off 1 of the biggest cases, and fill the rest 
     return (floor($number/$case_size)-1)*$rates[$case_size]+fit_case($rem, $next_size); 

Надеюсь, что это поможет.

+0

Это все равно приведет к использованию ящиков 2x15 и 1x8. Хотя он заявил, что в этом случае коробки 1x15 и 2x8 будут дешевле. – RST

+0

Это не приведет к коробкам 2X15 и 1x8. Остальная часть будет меньше 50% от 8-го случая, поэтому алгоритм будет использовать 1 менее 15 случаев и заполнит остальные 8 случаями. Таким образом, вы останетесь с 1X15 и 2X8. – Micah

+1

Вы правы, но я думаю, что вместо этого он будет использовать 12 бутылок. – RST

0

Различные подход. Используйте таблицу поиска, которая имеет все комбинации ящиков для определенного количества бутылок.

  • 1 бутылка - 8
  • ...
  • 31 бутылка - 15-8-8,15-15-8,8-8-8-8, и так далее
  • и так на

Используйте другой таблицы поиска для различных скоростей в коробке на страну

в функции

  • прибудет строка таблицы цен стран
  • получить различные комбинации для числа бутылок
  • сделать петлю Еогеаспа на комбинации
  • сохранить цену и сочетание первого цикла к переменному
  • сравнить цены следующий цикл с сохраненным значением
  • , если она ниже, за исключением цены и комбинация/если нет, то по-прежнему
  • петли через все комбинации
  • RET urn самая низкая цена/полевая комбинация

 Смежные вопросы

  • Нет связанных вопросов^_^