Система массового облуживания методом особых состояний

Рейтинг: 1Ответов: 0Опубликовано: 01.07.2023

В лечебном санитарном центре выполняются процедуры 2х типов. Поток пациентов является простейшим с математическим ожиданием 2 минуты.

Пациенты могут быть 3х типов:

  • 1 тип выполняет только первую процедуру, таких 10 процентов;
  • 2 тип – только вторую процедуру, таких 15 процентов;
  • 3 тип – остальные, и выполняет сначала первую, а потом вторую.

Время процедуры подчиняется нормальному закону с параметрами:

  • m1=10 минут, σ1=2мин.;
  • m2=15 минут, σ =3мин.

После выполнения прибором 10 процедур, он останавливается на 20 минут. В потоке с вероятностью 0.1 могут приходить те пациенты, которых обслуживают без очереди. Стоимость приборов:

  • 1 типа – 54 000 руб.;
  • 2 типа – 66 000 руб.

Мой код на языке С:

double generateNormalRandomNumber(double mean, double stddev) {
    double u1 = rand() / (double)RAND_MAX;
    double u2 = rand() / (double)RAND_MAX;
    double z = sqrt(-2.0 * log(u1)) * cos(2.0 * 3.14 * u2);
    return mean + stddev * z;
}

int main() {
    srand(time(NULL));
    setlocale(LC_ALL, "rus");
    // Параметры модели
    int numIterations;
    printf("Введите количество итераций: ");
    scanf_s("%d", &numIterations);
   
    double lambda = 1.0 / 2.0; // Поток пациентов (2 пациента в минуту)
    double p1 = 0.1; // Вероятность прихода пациента 1 типа без очереди

    // Параметры времени процедур
    double m1 = 10.0, sigma1 = 2.0; // Первая процедура
    double m2 = 15.0, sigma2 = 3.0; // Вторая процедура

    // Стоимость приборов
    int cost1 = 54000;
    int cost2 = 66000;

    // Счетчики для статистики
    int numPatients = 0;
    int numPatientsType1 = 0;
    int numPatientsType2 = 0;
    int numPatientsType3 = 0;
    int totalTime = 0;
    int totalCost = 0;

    double timeSinceLastPatient, interarrivalTime;
    double time1, time2;

    for (int i = 0; i < numIterations; i++) {
        timeSinceLastPatient -= 1.0; // Считаем время
        if (timeSinceLastPatient <= 0.0) {
            // Пришел новый пациент
            // Генерация типа пациента
            double patientType = (double)rand() / (double)RAND_MAX;
            printf("Прошло %.2f мин\n",interarrivalTime);
            if (patientType < p1) {
                // Пациент 1 типа
                numPatients++;
                numPatientsType1++;
                totalCost += cost1;
                time1 = generateNormalRandomNumber(m1, sigma1);
                totalTime += time1;
                printf("Пришёл пациент 1-го типа.\nВремя обслуживания текущего пациента: %.2f мин\n", time1);
            }
            else if (patientType < 0.1 + p1) {
                // Пациент 2 типа 
                numPatients++;
                numPatientsType2++;
                totalCost += cost2;
                time2 = generateNormalRandomNumber(m2, sigma2);
                totalTime += time2;
                printf("Пришёл пациент 2-го типа.\nВремя обслуживания текущего пациента: %.2f мин\n", time2);

            }
            else {
                // Пациент 3 типа
                numPatients++;
                numPatientsType3++;

                // Генерация времени выполнения первой процедуры
                time1 = generateNormalRandomNumber(m1, sigma1);

                // Генерация времени выполнения второй процедуры
                time2 = generateNormalRandomNumber(m2, sigma2);

                totalTime += time1 + time2;
                totalCost += cost1 + cost2;
                printf("Пришёл пациент 3-го типа.\nВремя обслуживания текущего пациента: %.2f мин\n", time1 + time2);
            }

            // Проверка на остановку прибора
            if (numPatients % 10 == 0) {
                totalTime += 20;
            }

            // Генерация времени до следующего прихода пациента
            printf("Общее время обслуживания пациентов: %.2f мин\n", (double)totalTime+interarrivalTime);
            printf("Количество обслуженных пациентов: %d\n", numPatients);
            printf("Количество пациентов 1 типа: %d\n", numPatientsType1);
            printf("Количество пациентов 2 типа: %d\n", numPatientsType2);
            printf("Количество пациентов 3 типа: %d\n", numPatientsType3);
            printf("Среднее время обслуживания одного пациента: %.2f мин\n", (double)totalTime / (double)numPatients);
            printf("Общая стоимость обслуживания: %d рублей\n\n", totalCost);
            interarrivalTime = -log(1.0 - ((double)rand() / (double)RAND_MAX)) / lambda;
            timeSinceLastPatient = interarrivalTime;
        }
    }
    return 0;
}

Как правильно реализовать: "поток пациентов является простейшим с математическим ожиданием 2 минуты"? Для этого у меня есть переменные timeSinceLastPatient и interarrivalTime, но я не уверен, что правильно все сделал.

Ответы

Ответов пока нет.