Автор: Пользователь скрыл имя, 10 Января 2014 в 12:16, курсовая работа
Целью данной курсовой работы является разработка имитационной модели с регулярным входным потоком, отсутствующей очередью и естественным отсчетом времени т.е моделирование работы больничной палаты. Основой для разработки модели в данной курсовой работе является метод имитационного моделирования. Так же курсовая работа предполагает создание программы на языке C++, обеспечивающей ввод исходной информации, ее обработку, реализацию алгоритма имитации процесса и выдачу необходимой информации.
1. Введение………………………………………………………………………3
2. Моделирование систем массового обслуживания…………………………5
2.1 Структура и параметры эффективности и качества функционирования СМО………………………………………………………………………………5
2.2 Классификация СМО и их основные элементы………………...…………6
2.3 Процесс имитационного моделирования…………………………………12
3. Описание моделируемой системы……………………………………...…..16
3.1 Модельное время……………………………………………………….…..17
3.2 Используемые классы и объекты……………...………………….……….17
3.3 События и методы………………………………………………….………19
4. Программная реализация на С++…. ………………………………….……21
5. Анализ результатов работы программы……………………………....……35
6. Заключение……………….……………………………………………...…..38
7. Список использованной литературы…………………………………….…39
return(root);
}
float simpson(float A, float B, float mean, float disp)
{
float k1, k2, k3, s, x, h1, h;
/*шаг интегрирования принимается равным 0.01. В "товарных" реализациях метода
применяется процедура автоматического выбора шага с помощью апостериорных оценок*/
h=0.01;
s=0; h1=h/1.5;
k1=function(mean, disp, A);
for(x=A; (x<B)&&((x+h-B)<=h1); x=x+h)
{
k2=function(mean, disp, x+h/2);
k3=function(mean, disp, x+h);
s=s+k1+4*k2+k3;
k1=k3;
}
s=s*h/6;
return(s);
}
float function(float mean, float disp, float x)
{
float result;
result=(1.0/(disp*sqrt(2*M_
return(result);
}
float equ(float bottom_bound, float top_bound, float mean, float disp, float almost_all, float eps, float right)
{
float edge1, edge2, middle, cover, value;
edge1=bottom_bound; edge2=top_bound;
if (right>almost_all) return(top_bound); else;
if (right<(1-almost_all)) return(bottom_bound); else;
cover=0; /*введена для повышения производительности. В новой точке вычисление интеграла
производится не от bottom_bound, а от edge1, в то время как значение интеграла от
bottom_bound до edge1 уже накоплено в cover*/
while((edge2-edge1)>eps)
{
middle=(edge1+edge2)/2; value=simpson(edge1, middle, mean, disp);
if ( (cover+value-right)<0 ) { edge1=middle; cover=cover+value; }
else edge2=middle;
}
return((edge1+edge2)/2);
}
Листинг программы файл erlang.h
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
float get_erlang(float mu, int k, float eps);
float equ(float mu, float right, int k, float eps);
float function(float mu, int k, float x);
float get_erlang(float mu, int k, float eps)
{
int r_num; float root, right;
r_num=rand();
right=(float)r_num/32768;
root=equ(mu, right, k, eps);
return(root);
}
/*вычисление функции F(t) - левой части уравнения - в заданной точке t*/
float function(float mu, int k, float t)
{
float prod, s; int i;
prod=1; s=1;
for(i=1;i<k; i++)
{
prod=prod*mu*t/i;
s+=prod;
}
s=s*exp(-mu*t); return(1-s);
}
float equ(float mu, float right, int k, float eps)
{
float edge1, edge2, middle, value;
/*инициализация отрезка, на котором ищется корень. Правая граница - среднее плюс десятикратное среднеквадратичное отклонение*/
edge1=0.0; edge2=(float)k/mu+10*sqrt((
/*если длина начального отрезка все-таки мала - удваиваем его, пока корень уравнения не окажется внутри отрезка*/
while(function(mu, k, edge2)<right) edge2*=2;
/*итерируем, пока не достигнута заданная точность*/
while((edge2-edge1)>eps)
{
middle=(edge1+edge2)/2;
value=function(mu, k, middle); /*вычисляем значение левой части в середине текущего интервала локализации корня*/
/*корень лежит в правой половине текущего интервала*/
if ( (value-right)<0 ) edge1=middle;
/*корень лежит в левой половине текущего интервала*/
else edge2=middle;
}
return((edge1+edge2)/2);
}
Листинг программы функция main()
#include "stdafx.h"
#include "iostream"
#include "10.h"
int main()
{
int i,j;
int N = 0;
setlocale(LC_ALL, "Russian");
cout << "Введите время моделирования = ";
cin >> N;
int s = 1;
cout << "Введите количество станков = ";
cin >> s;
Machine *m = new Machine[s];
que=fopen("que", "wt");
sojourn=fopen("sojourn", "wt");
srand((unsigned)time(0));
for(total=0L;total<N;total++)
for(j=0;j<s;j++)
m[j].run();
fclose(sojourn);
fclose(que);
cout << "Всего поступило заявок " << entered << endl;
cout << "Всего завершило обслуживание " << completed << " заявок" << endl;
cout << "Доля заявок, прервавших обслуживание " << ((float)completed1)/completed << endl;
cout << "Доля заявок, прервавших обслуживание " << ((float)completed2)/completed << endl;
cout << "Средняя длина очереди " << que_ave << endl;
cout << "Среднее время пребывания " << soj_ave/60 << endl;
cout << "Коэффициент загрузки станков " << ro_ave << endl;
_gettch();
}
5. Анализ результатов работы программы
Моделирование системы при заданных
условиях (1 станок, 500 ч) дало следу-
ющие результаты:
Рис. 3. Снимок работы программы
На рис. 4 и 5 приведены примеры
реализаций случайной величины и слу-
чайной функции — соответственно, времени
пребывания заявок в системе и длины
очереди к станку. Периодические всплески
на этих графиках связаны с поломка-
ми станка. В самом деле, если обратиться
к рис. 5 и провести горизонтальную
линию приблизительно на уровне шести
(напомним, что среднее значение — 3.65),
то зафиксируем приблизительно 11-12 всплесков,
доходящих до этого уровня.
Количество поломок на протяжении 500 часов
также устойчиво показывает при
имитационных экспериментах значение
11-12.
Рис. 4. Пример реализации случайной величины — среднего времени пребывания заявки в системе
Мы видим, что при среднем
времени обслуживания 30 мин заявка
проводит
в системе в среднем довольно много времени
— 4 ч. Насколько улучшится ситуа-
ция, если добавить второй станок? Вот
результаты:
Таким образом, добавление второго станка полностью решает проблемы — среднее время пребывания заявки в системе становится практически равным среднему времени обслуживания. Поэтому добавлять третий станок не имеет смысла.
Рис. 5. Пример реализации случайной функции — длины очереди
6. Заключение
Сам напиши
Список использованной литературы