package inventory;

/**
 * 
 * Алгоритм, моделирующий торговлю сохраняемым товаром.
 * 
 * В представленном алгоритме содержатся две ошибки!
 * Кроме того, содержатся ошибки как в формуле для наилучшего размера дневного запаса,
 * так и в представленной в конце формуле прибыли!
 * 
 * Created on 2022-03-18 14:56:09.
 * @author Alexander Mikhailovich Kovshov
 */
public class RandomDemandStore {
public static void main(String[] args) {
        System.out.println("Hello!");
        double x;            // дневной запас товара
        double p = 300;      // отпускная цена
        double q = 200;      // закупочная цена
        double r = 100;      // затраты на хранение ночью
        double a = 2;        // наименьшай спрос
        double b = 10;       // наибольший спрос
        int n = 10000000;    // число дней в численном опыте
        for (x = a; x <= b; x += 1) {       //Повторения для разного размера дневного запаса. 
            process(x, p, q, r, a, b, n);   //Статистческое вычисление среднедневной прибыли.
        } 
        x = b - (q / p) * (b - a) / 2;        //формула неправильная!
        System.out.println("максимум при х: " + x);
        process(x, p, q, r, a, b, n);
    }

    /**
     * Симуляция торговли со случайным спросом несохраняемого товара.
     * В алгоритме метода присутствуют две ошибки!
     * @param xдневной заказ
     * @param pотпускная цена
     * @param qзакупочная цена
     * @param rзатраты на хранение ночью
     * @param aнаименьшай спрос
     * @param bнаибольший спрос
     * @param n - число дней в численном опыте.
     */
    public static void process(double x, double p, double q, double r, double a, double b, int n) {
        double profit = 0;                          //Прибыль. Начальное значение нулевое.
        double z = 0;                               //Дневной остаток. Начальное значение нулевое.
        for (int i = 0; i < n; i++) {               //Многократное повторение торговых дней.
            double y = Math.random() * (b - a);     //Равномерный случайный спрос заданного разброса.
            y += a;                                 //Смещение значения спроса к левой границе.
            profit += -q * (x - z);                 //Вычет из прибыли затрат на закупку пополнения дневного запаса.
            if (y < x) {                            //Если спрос оказался меньше заказа,
                profit += p * y;                    //то прибыль увеличивается на выручку от удовлетворения спроса,
                z = x - y;                          //вычисляется сохраняемый остаток товара,
                profit -= r * z;                    //и из прибыли вычитаются затраты на хранение.
            } else {                                //Если спрос меньше заказа,
                profit += p * x;                    //то прибыль увеличивается на выручку от проданного запаса без остатка.
            }
        }
        profit /= n;                                //Средняя прибыль за торговый день.
        
        double h; 
        h = -q * (x - (x-a)/2)  +  p * x * (b - x) / (b - a)  +  (p * (a + x) / 2 - r) * (x - a) / (b - a);    //формула неправильная!
          
        System.out.println("x: " + x + ";  среднедневная прибыль: " + profit + ";  по формуле: " + h);
        
    }
}