Форум программистов, компьютерный форум CyberForum.ru

Система массового обслуживания - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Quadrillionaire
13 / 13 / 1
Регистрация: 09.03.2013
Сообщений: 180
18.12.2013, 22:07     Система массового обслуживания #1
Доброй ночи! Препод задал такую задачу:
" Система массового обслуживания состоит из обслуживающего аппарата (ОА) и очереди заявок двух типов.
Заявки первого типа поступают в "хвост" очереди по случайному закону с интервалом времени Т1, равномерно распределенным от 0 до 5 единиц времени. В ОА они поступают из "головы" очереди по одной и обслуживаются также равновероятно за время Т2 от 9 до 4 единиц времени, после чего покидают систему.
Единственная заявка второго типа постоянно обращается в системе, обслуживаясь в ОА равновероятно за время Т2 и возвращаясь в очередь не далее 4-й позиции от "головы". В начале процесса заявка 2-го типа входит в ОА, оставляя пустую очередь.
Смоделировать процесс обслуживания первых 1000 заявок 1-го типа, выдавая после обслуживания каждых 100 заявок информацию о текущей и средней длине очереди, а в конце процесса - общее время моделирования и количества вошедших в систему и вышедших из нее заявок 1-го типа."
Проблема в том, что весь вечер мучаюсь с ней. Не могу понять, что из чего следует. Был бы очень признателен за помощь!

Добавлено через 21 минуту
Вот код, который был написан..но чувствую я, что она работает неправильно, так как в ответе выдает, что обработано из 1000 заявок 1-го типа все 1000, что в принципе быть не может.
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
86
87
88
89
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <locale>
 
using namespace std;
 
double Rand(int);
void OA(int &line, int &Exit, int &OASUM);
void Torder(double &t1, double &t2, int &line, int &Exit, int &OASUM, double &AllTime);
 
int main()
{
    srand(time(NULL));
    setlocale (LC_ALL,"Russian");
    int order = 0,Exit = 0,summ_oa = 0; ///очередь, Заявки которые вышли из системы, Заявок обработалось
    double time_xvost = Rand(5),time_tail = Rand(4); ///Время поступления заявок в хвост, Время обслужающего аппарата,
    double LineSum = 0,LineChanges = 0; ///Сумма очередей для посчета средней очереди,Кол-во раз изменения длины очереди
    double All_time = time_xvost; ///Общее время моделирования
 
    while (Exit != 1000)
    {
        Torder(time_xvost, time_tail, order, Exit, summ_oa,All_time);
        LineSum += order;
        LineChanges++;
        if ((Exit % 100) == 0)
        {
                cout<<"В очереди: "<<Exit<<" заявок"<<endl;
                cout<<"Средняя длина очереди: "<<LineSum/LineChanges<<endl;
                cout<<Exit<<" заявок вышло из системы"<<endl<<endl;
        }
    }
 
    cout<<endl<<"Общее время моделирования: "<<All_time<<" е.в."<<endl;
    cout<<endl<<Exit<<" заявок 1-го типа вышло из системы"<<endl;
    cout<<order+Exit<<" заявок 1-го типа вошло в систему";
 
 
    //cout<<endl<<"В системе обработалось "<<OASUM;
    return 0;
}
 
 
double Rand(int num)
{
    return rand()*1.0/RAND_MAX*num;
}
void Torder(double &t1, double &t2, int &line, int &Exit, int &OASUM, double &AllTime)
{
    if (t1 > t2)
    {
        if (line == 0)
        {
            line++;
            t1 = Rand(5);
            t2 = Rand(4);
            AllTime += t1;
        }
 
        if (line > 0)
        {
            t1 -= t2;
            OA(line,Exit, OASUM);
        }
        t2 = Rand(4);
    }
 
    if (t1 < t2)
    {
        line++;
        t2 -= t1;
        t1 = Rand(5);
        AllTime += t1;
    }
    if (t1 == t2)
    {
        line++;
        OA(line,Exit, OASUM);
        t1 = Rand(5);
        t2 = Rand(4);
        AllTime += t1;
    }
}
void OA(int &line, int &Exit, int &OASUM)
{
        OASUM++;
        line--;
        Exit++;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2013, 22:07     Система массового обслуживания
Посмотрите здесь:

C++ Указать номер того человека, для обслуживания которого потребовалось минимальное время
Теория массового обслуживания C++
Стратегии обслуживания жесткого диска C++
C++ система масового обслуживания с отказами на обычном dev C++
C++ У прилавка выстроилась очередь из N покупателей. Время обслуживания продавцом каждого покупателя в
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
18.12.2013, 22:45     Система массового обслуживания #2
Quadrillionaire, так вам же надо с очередью работать.
std::queue или свою написать.

А вот это не пойму что значит .
Цитата Сообщение от Quadrillionaire Посмотреть сообщение
и возвращаясь в очередь не далее 4-й позиции от "головы".
Не подскажите ?
Quadrillionaire
13 / 13 / 1
Регистрация: 09.03.2013
Сообщений: 180
18.12.2013, 23:03  [ТС]     Система массового обслуживания #3
Цитата Сообщение от MrCold Посмотреть сообщение
Не подскажите ?
Имеется ввиду, что когда ОА не успевает обслужить заявку, она помещается в очередь и заявка должна быть не дальше 4-го места от ОА, то есть заявка этого типа, должна в крайнем случае подойти 4-й к ОА. И очередь, нужно писать самому. Вот в этом и заключается загвоздка...
Quadrillionaire
13 / 13 / 1
Регистрация: 09.03.2013
Сообщений: 180
18.12.2013, 23:51  [ТС]     Система массового обслуживания #4
Написал код заново, но не могу понять, почему результат работы выглядит вот так:
Система массового обслуживания
Вот сам код:
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
86
87
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <locale>
 
using namespace std;
 
double RandD(int);
int RandI(int);
void OA(int &ochered,int &z1_in,int &z1_out,double &t1,double &t2,double &AT,double &sr_izm,double &sr_summ);
int main()
{
    srand(time(NULL));
    setlocale (LC_ALL,"Russian");
    
    int summa_zayavok_1_tipa=0, ochered=0, z1_in,z1_out,z2_time=0,n2=0;//где z1_in,z1_out - это количество вошедших и вышедших из системы 
//заявок 1 типа, z2_time - время обработки заявки второго типа, а n2 его место в очереди.
    double t1=RandD(5),t2=RandD(4), all_times=0, sr_izm=0, sr_summ=0; //t1-время поступления заявки в очередь, t2 - время поступления заявки в //ОА, all_times - общее время моделирования, sr_izm и sr_summ - количество изменений очереди и сумма очереди (для вывода средней длины очр.)
 
    z2_time=RandD(4);
    n2=RandI(4);
    all_times+=z2_time;
    sr_summ++;
    while (summa_zayavok_1_tipa!=1000)
    {
        if(n2==-10)
            n2=RandI(4);
        else n2--;
        if(n2!=0)
        {
            OA(ochered, z1_in, z1_out, t1, t2, all_times,sr_izm,sr_summ);
            summa_zayavok_1_tipa++;
        }
        else
        {
            z2_time=RandD(4);
            all_times+=z2_time;
            sr_summ--;
            n2=-10;
        }
        if ((summa_zayavok_1_tipa%100)==0)
        {
            cout << "В очереди: " << summa_zayavok_1_tipa << " заявок" <<endl;
            cout << "Средняя длина очереди: " << sr_summ/sr_izm <<endl;
        }
    }
    cout << "Общее время моделирования: " << all_times <<endl;
    cout << "Количество вошедших заявок 1-го типа:" << z1_in<< endl;
    cout << "Количество вышедших заявок 1-го типа:" << z1_out << endl;
 
    return 0;
}
 
 
double RandD(int num)
{
    return rand()*1.0/RAND_MAX*num;
}
int RandI(int num_int)
{
    return rand()*1.0/RAND_MAX*num_int;
}
void OA(int &ochered,int &z1_in,int &z1_out,double &t1,double &t2,double &AT,double &sr_izm,double &sr_summ)
{
    t1=RandD(5);
    t2=RandD(4);
    if (t1>t2)
    {
        ochered++;
        sr_summ++;
        z1_in++;
    } else if(t1<t2)
            {
                ochered--;
                sr_izm++;
                AT+=t2;
                z1_out++;
            }
                else if(t1==t2)
                     {
                        sr_summ++;
                        sr_izm++;
                        AT+=t2;
                        z1_out++;
                        z1_in++;
                     }
}
Сразу извиняюсь за качество кода, просто тороплюсь сдать прогу. Нужно сделать до завтрашнего утра. Пожалуйста помогите найти ошибку(и)...
Quadrillionaire
13 / 13 / 1
Регистрация: 09.03.2013
Сообщений: 180
19.12.2013, 11:22  [ТС]     Система массового обслуживания #5
P.S. Модераторы, можете перенести тему в категорию для экспертов, может там быстрее помогут=(
Доработав прогу, вот какой она стала..
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
86
87
88
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <locale>
 
using namespace std;
 
double RandD(double l, double r);//функция вещественного рандома
int RandI(int);//функция целочисленного рандома
void OA(int &ochered,int &z1_in,int &z1_out,double &t1,double &t2,double &AT,double &sr_izm,double &sr_summ, int &summ); //обслуживающий аппарат
int main()
{
    srand(time(NULL));
    setlocale (LC_ALL,"Russian");
    
    int summa_zayavok_1_tipa=0, ochered=0, z1_in=0,z1_out=0,n2=0,count=0;//z1_in(z1_out) - количество вошедших (и вышедших) заявок 1-го типа,n2 - место в очереди заявки 2 типа
    double t1=RandD(0,5),t2=RandD(0,4), all_times=0, sr_izm=0, sr_summ=0,z2_time=0;//sr_summ и sr_izm - это сумма очередей и количество изменений очереди(для подсчета ср.длины)
 
    z2_time=RandD(0,4);
    n2=RandI(5);
    all_times+=z2_time;
    sr_summ++;
    count++;
    while (summa_zayavok_1_tipa!=1000)
    {
        if(n2==-10)
            n2=((ochered>0)&&(ochered<4))?rand()%(5-ochered) +ochered:RandI(5);//выявления местаположения заявки второго типа
        else n2--;
        if((n2!=0)&&(n2>0))
        {
            OA(ochered, z1_in, z1_out, t1, t2, all_times,sr_izm,sr_summ,summa_zayavok_1_tipa);
            sr_izm++;
            sr_summ+=ochered;
        }
        else
        {
            z2_time=RandD(0,4);
            all_times+=z2_time;
            count++;
            n2=-10;
        }
        if (((summa_zayavok_1_tipa%100)==0)&&(summa_zayavok_1_tipa!=0))
        {
            cout << "В обработано: " << summa_zayavok_1_tipa << " заявок" <<endl;
            cout << "Средняя длина очереди: " << sr_summ/sr_izm <<endl;
        }
    }
    cout << "Общее время моделирования: " << all_times <<endl;
    cout << "Количество вошедших заявок 1-го типа:" << z1_in<< endl;
    cout << "Количество вышедших заявок 1-го типа:" << z1_out << endl;
    cout << count<<endl;
 
    return 0;
}
 
 
double RandD(double l, double r){
  int l_ = l * 10 * 10;
  int r_ = r * 10 * 10;
  return static_cast<double>(rand() % (r_ - l_) + l_) / 100;
}
int RandI(int num_int)
{
    return rand() % num_int+1;
}
void OA(int &ochered,int &z1_in,int &z1_out,double &t1,double &t2,double &AT,double &sr_izm,double &sr_summ,int &summ)
{
    t1=RandD(0,5);
    t2=RandD(0,4);
    if (t1>t2)
    {
        ochered++;
        z1_in++;
    } else if(t1<t2)
            {
                ochered--;
                AT+=t2;
                z1_out++;
                summ++;
            }
                else if(t1==t2)
                     {
                        AT+=t2;
                        z1_out++;
                        z1_in++;
                        summ++;
                     }
}
а вот результат работы, только по словам препода она не правильная(якобы среднее время обработки должно равняться другому числу и мол почему прога выдает, что обработанных заявок столько-то сотен по несколько раз):
Система массового обслуживания
Quadrillionaire
13 / 13 / 1
Регистрация: 09.03.2013
Сообщений: 180
24.12.2013, 14:16  [ТС]     Система массового обслуживания #6
а вот результат работы, только по словам препода она не правильная(якобы среднее время обработки должно равняться другому числу и мол почему прога выдает, что обработанных заявок столько-то сотен по несколько раз):
Вложение 344333
Забыл добавить, что время обработки тоже не верное, говорит, что погрешность больше 10 процентов..и он её не примет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2013, 16:05     Система массового обслуживания
Еще ссылки по теме:

Нужно выявить ошибку (задача на систему массового обслуживания) C++
Исследовать работу системы обслуживания C++
Время обслуживания вводиться неправильно, как исправить? C++

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

Или воспользуйтесь поиском по форуму:
Quadrillionaire
13 / 13 / 1
Регистрация: 09.03.2013
Сообщений: 180
28.12.2013, 16:05  [ТС]     Система массового обслуживания #7
Решил отписаться тут, так как нашел ошибку и сделал прогу. Ошибка была в функции OA, поменяйте знаки ровно на противоположные в первых двух услових..и все..прога заработает..
P.S. спасибо за поддержку
Yandex
Объявления
28.12.2013, 16:05     Система массового обслуживания
Ответ Создать тему
Опции темы

Текущее время: 07:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru