Система массового облуживания методом особых состояний
В лечебном санитарном центре выполняются процедуры 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
, но я не уверен, что правильно все сделал.
Источник: Stack Overflow на русском