Моделирование работы автовокзала

Разработка программы, которая на абстрактном уровне воспроизводит происходящие события в темпе искусственного времени, имитирующего реальное время. Имитация заданного интервала времени работы автовокзала. Обработка и печать результатов моделирования.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 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.2012

  • GPSS как один из эффективных и распространенных языков моделирования сложных дискретных систем. Возможности языка 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.