Автор работы: Пользователь скрыл имя, 01 Февраля 2011 в 22:35, курсовая работа
Целью данной курсовой работы является закрепление теоретических основ и практических аспектов имитационного моделирования систем.
В курсовой работе необходимо выполнить следующие задания:
- анализ предметной области;
- анализ программных средств, которые используются для моделирования систем;
- разработать программу;
- провести тестирование;
- оформить объяснительную записку.
ВВЕДЕНИЕ……………………………………………………………………
РАЗДЕЛ 1 АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ……………………………
1.1. Основные понятия теории очередей……………………………………
1.2. Моделирование работы порта……………………………………………
1.3. Модельное время…………………………………………………………
1.4. Выводы……………………………………………………………………
РАЗДЕЛ 2 ОБОСНОВАНИЕ ВЫБОРА ПРОГРАММНЫХ СРЕДСТВ……
2.1. Стандартная библиотека STL……………………………………………
2.2. Выводы……………………………………………………………………
РАЗДЕЛ 3 ОПИСАНИЕ РАЗРАБОТАННОГО
ПРОГРАММНОГО ПРОДУКТА……………………………………………
3.1. Классы и объекты…………………………………………………………
3.2. События и методы…………………………………………………………
3.3. Реализация интерфейса……………………………………………………
3.4. Выводы……………………………………………………………………
РАЗДЕЛ 4 РУКОВОДСТВО ПРОГРАММИСТА……………………………
4.1. Назначение и условия применения программы…………………………
4.2. Состав программного продукта…………………………………………
4.3. Входные и исходные данные……………………………………………
РАЗДЕЛ 5 РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ……………………………
5.1. Назначение программы…………………………………………………
5.2. Условия выполнения программы…………………………………………
5.3. Сообщение пользователю…………………………………………………
ВЫВОДЫ………………………………………………………………………
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ…………………………
Приложение А Текст программы……………………………………………
6
В ходе выполнения работы был создан программный продукт, который состоит из следующих файлов: list.h, random.h, 12-2.h, Unit1.h, Unit1.cpp.
Программа собирает статистические данные работы порта по загруженности буксира, среднему времени загрузки и средней длине очереди танкеров.
В результате тестирования работы программы было обнаружено, что при отсутствии танкеров четвертого типа неиспользованные ресурсы системы довольно велики. При добавлении пяти танкеров четвертого типа показатели вырастают, но остаются в пределах нормы, перегрузок нигде не возникает.
Время обслуживания танкера буксиром фиксировано и равно 2 часа, что составляет небольшую долю от общего времени облуживания танкера. Значит, потенциальным узким местом системы является погрузка в порту, где танкеры проводят все оставшееся время.
Программный продукт функционирует под управлением ОС Windows 9х/NT.
СПИСОК ИСПОЛЬЗОВАННЫХ
ИСТОЧНИКОВ
Приложение А
Текст
программы
А.1.
Файл Unit1.cpp
#include <vcl.h>
#include "12-2.h"
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner) {}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
GroupBox1->Visible=true;
int i;
Tanker4 **mas;
int N= StrToInt (Edit1->Text);
int M= StrToInt (Edit2->Text);
//Создание объектов Буксир и Порт
Port port;
Tug tug;
//Настройка их взаимодействия
port.putTug(&tug);
tug.putPort(&port);
mas=new Tanker4 *[M];;
srand((unsigned)time(0));
//Инициализация танкеров четвертого типа и настройка их взаимодействия
//с буксиром
for(i=0;i<M;i++)
{
mas[i]=new Tanker4(i+1);
mas[i]->putTug(&tug);
}
//Основной цикл моделирования
for(total=0L;total<N;total++)
{
//printf("\n%d",total);
tug.run();
port.run();
for(i=0;i<M;i++)
mas[i]->run();
}
delete [] mas;
//Вывод результатов эксперимента
Label13->Caption = IntToStr (completed);
Label14->Caption = IntToStr (completed1);
Label15->Caption = IntToStr (completed2);
Label16->Caption = FloatToStr (q_tugInAve);
Label18->Caption = FloatToStr (q_loadAve);
Label19->Caption = FloatToStr (soj_Ave/60);
Label20->Caption = FloatToStr (soj1_Ave/60);
Label21->Caption = FloatToStr (soj2_Ave/60);
Label22->Caption = FloatToStr (((float)ro_tug)/total);
entered=0;
completed=0;
completed1=0;
completed2=0;
q_tugInAve=0;
q_tugOutAve=0;
q_loadAve=0;
soj_Ave=0;
soj1_Ave=0;
soj2_Ave=0;
ro_tug=0;
ro_port=0;
}
А.2.
Файл 12-2.h
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<cmath>
using namespace std;
#include "List.h"
#include "random.h"
#define storm_mu 0.021
float q_tugInAve=0;
//переменная для подсчета
//на причаливание
float q_tugOutAve=0;
//переменная для подсчета
//на отчаливание
float q_loadAve=0; //переменная для подсчета средней длины очереди
//на погрузку
float soj_Ave=0;
//переменная для подсчета
//пребывания на погрузке
float soj1_Ave=0; //переменная для подсчета среднего времени
//пребывания на погрузке для танкеров первых
//трех типов
float soj2_Ave=0;
//переменная для подсчета
//пребывания на погрузке для танкеров
//четвертого типа
long int ro_tug=0L;
//переменная для подсчета
float ro_port=0;
//переменная для подсчета
long int entered=0L;
//счетчик общего числа
long int completed=0L; //счетчик отчаливших танкеров
long int completed1=0L; //счетчик отчаливших танкеров первых трех типов
long int completed2=0L; //счетчик отчаливших танкеров четвертого типа
long int total;
//счетчик тактов модельного
//базовый класс
class Tanker
{
public:
long int id; //идентификатор танкера
int type; //номер типа
int median; //среднее время погрузки
int offset; //максимальное отклонение
int minutes; //текущее время пребывания на погрузке
int state; //текущее состояние
friend class Tug;
friend class Port;
Tanker(); //конструктор
//Метод Print() удобно объявить виртуальным, например, для обхода любой из
//очередей и распечатки ее содержимого, так как в очереди могут находиться
//танкеры любого типа
virtual void Print();
};
//Производный класс
class Tanker4: public Tanker
{
const static int median_path=14400; //14400 минут=240 часов - среднее
const static int offset_path=1440; //24 часа - максимальное отклонение
//танкера четвертого типа
int to_arrival; //время до прибытия пустого танкера на причаливание
void *t; //связь с буксиром
public:
friend class Tug;
friend class Port;
Tanker4(int i);
void putTug(Tug *a);
void run();//диспетчер
virtual void Print();
};
//Класс Буксир
class Tug
{
const static int
arr_median=660; //660 минут=11 часов - среднее
время между //прибытиями
const static int arr_offset=420; //7 часов - максимальное отклонение
const static int time_path=60; //1 час - длительность причаливания
//и отчаливания
const static int storm_median=240; //4 часа - средняя длительность шторма
const static int storm_offset=120; //2 часа - максимальное отклонение
// const static float storm_mu=0.021; //1/48, где 48 часов - средняя
int to_arrival; //время до прибытия танкера типов 1,2,3
int to_in;
//время до окончания
int to_out;
//время до окончания
ListNode<Tanker> *queue_in; //очередь на причаливание
ListNode<Tanker> *queue_out; //очередь на отчаливание
Tanker *serving; //обслуживаемый танкер
int que_inLength;
//длина очереди на
int que_outLength; //длина очереди на отчаливание
int to_sStart; //время до начала шторма
int to_sEnd; //время до окончания шторма
void *p; //указатель на порт
public:
Tug();
void stormStart(); //начало шторма
void stormEnd(); //окончание шторма
void Arrival_Sea(Tanker4 *t); //прибытие танкера четвертого типа
void Arrival_Sea(); //прибытие танкера типов 1,2,3
void Arrival_coast(Tanker *t); //танкер требует отчаливания
void Departure(); //окончание отчаливания
void Arrival(); //окончание причаливания
void run(); //диспетчер