Решения различных примеров задачи ежемесячного планирования закупок
при заданных cпросе, предложении, ценах, затратах на хранение методом 
динамического программирования, воплощённом в java-классе InventoryModel1.


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


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

        int n = 3;                            //число промежутков времени (месяцев)
        int max = 10;                         //наибольшее значение для остатка на складе
        double[] inprice =  { 5,  5,  5,  };  //цены закупочные за каждый месяц              
        double[] outprice = { 9,  9,  9,  };  //цены отпускные за каждый месяц		
        double[] store =    { 1,  1,  1,  };  //стоимость хранения единицы товара за каждый месяц
        int[]    need =     { 6,  6,  6,  };  //потребность за каждый месяц

=========== План закупок ===============
1; Остаток на начало: 0; Остаток на конец: 0; Потребление: 6; Закупки: 6
2; Остаток на начало: 0; Остаток на конец: 0; Потребление: 6; Закупки: 6
3; Остаток на начало: 0; Остаток на конец: 0; Потребление: 6; Закупки: 6
Прибыль 72.0

###########################################################################################
Низкие закупочные цены в первом месяце побуждают полностью заполнить склад, пополнив его
в третьем месяце до удовлетворения спроса. 

        int n = 3;                            //число промежутков времени (месяцев)
        int max = 10;                         //наибольшее значение для остатка на складе
        double[] inprice =  { 1,  5,  5,  };  //цены закупочные за каждый месяц              
        double[] outprice = { 9,  9,  9,  };  //цены отпускные за каждый месяц		
        double[] store =    { 1,  1,  1,  };  //стоимость хранения единицы товара за каждый месяц
        int[]    need =     { 6,  6,  6,  };  //потребность за каждый месяц

=========== План закупок ===============
1; Остаток на начало: 0; Остаток на конец: 10; Потребление: 6; Закупки: 16
2; Остаток на начало: 10; Остаток на конец: 4; Потребление: 6; Закупки: 0
3; Остаток на начало: 4; Остаток на конец: 0; Потребление: 6; Закупки: 2
Прибыль 122.0

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

        int n = 3;                            //число промежутков времени (месяцев)
        int max = 10;                         //наибольшее значение для остатка на складе
        double[] inprice =  { 1,  3,  5,  };  //цены закупочные за каждый месяц              
        double[] outprice = { 9,  9,  9,  };  //цены отпускные за каждый месяц		
        double[] store =    { 1,  1,  1,  };  //стоимость хранения единицы товара за каждый месяц
        int[]    need =     { 6,  6,  6,  };  //потребность за каждый месяц


=========== План закупок ===============
1; Остаток на начало: 0; Остаток на конец: 10; Потребление: 6; Закупки: 16
2; Остаток на начало: 10; Остаток на конец: 6; Потребление: 6; Закупки: 2
3; Остаток на начало: 6; Остаток на конец: 0; Потребление: 6; Закупки: 0
Прибыль 124.0

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

        int n = 3;                            //число промежутков времени (месяцев)
        int max = 10;                         //наибольшее значение для остатка на складе
        double[] inprice =  { 3,  1,  5,  };  //цены закупочные за каждый месяц              
        double[] outprice = { 9,  9,  9,  };  //цены отпускные за каждый месяц		
        double[] store =    { 1,  1,  1,  };  //стоимость хранения единицы товара за каждый месяц
        int[]    need =     { 6,  6,  6,  };  //потребность за каждый месяц


============ План закупок ===============
1; Остаток на начало: 0; Остаток на конец: 0; Потребление: 6; Закупки: 6
2; Остаток на начало: 0; Остаток на конец: 6; Потребление: 6; Закупки: 12
3; Остаток на начало: 6; Остаток на конец: 0; Потребление: 6; Закупки: 0
Прибыль 126.0

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

        int n = 3;                            //число промежутков времени (месяцев)
        int max = 10;                         //наибольшее значение для остатка на складе
        double[] inprice =  { 3,  1,  5,  };  //цены закупочные за каждый месяц              
        double[] outprice = { 9,  9,  9,  };  //цены отпускные за каждый месяц		
        double[] store =    { 1,  1,  1,  };  //стоимость хранения единицы товара за каждый месяц
        int[]    need =     { 6,  6,  6,  };  //потребность за каждый месяц


=========== План закупок ===============
1; Остаток на начало: 5; Остаток на конец: 0; Потребление: 6; Закупки: 1
2; Остаток на начало: 0; Остаток на конец: 6; Потребление: 6; Закупки: 12
3; Остаток на начало: 6; Остаток на конец: 0; Потребление: 6; Закупки: 0
Прибыль 138.5


###########################################################################################
Ещё большее увеличение начального запаса увеличивает прибыль ещё больше, однако это происходит не всегда.

        int n = 3;                            //число промежутков времени (месяцев)
        int max = 10;                         //наибольшее значение для остатка на складе
        double[] inprice =  { 3,  1,  5,  };  //цены закупочные за каждый месяц              
        double[] outprice = { 9,  9,  9,  };  //цены отпускные за каждый месяц		
        double[] store =    { 1,  1,  1,  };  //стоимость хранения единицы товара за каждый месяц
        int[]    need =     { 6,  6,  6,  };  //потребность за каждый месяц


=========== План закупок ===============
1; Остаток на начало: 9; Остаток на конец: 3; Потребление: 6; Закупки: 0
2; Остаток на начало: 3; Остаток на конец: 6; Потребление: 6; Закупки: 9
3; Остаток на начало: 6; Остаток на конец: 0; Потребление: 6; Закупки: 0
Прибыль 139.5

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

        int n = 3;                            //число промежутков времени (месяцев)
        int max = 10;                         //наибольшее значение для остатка на складе
        double[] inprice =  { 3,  1,  5,  };  //цены закупочные за каждый месяц              
        double[] outprice = { 9,  9,  9,  };  //цены отпускные за каждый месяц		
        double[] store =    { 2,  1,  1,  };  //стоимость хранения единицы товара за каждый месяц
        int[]    need =     { 6,  6,  6,  };  //потребность за каждый месяц


=========== План закупок ===============
1; Остаток на начало: 9; Остаток на конец: 3; Потребление: 6; Закупки: 0
2; Остаток на начало: 3; Остаток на конец: 6; Потребление: 6; Закупки: 9
3; Остаток на начало: 6; Остаток на конец: 0; Потребление: 6; Закупки: 0
Прибыль 133.5

###########################################################################################
Уменьшение начального запаса при больших затратах на хранение даёт увеличение прибыли.

        int n = 3;                            //число промежутков времени (месяцев)
        int max = 10;                         //наибольшее значение для остатка на складе
        double[] inprice =  { 3,  1,  5,  };  //цены закупочные за каждый месяц              
        double[] outprice = { 9,  9,  9,  };  //цены отпускные за каждый месяц		
        double[] store =    { 2,  1,  1,  };  //стоимость хранения единицы товара за каждый месяц
        int[]    need =     { 6,  6,  6,  };  //потребность за каждый месяц


=========== План закупок ===============
1; Остаток на начало: 5; Остаток на конец: 0; Потребление: 6; Закупки: 1
2; Остаток на начало: 0; Остаток на конец: 6; Потребление: 6; Закупки: 12
3; Остаток на начало: 6; Остаток на конец: 0; Потребление: 6; Закупки: 0
Прибыль 136.0


###########################################################################################

        
На главную страницу.