Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
0 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 75

Очередь в кассу (система массового обслуживания)

12.09.2018, 19:22. Показов 4482. Ответов 5

Студворк — интернет-сервис помощи студентам
Нужно смоделировать очередь в кассу. Порядок следующий:
Каждый час приходит примерно 40 человек (экспоненциально). Кассир может обслужить 30 (экспоненциально). Человек приходит, становится в очередь. Больше трёх человек в очередь нельзя. В этом случае человек отправляется ко второму кассиру, а если у него тоже вся очередь занята, то домой.
Приходит, становится в очередь, обслуживается. Здесь я хотел показать процесс работы кассира: когда к нему подошли, сколько он обслуживал, когда принял второго и т.д. А получается не совсем верно.

Вот программа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "math.h"
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include <random>
#include <queue>
using namespace std;
const double L = 0.01111111111;
 
void main()
{
    setlocale(LC_ALL, "Russian");
 
    queue<int>O1;
    queue<int>O2;
 
    double i = 0;
    int a = 0;
    int j = 1;
    int k = 0;
    int z = 0;
    int zan = 0;
 
    //40 сотрудников в час = 1 сотрудник в 1,5 минуты (в 90 секунд), лямбда (L) = 0,01111111111
 
    cout << "Отчёт по первому кассиру:";
    cout << endl;
    while (i <= 3600)
    {
 
        random_device rd;
        mt19937 gen{ rd() };
        exponential_distribution<> ed{ 1.0 / 90 };
        i += ed(gen);
 
        cout << j << " Сотрудник пришёл на " << i << " секунде";
        O1.push(k);
        k++;
 
        random_device rd2;
        mt19937 gen2{ rd2() };
        exponential_distribution<> ed2{ 1.0 / 120 };
        a += ed2(gen2);
 
        cout << " --> Сотрудник обслуживался " << ed2(gen2) << " секунд";
        
        if (k > 3){
            k = 0;
            z++;
            cout << " --> Вся очередь занята";
        }
        else
        {
            cout << " --> В очереди " << k << " человек";
        }
 
        O2.push(z);
        z++;
        if (z > 3){
            z = 0;
            zan++;
        }
 
        
        cout << endl;
        j++;
    }
    cout << endl;
    cout << "Отправлено домой " << zan << " человек";
    cout << endl;
}
Надо, чтобы отображались верные данные. А тут и очередь какая-то правильная, и людей приходит много (больше, чем надо). На скрине обрезано, а так около 50 получается.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.09.2018, 19:22
Ответы с готовыми решениями:

Система массового обслуживания
Доброй ночи! Препод задал такую задачу: &quot; Система массового обслуживания состоит из обслуживающего аппарата (ОА) и очереди заявок двух...

Система массового обслуживания с отказами (Dev C++)
помогите, смоделировать система масового обслуживания с отказами на обычном dev C++

Посчитать время события - время работы кассиров (система массового обслуживания)
Есть программа, моделирующая следующую задачу (система массового обслуживания): В бухгалтерии предприятия имеются два кассира, каждый...

5
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
13.09.2018, 01:31
Первым делом определи список событий, необходимых для реализации процесса.
Например, "человек входит в зал", "кассир закончил/начал работу с клиентом" и т.д.
Некоторые из этих событий нужно будет помещать в общий ряд. Другие стоит обрабатывать независимо.

Вообщем без изысков можно написать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
#include <queue>
#include <random>
 
enum class EventType { In, OutFrom1, OutFrom2 };
 
struct Event {
  uint64_t time;
  EventType type;
};
 
bool operator>(const Event &l, const Event &r)
{
  return l.time > r.time;
}
 
int main()
{
  uint64_t t = 0;
  const uint64_t max_t = 4 * 60 * 60;
  std::random_device rd;
  std::mt19937 gen(rd());
  std::exponential_distribution<> ed_in{1.0 / 90};
  std::exponential_distribution<> ed_out{1.0 / 120};
  std::priority_queue<Event, std::vector<Event>, std::greater<Event>>
      events;
  size_t cashbox1_queue_size = 0;
  bool cashbox1_in_use = false;
  size_t cashbox2_queue_size = 0;
  bool cashbox2_in_use = false;
 
  while (t < max_t) {
    t += ed_in(gen);
    events.push({t, EventType::In});
  }
 
  while (!events.empty()) {
    auto e = events.top();
    events.pop();
    std::cout << e.time << " ";
    if (e.type == EventType::In) {
      std::cout << "В зал вошёл клиент. ";
      if (cashbox1_queue_size < 3) {
        ++cashbox1_queue_size;
        std::cout << "Он всал в очередь к первому окну\n";
      }
      else if (cashbox2_queue_size < 3) {
        ++cashbox2_queue_size;
        std::cout << "Он всал в очередь ко второму окну\n";
      }
      else {
        std::cout << "И тут же вышел...\n";
      }
    }
    else if (e.type == EventType::OutFrom1) {
      --cashbox1_queue_size;
      cashbox1_in_use = false;
      std::cout << "От первого окна ушёл клиент\n";
    }
    else if (e.type == EventType::OutFrom2) {
      --cashbox2_queue_size;
      cashbox2_in_use = false;
      std::cout << "От второго окна ушёл клиент\n";
    }
 
    if ((!cashbox1_in_use) && (cashbox1_queue_size > 0)) {
      events.push(
          {e.time + (uint64_t)ed_out(gen), EventType::OutFrom1});
      cashbox1_in_use = true;
      std::cout
          << e.time
          << " Кассир в первом окне начинает работу с клиентом\n";
    }
    if ((!cashbox2_in_use) && (cashbox2_queue_size > 0)) {
      events.push(
          {e.time + (uint64_t)ed_out(gen), EventType::OutFrom2});
      cashbox2_in_use = true;
      std::cout
          << e.time
          << " Кассир во втором окне начинает работу с клиентом\n";
    }
  }
 
  return 0;
}
0
0 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 75
13.09.2018, 09:21  [ТС]
Целая куча ошибок теперь возникает...
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
13.09.2018, 10:50
Попробуй:

C++
1
2
#include <cstdint>
#include <functional>
0
0 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 75
13.09.2018, 16:05  [ТС]
Спасибо. Сейчас буду делать, чтобы считалось, сколько обслужил один кассир, сколько другой, сколько пришло, скольким отказано полностью... и дальше уже по параметрам. Получится?

Добавлено через 4 часа 56 минут
А вот теперь у меня такой нестандартный вопрос:
КАК посчитать, СКОЛЬКО времени кассир потратил на ОБСЛУЖИВАНИЕ всех клиентов? Именно сколько времени он работал.

C++
1
2
3
4
5
6
if ((!cashbox1_in_use) && (cashbox1_queue_size > 0)) {
            events.push(
            { e.time + (uint64_t)ed_out(gen), EventType::OutFrom1 });
            cashbox1_in_use = true;
            //cout << e.time << " Кассир в первом окне начинает работу с клиентом\n";
        }
Я так полагаю, что здесь надо написать что-то вроде k1_time += ed_out(gen);
Но тогда у нас для подсчёта будет ещё раз сгенерировано. А нужно просуммировать УЖЕ сгенерированные временные отрезки.
0
0 / 0 / 0
Регистрация: 01.12.2017
Сообщений: 5
20.03.2020, 22:56
Корлет, подсчитал?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.03.2020, 22:56
Помогаю со студенческими работами здесь

Теория массового обслуживания
задание: Пусть имеется обслуживающая система из n обслуживающих аппара-тов. Работа этой системы разбита на такты. В течение одного...

Программа с системами массового обслуживания
Здравствуйте. Нужна помощь с программой. Не хочет запускаться #include &lt;stdio.h&gt; #include &quot;stdafx.h&quot; #include...

Нужно выявить ошибку (задача на систему массового обслуживания)
Дана такая задача: Проблема в сделанном коде в том, что программа выводит уж явно неверные значения для текущего и среднего кол-ва...

Моделирование систем массового обслуживания метод монте карло
привет всем.это моделирование систем массового обслуживания метод монте карло можете подсказать что тут не правльно ...

Как в системе массового обслуживания сделать две очереди (два кассира) и ограничить их?
Есть такая программа на С++: #include &quot;math.h&quot; #include &lt;iostream&gt; #include &quot;stdio.h&quot; #include &quot;stdlib.h&quot; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru