Моделирование работы автовокзала
Разработка программы, которая на абстрактном уровне воспроизводит происходящие события в темпе искусственного времени, имитирующего реальное время. Имитация заданного интервала времени работы автовокзала. Обработка и печать результатов моделирования.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 09.09.2012 |
Размер файла | 191,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Оглавление
- Введение
- 1. Постановка задачи
- 2. Разработка приложения
- 2.1 Класс “Моделирование”
- 2.2 Процесс моделирования
- 2.3 Обработка и печать результатов моделирования
- 2.4 Работа программы моделирования
- Литература
- Приложения
Введение
Основным методом исследования систем является метод моделирования, т.е. способ теоретического анализа и практического действия, направленный на разработку и использование моделей. Суть моделирования заключается в описании социально-экономических систем и процессов в виде экономико-математических моделей.
В данном курсовом проекте будет смоделирована работа автовокзала.
Цель данного курсового проекта - овладеть практическими навыками построения моделей, для анализа взаимодействующих факторов и оценки последствий их измерения на развитие моделируемого объекта.
1. Постановка задачи
Разрабатывается программа, которая моделирует работу автовокзала. Клиенты приходят на автовокзал, встают в очередь к одному из кассиров, в зависимости от пункта назначения, обслуживаются и уходят, также производится отправка рейсов согласно расписанию. Программа на абстрактном уровне воспроизводит происходящие события в темпе искусственного времени, имитирующего реальное время. После имитации заданного интервала времени работы автовокзала программа печатает общее количество обслуженных клиентов, среднее время обслуживания клиентов, а также количество обслуженных клиентов, среднее время обслуживания клиентов по каждому направлению. Модельное время продвигается с постоянным шагом. Времена прихода и обслуживания клиентов формируются при помощи генераторов случайных чисел. При запуске программы пользователем вводятся значения параметров моделируемой системы (время моделирования, частота прихода клиентов).
2. Разработка приложения
2.1 Класс “Моделирование”
В ходе работы программы для клиента генерируется время появления следующего клиента, которое представляется как объект класса Time и является объектом класса Simulation. В цикле моделирования идет проверка на совпадение текущего времени и времени появления следующего клиента, если совпадение есть, генерируется время появления следующего клиента, а в журнал событий записывается время появления клиента и его номер.
Для генерирования времени появления используется генератор случайных чисел, реализованный в программе как функция-элемент класса Simulation. Функция-элемент Client_arrival(curr, num) этого класса генерирует случайное целое число Х из интервала [0, num] с помощью объекта класса Random, после чего число минут (Х + 1) прибавляется к текущему времени curr. Тем самым получается время появления следующего клиента.
Клиент представлется как объект класса client, который содержит следующие закрытые данные-элементы:
аrrive - время появления клиента
service_time - время обслуживания на кассе
departure_time- время отправки рейса
clientID- номер клиента
destination - место назначения
После появления клиента в цикле моделирования идет его инициализация с помощью функции-элемента класса client, которая устанавливает время появления, номер, время обслуживания на кассе и место назначения генерируются с помощью объекта класса Random. Время отправки устанавливается при продаже билета. После инициализации клиент помещается в нужную кассу в зависимости от места назначения. В классе
Simulation хранится список касс, каждая из которых представлена объектом класса ticket_office, в котором содержится очередь для клиентов, а также направление, представленное классом direction, который содержит список городов (класс city), в каждом городе имеется список рейсов(класс Run). Тем самым реализован один из двух доступных в ООП способов повторного использования программного кода - композиция.
После помещения клиента в очередь проверяются все очереди на наличие клиентов, которые должны обслуживаться. Если такие имеются, ведется поиск билета на самый ранний по отношению к текущему времени рейс. Количество билетов на каждый рейс ограничено 40 шт. Если билет продан, то в журнал событий записывается время продажи, номер клиента, место назначения, если нет - время обслуживания клиента и его номер.
В конце каждой итерации цикла моделирования уменьшается время ожидания всех клиентов в очередях на 1 минуту.
В начале каждой итерации цикла моделирования проверяется наличие отправки рейса с помощью функции RunDeparture(curr_time, textWritter), если рейс отправляется, то в журнал событий производится запись времени, направления рейса и количества пассажиров.
2.2 Процесс моделирования
Процесс моделирования запускается при нажатии на соответствующую кнопку в диалоговом окне путем вызова функции StartSimulation(Time b, Time sim, int num, ProgressBar bar) через объект класса Simulation, где b - время начала моделирования, sim - время завершения моделирования, num - частота появления клиентов. Все эти параметры задаются в диалоговом окне. При этом открывается файл "test" для регистрации событий - журнал событий. Он позволяет детально исследовать поведение моделируемой системы.
Таким образом, функция StartSimulation(Time b, Time sim, int num, ProgressBar bar) имеет следующий вид:
public void StartSimulation(Time b, Time sim, int num, ProgressBar bar)
{
TextWriter textWritter = new StreamWriter("test.txt");//создаем журнал событий
Time f = new Time();
base_time.CopyTime(b);
simul_time.CopyTime(sim);
f = simul_time - base_time;
double fbar = (double)(f.getHour() * 60 + f.getMin())/100;//значение
Time curr_time = new Time();//текущее время
Time add = new Time();
ticket_office tmp_off;//ссылка на кассу
client tmp_client = new client();
client cl_service;
List<client> tmp_list_client;//ссылка на очередь клиентов
int t = 0;
Init_Service();//инициализация касс по направлениям, создание городов, рейсов
//-------------цикл моделирования------------//
Client_arrival(base_time, num);//устанавливаем время прибытия следующего клиента
curr_time.CopyTime(base_time);//устанавливаем начальный момент времени
for (; curr_time < simul_time; curr_time++)
{
RunDeparture(curr_time, textWritter);//отправка рейса,если он //есть
if (next_arrival == curr_time)//если прибыл клиент
{
Client_arrival(curr_time, num);//устанавливаем время //прибытия следующего клиента
CountClient++;
//устанавливаем время прибытия и номер клиента
tmp_client.setAll(CountClient, curr_time);
//запись в файл
textWritter.WriteLine(curr_time.printTime() + ": прибыл клиент № "
+ Convert.ToString(tmp_client.getClientId()));
textWritter.WriteLine("");
AddClientToLine(tmp_client);//добавление клиента в очередь
}
for (int i = 0; i < service.Count; i++ )//проверяем очереди //клиетнов в каждой кассе
{
tmp_off = (ticket_office)service.ToArray().GetValue(i);
tmp_list_client = tmp_off.getLineClient();
if (tmp_list_client.Count() != 0)//если очередь не пуста
{
cl_service = (client)tmp_list_client.ToArray().GetValue(0);
if (cl_service.getServiceTime().getHour() == 0 &&
cl_service.getServiceTime().getMin() == 0)//если очередь клиента, //обслуживаем
{
Service(tmp_off, cl_service, curr_time);
if (cl_service.getDepartureTime().getHour() != 0
|| cl_service.getDepartureTime().getHour() != 0)//если билет //продан
{
textWritter.WriteLine(curr_time.printTime() + ": Клиенту №" + Convert.ToString(cl_service.getClientId()));
textWritter.WriteLine("продан билет на " +
cl_service.getDestination());
textWritter.WriteLine("время отправки: " +
cl_service.getDepartureTime().printTime());
textWritter.WriteLine("");
}
else
{
textWritter.WriteLine("Клиенту №" +
Convert.ToString(cl_service.getClientId()) + " билет не продан");
textWritter.WriteLine("");
}
tmp_list_client.RemoveAt(0);//удаляем клиента из очереди
}
}
}
SetTimeAll();//уменьшаем время ожидания всех клиентов
//--для полосы прогресса моделирования--//
t++;
if (t == (int)fbar+1)
{
bar.Value += 1;
t = 0;
}
//-------------------------------------//
}
bar.Value = 100;
textWritter.Close();
}
2.3 Обработка и печать результатов моделирования
Результаты моделирования обрабатываются и печатаются в программе функцией Statistic(TextBox text) класса Simulation. Вывод информации осуществляется в элемент TextBox диалогового окна. В начале вычисляются суммарное количество обслуженных клиентов и количество обслуженных клиентов по всем кассам и количество проданных билетов. Далее печатается среднее время ожидания клиентов.
Таким образом, функция Statistic(TextBox text) имеет вид:
public void Statistic(TextBox text)
{
text.Lines = new string[] { "Всего обслужено клиентов: " + Convert.ToString(CountClient) };
ticket_office t;
AverTime();//вычисление среднего времени ожидания по всем кассам
text.AppendText(Environment.NewLine + "Среднее время ожидания: " + Average_time.printTime());
for (int i = 0; i < service.Count; i++)//печать статистики по кассам
{
t = (ticket_office)service.ToArray().GetValue(i);
text.AppendText(Environment.NewLine + t.getDirectionName());
text.AppendText(Environment.NewLine + "обслужено клиентов: "
+ Convert.ToString(t.getCountClient()));
text.AppendText(Environment.NewLine + "билетов продано: "
+ Convert.ToString(t.getCountTicket()));
text.AppendText(Environment.NewLine + "Среднее время ожидания: "
+ t.GetAverageTime().printTime());
}
}
моделирование имитация время
2.4 Работа программы моделирования
Результат работы программы на экране:
Результат работы программы в журнале событий:
6:30 отправка рейса в Омск
Количество пассажиров: 0
6:35: прибыл клиент № 1
6:36: Клиенту №1 продан билет на Камень-на-Оби
время отправки: 11:30
6:40: прибыл клиент № 2
…
19:40: прибыл клиент № 261
19:42: Клиенту №261 продан билет на Камень-на-Оби
время отправки: 20:30
Клиенту №260 билет не продан
19:45: прибыл клиент № 262
Клиенту №262 билет не продан
19:47: прибыл клиент № 263
Литература
1. Методические указания к курсовой работе для студентов 2 курса дневного отделения факультета автоматики и вычислительной техники направления 230100 "Информатика и вычислительная техника"
Приложение 1
Файл «Program.cs»
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;
namespace _1
{
//-----Время-----//
public class Time
{
private int hour;
private int min;
//конструктор без параметров
public Time()
{
hour = min = 0;
}
//конструктор с параметрами
public Time(int h, int m)
{
hour = (h >= 0 && h < 24) ? h : 0;
min = (m >= 0 && m < 60) ? m : 0;
}
//копирование объекта
public void CopyTime(Time t)
{
hour = t.hour;
min = t.min;
}
//установка времени
public void setTime(int h, int m)
{
hour = (h >= 0 && h < 24) ? h : 0;
min = (m >= 0 && m < 60) ? m : 0;
}
//печать времени
public string printTime()
{
if (min < 10) return hour + ":0" + min;
else return hour + ":" + min;
}
//------перегруженниые операторы-----//
//инкремент
public static Time operator ++(Time t1)
{
t1.min++;
if (t1.min >= 60)
{
t1.min -= 60;
t1.hour++;
}
return t1;
}
//декремент
public static Time operator --(Time t1)
{
t1.min--;
if (t1.min < 0)
{
t1.min += 60;
t1.hour--;
}
return t1;
}
//сложение
public static Time operator +(Time t1, Time t2)
{
int h = t1.hour + t2.hour, m = t1.min + t2.min;
if (m >= 60)
{
m -= 60;
h++;
}
if (h > 23)
{
h -= 24;
}
return new Time(h, m);
}
//вычитание
public static Time operator -(Time t1, Time t2)
{
int h = t1.hour - t2.hour, m = t1.min - t2.min;
if (m < 0)
{
m += 60;
h--;
}
return new Time(h, m);
}
//деление на целое число
public static Time operator /(Time t1, int num)
{
int m, h;
m = (t1.hour * 60 + t1.min) / num;
h = m / 60;
m -= h * 60;
return new Time(h, m);
}
//сравнение
public static bool operator ==(Time t1, Time t2)
{
if (t1.hour == t2.hour && t1.min == t2.min) return true;
else return false;
}
public static bool operator !=(Time t1, Time t2)
{
if (t1.hour != t2.hour && t1.min != t2.min) return true;
else return false;
}
public static bool operator >(Time t1, Time t2)
{
if (t1.hour > t2.hour) return true;
else if (t1.hour < t2.hour) return false;
else if (t1.min > t2.min) return true;
else if (t1.min < t2.min) return false;
else return false;
}
public static bool operator >=(Time t1, Time t2)
{
if ((t1.hour > t2.hour) || (t1.hour == t2.hour && t1.min >= t2.min)) return true;
else return false;
}
public static bool operator <(Time t1, Time t2)
{
if (t1.hour < t2.hour) return true;
else if (t1.hour > t2.hour) return false;
else if (t1.min < t2.min) return true;
else if (t1.min > t2.min) return false;
else return false;
}
public static bool operator <=(Time t1, Time t2)
{
if ((t1.hour < t2.hour) || ((t1.hour == t2.hour) && (t1.min <= t2.min))) return true;
else return false;
}
//----------------------------------------------------
//добавление нескольких минут, для генерации времени появления клиента
public void PlusMin(int m)
{
min += m;
if (min >= 60)
{
min -= 60;
hour++;
}
}
public int getMin()
{
return min;
}
public int getHour()
{
return hour;
}
}
//-----------------------------------
//-----Клиент-----//
class client
{
private Time arrive;//время появления клиента
private Time service_time;//время обслуживания на кассе
private Time departure_time;//время отправки рейса
private int clientID;//номер клиента
private string destination;//место назначения
//конструктор
public client()
{
arrive = new Time();
service_time = new Time();
departure_time = new Time();
clientID = 0;
destination = "\0";
}
//копирование объекта
public void CopyClient(client t)
{
arrive.CopyTime(t.arrive);
service_time.CopyTime(t.service_time);
departure_time.CopyTime(t.departure_time);
clientID = t.clientID;
destination = t.destination;
}
//время обслуживания
public Time getServiceTime()
{
return service_time;
}
//"идентификация" клиента
public void setAll(int id, Time arr)
{
arrive.CopyTime(arr);
clientID = id;
Random rnd = new Random();
Random x = new Random();
int m = 0;
Thread.Sleep(15);
int n = rnd.Next(8) + 1;
switch(n)
{
case 1: destination = "Томск"; break;
case 2: destination = "Асино"; break;
case 3: destination = "Стрежевой"; break;
case 4: destination = "Омск"; break;
case 5: destination = "Калачинск"; break;
case 6: destination = "Тара"; break;
case 7: destination = "Барнаул"; break;
case 8: destination = "Камень-на-Оби"; break;
case 9: destination = "Бийск"; break;
}
m = rnd.Next(4) + 1;
service_time.setTime(0, m);
}
//установка времени обслуживания
public void setServiceTime(Time t)
{
service_time.CopyTime(t);
}
//уменьшение времени ожидания
public void NewServiceTime()
{
service_time--;
}
//номер клиента
public int getClientId()
{
return clientID;
}
//место назначения
public string getDestination()
{
return destination;
}
// время отправки
public Time getDepartureTime()
{
return departure_time;
}
// время отправки
public void setDepartureTime(Time dt)
{
departure_time.CopyTime(dt);
}
}
//------------------------------------------
//-----Рейс-----//
class Run
{
private int count_ticket;//количество оставшихся билетов
private Time departure;//время отправки
//конструктор без параметров
public Run()
{
count_ticket = 0;
departure = new Time();
}
//конструктор с параметрами
public Run(int count, Time dep)
{
count_ticket = count;
departure = new Time();
departure.CopyTime(dep);
}
//копирование объекта
public void CopyRun(Run t)
{
count_ticket = t.count_ticket;
departure.CopyTime(t.departure);
}
//инициализация напрвления
public void setRun (int count, Time dep)
{
count_ticket = count;
departure.CopyTime(dep);
}
//возврат времени отправки рейса
public Time getDepartureTime()
{
return departure;
}
//количество оставшихся билетов
public int getCountTicket()
{
return count_ticket;
}
//количество проданных билетов
public int getNumClients()
{
return (40 - count_ticket);
}
//билет продан
public void setCountTicket()
{
count_ticket--;
}
}
//-----------------------------------------
//-----Город-----//
class city
{
private string city_name;
private int count_ticket;//количество проданных билетов
private List<Run> list_Run;
//конструктор без параметров
public city()
{
count_ticket = 0;
city_name = "\0";
list_Run = new List<Run>();
}
//конструктор с параметрами
public city(string name)
{
city_name = name;
list_Run = new List<Run>();
}
//копирование объекта
public void CopyCity(city t)
{
Run tmp = new Run();
city_name = t.city_name;
count_ticket = t.count_ticket;
//копирование списка
for (int i = 0; i < t.list_Run.Count(); i++)
{
tmp.CopyRun((Run)t.list_Run.ToArray().GetValue(i));
list_Run.Add(tmp);
}
}
//добавление рейса в город
public void AddRun(Run r)
{
Run rr = new Run();
rr.CopyRun(r);
list_Run.Add(rr);
}
//возврат ссылки на список рейсов
public List<Run> getListRun()
{
return list_Run;
}
//возврат количества проданных билетов
public string getNameCity()
{
return city_name;
}
//установка количества проданных билетов
public void setCountTicket()
{
count_ticket++;
}
//возврат количества проданных билетов
public int getCountTicket()
{
return count_ticket;
}
}
//------------------------------------------------
//-----Направление-----//
class direction
{
private string direction_name;
private List<city> list_city;//список городов
//конструктор с параметрами
public direction(string name)
{
direction_name = name;
list_city = new List<city>();
}
//конструктор без параметров
public direction()
{
direction_name = "\0";
list_city = new List<city>();
}
//добавление города
public void AddCity(city c)
{
city n = new city();
n.CopyCity(c);
list_city.Add(c);
}
//возврат ссылки на список городов
public List<city> getListCity()
{
List<city> ptr = list_city;
return ptr;
}
//возврат названия направления
public string getNameDirection()
{
return direction_name;
}
//установка названия направления
public void setNameDirection(string name)
{
direction_name = name;
}
}
//------------------------------------------------
//-----Касса-----//
class ticket_office
{
private Time waiting_time;//время ожидания очереди
private Time average_time;//среднее время ожидания
private direction one;//направление
private int count_client;//количество обслуженных клиентов
private int count_ticket;//количество проданных билетов
private List<client> line;//очередь клиентов
//конструктор
public ticket_office(string name)
{
count_ticket = 0;
count_client = 0;
waiting_time = new Time(0, 0);
average_time = new Time(0, 0);
one = new direction(name);
line = new List<client>();
}
public Time GetAverageTime()
{
return average_time;
}
//уменьшение времени ожидания на 1 минуту
public void SetTime()
{
if (waiting_time.getHour() != 0 || waiting_time.getMin() != 0)
{
waiting_time--;
int n = line.Count()-1;
client t;
while (n != -1)
{
t = (client)line.ToArray().GetValue(n);
t.NewServiceTime();
n--;
}
}
}
//увеличение количества обслуженных клиентов
public void setCountClient()
{
count_client++;
}
//возврат количества обслуженных клиентов
public int getCountClient()
{
return count_client;
}
//увеличение количества проданных билетов
public void setCountTicket()
{
count_ticket++;
}
//возврат количества проданных билетов
public int getCountTicket()
{
return count_ticket;
}
//возврат указателя на очередь клиентов
public List<client> getLineClient()
{
return line;
}
//добавление в очередь клиета
public void AddToLine(client a)
{
client t = new client();
t.CopyClient(a);
waiting_time.CopyTime(waiting_time + t.getServiceTime());
t.setServiceTime(waiting_time);
if (t.getClientId() < 1)
{
average_time.CopyTime(average_time + waiting_time);
}
else
{
average_time.CopyTime((average_time + waiting_time) / 2);
}
line.Add(t);
}
//добавление города в направление
public void InsertCity(city c)
{
one.AddCity(c);
}
//возврат названия направления
public string getDirectionName()
{
return one.getNameDirection();
}
//возврат ссылки на направление
public direction getDirection()
{
return one;
}
}
//----------------------------------------------------
class Simulation
{
private Time base_time;//начальное время
private Time simul_time;//время симуляции
private Time next_arrival;//время прибытия следующего клиента
private int CountClient;//количество клиентов
private Time Average_time;//среднее время ожидания
private List<ticket_office> service;// список касс
//конструктор
public Simulation()
{
Average_time = new Time();
next_arrival = new Time();
base_time = new Time();
simul_time = new Time();
CountClient = 0;
service = new List<ticket_office>();
}
//печать статистики в диалоговом окне
public void Statistic(TextBox text)
{
text.Lines = new string[] { "Всего обслужено клиентов: " + Convert.ToString(CountClient) };
ticket_office t;
AverTime();//вычисление среднего времени ожидания по всем кассам
text.AppendText(Environment.NewLine + "Среднее время ожидания: " + Average_time.printTime());
for (int i = 0; i < service.Count; i++)//печать статистики по кассам
{
t = (ticket_office)service.ToArray().GetValue(i);
text.AppendText(Environment.NewLine + t.getDirectionName());
text.AppendText(Environment.NewLine + "обслужено клиентов: "
+ Convert.ToString(t.getCountClient()));
text.AppendText(Environment.NewLine + "билетов продано: "
+ Convert.ToString(t.getCountTicket()));
text.AppendText(Environment.NewLine + "Среднее время ожидания: "
+ t.GetAverageTime().printTime());
}
}
//подсчет среднего времени одидания
public void AverTime()
{
Time temp = new Time(0,0);
ticket_office t;
for (int i = 0; i < service.Count; i++)
{
t = (ticket_office)service.ToArray().GetValue(i);
temp = temp + t.GetAverageTime();
}
Average_time = temp / (service.Count);
}
//возврат начального времени
public Time getBaseTime()
{
return base_time;
}
//возврат конечного времени
public Time getSimulTime()
{
return simul_time;
}
//устанока конечного времени
public void setSimulTime(Time sim)
{
simul_time = sim;
}
//возврат количества обслуженных клиентов
public int getCountClient()
{
return CountClient;
}
//добавление кассы с уже заданным направлением
public void AddTicketOffice(string name_direction)
{
ticket_office t = new ticket_office(name_direction);
service.Add(t);
}
//добавление города по направлению
public void AddCity(string name_direct, string name_city)
{
city c = new city(name_city);
direction tmp = SearchDirection(name_direct);
tmp.AddCity(c);
}
//поиск направления по названию, возвращается ссылка
public direction SearchDirection(string name_direct)
{
ticket_office tmp;
int n = service.Count() - 1;
tmp = (ticket_office)service.ToArray().GetValue(n);
while (tmp.getDirectionName() != name_direct)
{
tmp = (ticket_office)service.ToArray().GetValue(n);
n--;
}
return tmp.getDirection();
}
//поиск города по названию, возвращается ссылка на город
//функция используется для добавления рейса
public city SearchCity(string name_city)
{
city c;
direction t;
ticket_office tmp;
int n = service.Count() - 1;
int k = 0;
while (true)//проверяем все кассы, пока не найдем нужный город
{
tmp = (ticket_office)service.ToArray().GetValue(n);
t = tmp.getDirection();
k = t.getListCity().Count() - 1;
c = (city)t.getListCity().ToArray().GetValue(k);
while (c.getNameCity() != name_city)
{
if (k == -1) break;
c = (city)t.getListCity().ToArray().GetValue(k);
k--;
}
if (c.getNameCity() == name_city) break;
n--;
}
return c;
}
//добавление рейса в город
public void AddRun(string name_city, Run r)
{
city c = SearchCity(name_city);
c.AddRun(r);
}
//добавление клиента в очередь в нужную кассу
public void AddClientToLine(client add)
{
city c;
direction t;
ticket_office tmp_off;
client tmp = add;
int n = service.Count() - 1;
int k = 0;
while (true)
{
tmp_off = (ticket_office)service.ToArray().GetValue(n);
t = tmp_off.getDirection();
k = t.getListCity().Count() - 1;
c = (city)t.getListCity().ToArray().GetValue(k);
while ((c.getNameCity() != tmp.getDestination()) && k != -1)
{
c = (city)t.getListCity().ToArray().GetValue(k);
k--;
}
if (c.getNameCity() == tmp.getDestination()) break;
n--;
}
tmp_off.AddToLine(tmp);
}
//функция выяснения появления клиента
//в качестве параметра передается среднее время между появлением клиентов(в минутах)
void Client_arrival(Time curr, int num)
{
Random rnd = new Random();
int t = rnd.Next(num) + 1;
next_arrival.CopyTime(curr);
next_arrival.PlusMin(t);
}
//обслуживание клиента
public void Service(ticket_office off, client _client, Time curr)
{
city t = SearchCity(_client.getDestination());//ищем нужный город
bool yes = false;//продажа билета
Run tmp_r, ttmp_r;
Time tmp_time = new Time();
List<Run> r = t.getListRun();
ttmp_r = (Run)r.ToArray().GetValue(0);
Time tmp2;
tmp_time.CopyTime(ttmp_r.getDepartureTime());
for (int i = 0; i < r.Count; i++)//поиск билета
{
tmp_r = (Run)r.ToArray().GetValue(i);
tmp2 = tmp_r.getDepartureTime();
if (!yes)
tmp_time.CopyTime(tmp2);
if ((curr < tmp_time) && (tmp_time >= tmp2) && (tmp2 >= curr) && (tmp_r.getCountTicket() != 0))
{
tmp_time.CopyTime(tmp2);
ttmp_r = (Run)r.ToArray().GetValue(i);
yes = true;
}
}
if (!yes || tmp_time == curr)//если нет билетов или рейсов
{
off.setCountClient();//увеличиваем количество обслуженных клиентов
}
else
{
off.setCountClient();//увеличиваем количество обслуженных клиентов
off.setCountTicket();//увеличиваем количество проданных на кассе билетов
t.setCountTicket();////увеличиваем количество проданных билетов на определенный город
ttmp_r.setCountTicket();//уменьшаем количество оставшихся билетов на определенный рейс
_client.setDepartureTime(tmp_time);//устанавливаем время отправления клиента
}
}
//функция уменьшает время ожидания всех клиетнов на 1 минуту
//используется в цикле моделирования
public void SetTimeAll()
{
ticket_office t;
for (int i = 0; i < service.Count; i++)
{
t = (ticket_office)service.ToArray().GetValue(i);
t.SetTime();
}
}
//инициализация касс по направлениям, создание городов, рейсов
public void Init_Service()
{
Time run_time = new Time();//время отправки рейса
Run run = new Run();
AddTicketOffice("Томская область");
AddCity("Томская область", "Томск");
run_time.setTime(10, 0);
run.setRun(40, run_time);
AddRun("Томск", run);
run_time.setTime(12, 30);
run.setRun(40, run_time);
AddRun("Томск", run);
run_time.setTime(16, 50);
run.setRun(40, run_time);
AddRun("Томск", run);
AddCity("Томская область", "Асино");
run_time.setTime(9, 30);
run.setRun(40, run_time);
AddRun("Асино", run);
run_time.setTime(16, 10);
run.setRun(40, run_time);
AddRun("Асино", run);
run_time.setTime(18, 50);
run.setRun(40, run_time);
AddRun("Асино", run);
AddCity("Томская область", "Стрежевой");
run_time.setTime(7, 30);
run.setRun(40, run_time);
AddRun("Стрежевой", run);
run_time.setTime(12, 0);
run.setRun(40, run_time);
AddRun("Стрежевой", run);
run_time.setTime(17, 20);
run.setRun(40, run_time);
AddRun("Стрежевой", run);
AddTicketOffice("Омская область");
AddCity("Омская область", "Омск");
run_time.setTime(6, 30);
run.setRun(40, run_time);
AddRun("Омск", run);
run_time.setTime(11, 40);
run.setRun(40, run_time);
AddRun("Омск", run);
run_time.setTime(16, 50);
run.setRun(40, run_time);
AddRun("Омск", run);
AddCity("Омская область", "Калачинск");
run_time.setTime(9, 10);
run.setRun(40, run_time);
AddRun("Калачинск", run);
run_time.setTime(10, 50);
run.setRun(40, run_time);
AddRun("Калачинск", run);
run_time.setTime(18, 10);
run.setRun(40, run_time);
AddRun("Калачинск", run);
AddCity("Омская область", "Тара");
run_time.setTime(8, 00);
run.setRun(40, run_time);
AddRun("Тара", run);
run_time.setTime(12, 00);
run.setRun(40, run_time);
AddRun("Тара", run);
run_time.setTime(16, 00);
run.setRun(40, run_time);
AddRun("Тара", run);
AddTicketOffice("Алтайский край");
AddCity("Алтайский край", "Барнаул");
run_time.setTime(10, 30);
run.setRun(40, run_time);
AddRun("Барнаул", run);
run_time.setTime(13, 40);
run.setRun(40, run_time);
AddRun("Барнаул", run);
run_time.setTime(17, 30);
run.setRun(40, run_time);
AddRun("Барнаул", run);
AddCity("Алтайский край", "Камень-на-Оби");
run_time.setTime(11, 30);
run.setRun(40, run_time);
AddRun("Камень-на-Оби", run);
run_time.setTime(15, 40);
run.setRun(40, run_time);
AddRun("Камень-на-Оби", run);
run_time.setTime(20, 30);
run.setRun(40, run_time);
AddRun("Камень-на-Оби", run);
AddCity("Алтайский край", "Бийск");
run_time.setTime(8, 30);
run.setRun(40, run_time);
AddRun("Бийск", run);
run_time.setTime(17, 00);
run.setRun(40, run_time);
AddRun("Бийск", run);
run_time.setTime(21, 50);
run.setRun(40, run_time);
AddRun("Бийск", run);
}
//моделирование отправления рейса
public void RunDeparture(Time dep, TextWriter text)
{
ticket_office tmp_off;
List<city> tmp_list_city;
city tmp_city;
List<Run> tmp_list_run;
Run tmp_run;
for (int i = 0; i < service.Count; i++)
{
tmp_off = (ticket_office)service.ToArray().GetValue(i);
tmp_list_city = tmp_off.getDirection().getListCity();
for (int j = 0; j < tmp_list_city.Count; j++)
{
tmp_city = (city)tmp_list_city.ToArray().GetValue(j);
tmp_list_run = tmp_city.getListRun();
for (int k = 0; k < tmp_list_run.Count; k++)
{
tmp_run = (Run)tmp_list_run.ToArray().GetValue(k);
if (tmp_run.getDepartureTime() == dep)//если в текущее время отправляется рейс
{
text.WriteLine(tmp_run.getDepartureTime().printTime()
+ " отправка рейса в " + tmp_city.getNameCity());
text.WriteLine("Количество пассажиров: " +
Convert.ToString(tmp_run.getNumClients()));
text.WriteLine("");
}
}
}
}
}
//---- МОДЕЛИРОВАНИЕ ----//
public void StartSimulation(Time b, Time sim, int num, ProgressBar bar)
{
TextWriter textWritter = new StreamWriter("test.txt");//создаем журнал событий
Time f = new Time();
base_time.CopyTime(b);
simul_time.CopyTime(sim);
f = simul_time - base_time;
double fbar = (double)(f.getHour() * 60 + f.getMin())/100;//значение
Time curr_time = new Time();//текущее время
Time add = new Time();
ticket_office tmp_off;//ссылка на кассу
client tmp_client = new client();
client cl_service;
List<client> tmp_list_client;//ссылка на очередь клиентов
int t = 0;
Init_Service();//инициализация касс по направлениям, создание городов, рейсов
//-------------цикл моделирования------------//
Client_arrival(base_time, num);//устанавливаем время прибытия следующего клиента
curr_time.CopyTime(base_time);//устанавливаем начальный момент времени
for (; curr_time < simul_time; curr_time++)
{
RunDeparture(curr_time, textWritter);//отправка рейса, если он есть
if (next_arrival == curr_time)//если прибыл клиент
{
Client_arrival(curr_time, num);//устанавливаем время прибытия следующего клиента
CountClient++;
//устанавливаем время прибытия и номер клиента
tmp_client.setAll(CountClient, curr_time);
//запись в файл
textWritter.WriteLine(curr_time.printTime() + ": прибыл клиент № "
+ Convert.ToString(tmp_client.getClientId()));
textWritter.WriteLine("");
AddClientToLine(tmp_client);//добавление в очередь
}
for (int i = 0; i < service.Count; i++ )//проверяем очереди клиетнов в каждой кассе
{
tmp_off = (ticket_office)service.ToArray().GetValue(i);
tmp_list_client = tmp_off.getLineClient();
if (tmp_list_client.Count() != 0)//если очередь не пуста
{
cl_service = (client)tmp_list_client.ToArray().GetValue(0);
if (cl_service.getServiceTime().getHour() == 0 &&
cl_service.getServiceTime().getMin() == 0)//если очередь клиента, обслуживаем
{
Service(tmp_off, cl_service, curr_time);
if (cl_service.getDepartureTime().getHour() != 0
|| cl_service.getDepartureTime().getHour() != 0)//если билет продан
{
textWritter.WriteLine(curr_time.printTime() + ": Клиенту №" +
Convert.ToString(cl_service.getClientId()));
textWritter.WriteLine("продан билет на " +
cl_service.getDestination());
textWritter.WriteLine("время отправки: " +
cl_service.getDepartureTime().printTime());
textWritter.WriteLine("");
}
else
{
textWritter.WriteLine("Клиенту №" +
Convert.ToString(cl_service.getClientId()) + " билет не продан");
textWritter.WriteLine("");
}
tmp_list_client.RemoveAt(0);//удаляем клиента из очереди
}
}
}
SetTimeAll();//уменьшаем время ожидания всех клиентов
//--для полосы прогресса моделирования--//
t++;
if (t == (int)fbar+1)
{
bar.Value += 1;
t = 0;
}
//-------------------------------------//
}
bar.Value = 100;
textWritter.Close();
}
}
static class Program
{
/// <summary>
/// Главная точка входа для приложения.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
Приложение 2
Файл « Form1.cs»
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace _1
{
public partial class Form1 : Form
{
Simulation A;
Time start;
Time end;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
A = new Simulation();
start = new Time(Convert.ToInt32(StartTimeHours.Value), Convert.ToInt32(StartTimeMin.Value));
end = new Time(Convert.ToInt32(EndTimeHours.Value), Convert.ToInt32(EndTimeMin.Value));
int n = Convert.ToInt32(num.Value);
progressBar1.Value = 0;
if (start >= end) MessageBox.Show("Неверный ввод");
else
{
A.StartSimulation(start, end, n, progressBar1);
A.Statistic(textBox1);
}
}
private void button2_Click(object sender, EventArgs e)
{
Close();
}
private void button3_Click(object sender, EventArgs e)
{
Process p1 = new Process();
p1.StartInfo.UseShellExecute = true;
p1.StartInfo.RedirectStandardOutput = false;
p1.StartInfo.FileName = "test.txt";
p1.Start();
p1.WaitForExit();
}
}
Размещено на Allbest.ru
Подобные документы
Основы разработки программной системы для организации информационной работы автовокзала в среде Borland Delphi 7.0 с применением стандартных компонентов. Выполнение баз банных и их составляющих на сервере Microsoft SQL Server 2000 Personal Edition.
курсовая работа [1,7 M], добавлен 19.12.2011Программные средства системного моделирования. Разработка программы процесса работы кладовой на фабрике с использованием языка имитационного моделирования GPSS. Сравнение результатов моделирующего алгоритма и аналитического расчета характеристик.
дипломная работа [757,1 K], добавлен 21.06.2011Моделирование системы разгрузки, поступления в хранилище и переработки нефти. Исследование начальных условий имитации работы флота, состоящего из 15 танкеров. Разработка библиотеки функциональных блоков. Анализ результатов имитационных экспериментов.
курсовая работа [376,0 K], добавлен 28.10.2013Разработка программы с использованием GPSS, моделирующей процесс работы взлётно-посадочной полосы. Сравнение результатов имитационного моделирования и аналитического расчета характеристик. Блок-диаграмма модели. Возможные улучшения в работе системы.
курсовая работа [393,3 K], добавлен 03.07.2011Разработка имитационной модели с регулярным входным потоком, отсутствующей очередью и естественным отсчетом времени (моделирование работы больничной палаты). Создание программы на языке C++, обеспечивающей ввод исходной информации, ее обработку и вывод.
курсовая работа [1,2 M], добавлен 13.09.2012GPSS как один из эффективных и распространенных языков моделирования сложных дискретных систем. Возможности языка GPSS. Построение имитационной модели "Моделирование мини-АТС". Разработка программы работы диспетчерского пункта в торговом предприятии.
курсовая работа [118,8 K], добавлен 19.01.2016Определение частоты и интенсивности отказов, вероятности безотказной работы и среднего времени наработки на отказ партии изделий при проведении испытаний в течение заданного промежутка времени с помощью программы, написанной на языке программирования С++.
лабораторная работа [101,2 K], добавлен 05.03.2015Характеристика системы массового обслуживания, куда поступают заявки обслуживания. Особенности моделирования системы массового обслуживания. Имитация работы системы массового обслуживания с относительными приоритетами. Отчеты полного факторного плана.
курсовая работа [1,1 M], добавлен 14.07.2012Анализ работы станции скорой помощи: прием вызовов, обслуживание пациентов, движение автомобилей. Формализация имитационной модели, ее программирование с помощью системы моделирования AnyLogic. Использование программы для расчета времени оказания помощи.
контрольная работа [1004,2 K], добавлен 25.07.2013Основные этапы имитационного моделирования станции мойки: определение условий задачи, разработка структурной, укрупненной и детальной схем ее реализации; написание математической и программной моделей ее решения. Представление результатов моделирования.
курсовая работа [137,4 K], добавлен 29.06.2011