Вероятность
|
0,1
|
0,15
|
0,2
|
0,25
|
0,3
|
Количество
остановок
|
3
|
4
|
5
|
6
|
7
|
интервал приезда маршрутного микроавтобуса подчиняется
нормальному закону распределения.
Среднее время движения между маршрутными микроавтобусами
может быть варьировано в процессе проведения вычислительного эксперимента, что
даст возможность выявить наилучший интервал между автобусами, что необходимо
для владельцев парка для получения максимальной прибыли при минимальных
издержках. Возможное отклонение 2-3 минуты.
количество микроавтобусов на маршруте. Данная информация
позволит сформировать оптимальный набор парка микроавтобусов;
количество мест в маршрутном микроавтобусе. Эти данные также
будут корректироваться для выявления наиболее экономически эффективного
положения дел;
количество остановок на маршруте 20. Данный тип исходных
данных фиксирован как и общее время имитации;
стоимость проезда в маршрутном микроавтобусе 15 рублей. Этот
тип входных данных позволит подсчитать прибыль со всех маршрутных
микроавтобусов за весь день - все время вычислительного эксперимента, что
покажет наличие или отсутствие экономической эффективности построенной модели.
Рисунок 2.1 - Алгоритм поступления пассажиров на остановку
Суть алгоритма состоит в отслеживании подошел ли
потенциальный пассажир на место остановочного пункта или нет. В случае, если
отведенный интервал времени, указанный в окне программного средства по часам, в
котором колеблется вероятность прибытия пассажира на остановку истек, то в
массиве людей, ожидающих микроавтобус добавляется новый элемент, а также
задается новый интервал ожидания пассажира в зависимости от того, какой час
рабочего времени обслуживается на данный момент и какова для этого интервала
была задана пользователем вероятность. В случае, если отведенное промежуток
времени не истек, то на следующем проходе по остановке осуществляется
уменьшение времени на единицу и прогон продолжается.
В момент совпадения нужного количества пассажиров на
остановке и нужного количества мест в маршрутном микроавтобусе, осуществляется
обслуживание маршрута микроавтобусом, то есть первый процесс. Для него выше был
описан алгоритм, показанный на рисунке А.1.
2.2
Особенности функционирования разработанной имитационной модели
В рамках курсового проекта имитационная модель работы парка
микроавтобусов разработана на платформе Microsoft Visual Studio 2010 c помощью конструкций
языка С#. Листинг программы представлен в приложении Б настоящего курсового
проекта.
Исходя из содержательной постановки, в качестве основных
классов объектов, следует выделить класс остановка и класс автобус, которые
позволят отразить ведущие процессы, протекающие в условии поставленной задачи.
Класс остановка (Class ostanovk) - описывает каким
образом реализованы процессы, происходящие на остановочных пунктах маршрута. В
классе организовано хранение количества пассажиров на остановках,
осуществляется наполнение остановок, исходя из заданного промежутка времени.
Переменные класса:
Public int [] HourRange - хранит интервалы времени соответственно
часам;
Public int [] Kolvo - хранит количества пассажиров на каждом из
остановочных пунктов;
Public int [] Wait - хранит время каждой остановки, через которое
пассажир придёт на остановку;
Public int kol - хранит общее количество
пассажиров, пришедших на остановки;
Public void Tic (int hour) - реализует подход
пассажиров.
Класс автобус (Class avtobus) содержит переменные и методы необходимые для
описания организации движения микроавтобусов по маршруту.
Переменные класса:
Public int [,] matr - массив хранящий элементы соответствующие
количеству остановок до выхода i-го пассажира. m-количество автобусов,n-количество мест в
автобусе;
Public double [] km - хранит количество остановок прошедших
автобусом;
Public int [] wait - отражает процесса ожидания автобусом в
очереди, если на остановке уже находится другой маршрутный микроавтобус, либо
ожидание пассажиров на остановке, при наличии свободных мест отведенного
почасового интервала.
Методы и функции класса:
Public void FirstAvto (int per) - освобождает автобусы
и задаёт промежутки выезда per;void SetT (int i, int val) - задаёт сколько
осталось до следующей остановки заданного автобуса;int GetT (int i) - выводит
сколько времени осталось до следующей остановки заданного автобуса;int GetK
(int i) - выводит номер остановки заданного автобуса;int free (int i) - выводит
количество свободных мест в заданном автобус;int In (int i, int kol) -
переключает счётчик остановок пассажиров, загружает заданное количество и
возвращает скольким пассажирам на остановке не хватило мест в микроавтобусе;int
Out (int i) - метод отражает выгрузку и показывает сколько пассажиров
выгружено;
В программе имеют место также, помимо локальных переменных
того или иного класса, глобальные переменные, а именно:
Private int oborot - хранит количество
обслуженных пассажиров;
Private int avtoch - хранит время ожидания
автобусов в очереди;
Private int pas - хранит количество
пассажиров на остановках.
Классы, переменные и их методы помогли создать программное
средство, которое может стать настольным инструментом управления организацией
работы парка микроавтобусов одного из городских маршрутов для получения
оптимального обслуживания маршрута с получением максимальной прибыли
владельцами парка.
2.3 Описание
работы имитационной модели парка маршрутных микроавтобусов
Построенная имитационная модель является программным
средством-помощником в решении одной из экономических задач. Парк реальных
микроавтобусов одного из городских маршрутов не может являться объектами для
исследования, но при этом важно владельцу парка иметь данные об уровне
эффективности его работы. Имитационная модель предоставляет возможность в
течение нескольких секунд выдать результат о текущем состоянии дел на маршруте.
Модель также позволяет сократить штат сотрудников, в обязанности которых
входило отслеживание прибыли и составление оптимального графика движения
микроавтобусов по маршруту.
Для работы с программой, имитирующей рабочий день маршрутных
микроавтобусов, не требуется специальных навыков и знаний со стороны
пользователя. Интерфейс программы является интуитивно понятным и предоставляет
собой окно для ввода некоторых исходный данных модели, работающей по принципу
системы массового обслуживания, и вывода конечных результатов с иллюстрацией
всего процесса вычислительного эксперимента.
При запуске программы пользователю, которым может быть
владелец парка маршрутных микроавтобусов, необходимо 2 типа исходных данных -
корректируемые данные и данные, фиксированные окружающей действительностью.
Интерфейс программного продукта, разработанного в рамках данного курсового
проекта, представлено на рисунке 2.2 - Окно программного средства.
К корректируемым данным следует отнести:
количество автобусов, вышедших на маршрут в конкретно
заданный рабочий день;
количество мест в автобусе, если в парке имеются
микроавтобусы различной вместимости, что позволит определить оптимальное
соотношение микроавтобусов на маршруте в день; этот параметр также позволяет
стать программному средству более универсальным для любого рабочего места с
любым комплектом парка;
время между остановками, то есть интервал времени, отведенный
на задержку в остановочном пункте для ожидания потенциальных пассажиров;
время выхода автобусов на маршрут, то есть интервал движения
автобусов.
Рисунок 2.2 - Окно программного средства
В пользовательском окне также указаны вероятности интервалов
подхода потенциальных пассажиров на остановку. Данные варьируются в зависимости
от времени суток. Очевидно, что интенсивность пассажиропотока велика в раннее
утреннее и вечернее время, а спад наблюдается в дневное время. Это связано с
тем, что основной массой обслуживаемых клиентов микроавтобусами являются люди
среднего рабочего возраста, а режим работы большинства предприятий города колеблется
в интервале от 9: 00 до 17: 00 часов.
В качестве фиксированных исходных данных модели следует
пользователю заполнить такие графы как:
количество остановок на маршруте;
цена одной поездки в маршрутном микроавтобусе. Данные о
стоимости билета в микроавтобусе необходимо для подсчета общей прибыли за весь
рабочий день.
После заполнения всех граф, пользователю необходимо нажать
клавишу "Старт". Это действие запустит программу. В процессе имитации
будет отслеживаться очередь пассажиров и микроавтобусов на остановке. В окне
программы также будет указано сколько остановок было пройдено, какова общая
прибыль за день и сколько пассажиров было обслужено за весь рабочий день, то
есть время имитации 16 часов (с 8: 00 ч до 0: 00 ч). Итог выполнения программы отражен
на рисунке 2.3 - Окно программного средства с результатами имитации.
Рисунок 2.3 - Окно программного средства с результатами
имитации
Результатом работы программного средства пользователь будет
считать два графика, которые построит программное средство после полного
завершения времени имитации:
график интенсивности обслуживания, на котором можно увидеть
сколько было свободных мест в конкретном микроавтобусе в конкретный промежуток
времени, а также сколько в это время людей ожидало своего микроавтобуса на
остановке;
график прибыли по часам. Этот вид данных позволит
пользователю увидеть наиболее прибыльные интервалы времени, что позволит
эффективным образом скорректировать интервалы движения и интервалы ожидания
маршрутных микроавтобусов.
Результатом моделирования следует считать и числовое значение
времени задержек автобусов и соотношение обслуженных пассажиров к заявкам,
оставшимся в состоянии ожидания.
3. Испытание
и исследование имитационной модели
3.1 План организации
вычислительного эксперимента
Цель имитационных исследований - это снабжать данными при
изменении входных условий. Перед началом исследования необходимо спланировать
эксперимент, то есть разработать план проведения эксперимента на модели. Цель
этого планирования:
с одной стороны, планирование эксперимента позволяет выбрать
конкретный метод сбора необходимой информации.
с другой стороны, достигнуть цели исследования эффективным
образом.
Принципиальное отличие вычислительного эксперимента от
классического состоит в том, что он проводится не с реальной системой, а с ее
моделью. В этом контексте особенно заслуживают внимания имитационные
эксперименты. Под вычислительным экспериментом понимается численный метод
проведения экспериментов с математическими и имитационными моделями,
описывающими поведение сложных систем в некоторый период времени. В процессе
вычислительного эксперимента исследователь имеет дело с тремя основными
моделями:
) реальным объектом (система);
2) имитационной моделью объекта;
) информационно-вычислительной системой (ИВС).
В понятие имитационная модель объекта при вычислительном
эксперименте вкладывается широкий смысл. Здесь понимается не только чисто
имитационная модель, но и комплекс математических моделей, описывающих
функционирование системы разной природы. Таким образом, вычислительный
эксперимент - это всегда имитация некоторой реальности.
Еще одной и задач при организации и проведении направленного
вычислительного эксперимента на имитационной модели состоит в выборе
математического метода для обработки результатов эксперимента.
В рамках данного курсового проекта была построена модель,
имитирующая работу парка микроавтобусов одного из городских маршрутов. Для
того, чтобы оценить адекватность функционирования имитационной модели реальным
ситуациям, необходимо провести направленный вычислительный эксперимент.
Поскольку, объектом исследования является работа реального
парка микроавтобусов, то в качестве исходных данных модели можно взять те
числовые показатели, что имеют место в настоящее время в действительности.
Небольшая их корректировка в будущем позволит найти оптимальное соотношение
входа и выхода для достижения максимальной прибыли с маршрута за полный рабочий
день в 16 часов.
Источником сбора необходимой информации может служить отчетные
данные за более ранние периоды подотчетными лицами руководству парка или
некоторая статистика по организации работы маршрутных микроавтобусов в городе в
целом.
Варьирование данными, подлежащими изменению пользователем
программного средства, является непосредственно направленным вычислительным
экспериментом, поскольку представляет собой эксперимент с имитационной моделью
объекта.
3.2 Анализ
результатов работы имитационной модели маршрутных микроавтобусов
Построенная в рамках курсового проекта имитационная модель
предоставляет возможность проиллюстрировать работу парка, проблему очереди как
пассажиров, так и самих микроавтобусов на остановочных пунктах. К тому же,
модель носит и экономический характер, поэтому не мало важно сколько денежной
прибыли несет то или иное соотношение исходных данных.
Например, при 10 микроавтобусах с вместимостью
"маршруток" в 12 посадочных мест прибыль составляет 68445 рублей, но
при этом чуть более трети потенциальных пассажиров так и останутся не
обслуженными, хотя время задержек микроавтобусов относительно невелико - 323
минуты за 16 часов имитации. Результаты такого соотношения входа и выхода
представлено на рисунке 3.1.
Рисунок 3.1 - Результаты имитации
Если же на маршрут выпустить слишком мало микроавтобусов, то
очередь пассажиров на остановках будет расти в геометрической прогрессии с
каждым часом рабочего времени.
Очередь из микроавтобусов будет минимальна, за все время
испытаний всего 7 минут для введенных исходных данных. Описанное положение дел
показано на рисунке 3.2
Рисунок 3.2 - Результаты имитации
Если на маршрут города выпустить слишком много автобусов,
например 40, то 10 из микроавтобусов так и останутся стоять в парке, а издержки
за содержание машин у владельца парка также будут иметь место. К тому же, в
этом случае будет иметь слишком большая очередь из микроавтобусов на конечной
остановке, ожидающих выхода последнего. В этой связи лишь треть потенциальных
пассажиров будет обслужено, а большая их часть так и останутся в очереди.
Небольшое количество микроавтобусов на маршруте, но с большой вместимостью тоже
не решение задачи, поскольку около половины мест будут оставаться свободными,
что не рентабельно. Очевидно, что оптимальное количество микроавтобусов,
порядка 10, но с небольшой вместимостью, будет приносить достаточный уровень
прибыли, минимальный показатель свободных мест, низкий уровень очередей
"маршруток", но, при этом, будут высоки значения очередей
потенциальных пассажиров на остановке, чуть более половины из них будут
обслужено (порядка 59%).
В ходе нескольких прогонов направленного вычислительного
эксперимента было выявлено, что наибольшую экономическую прибыль владелец парка
будет иметь если количество микроавтобусов, выпускаемых на маршрут будет 12,
вместимостью 10 посадочных мест. Денежная прибыль будет составлять 98265
рублей, если цена билета за один проезд составляет 15 рублей. Результат такого
прогона отражен на рисунке 3.3.
Рисунок 3.3 - Результаты имитации
Очередь у микроавтобусов будет составлять 1212 минут за 16
часов исследования, то есть каждый из водителей микроавтобуса был вынужден за
весь рабочий день простоять в ожидании нового пассажира час (около 4 минут
каждого нового часа работы). Это может быть связано как с ожиданием нового
пассажира заданного промежутка времени, так и с очередью из микроавтобусов на
остановочных пунктах.
Пиковое значение пассажиропотока в 9 часов утра успешно
обслуживается. Очередь из людей на остановке накапливается в период с 11: 00 до
примерно 14: 50 часов. После этого графики, отражающие свободные места и людей
на остановке пересекаются, затем происходит стабилизация и некоторый рост
свободных мест в автобусах. В выше описанной ситуации более 86% пассажиров было
обслужено.
Такое соотношение входных и выходных параметров следует
считать оптимальным только в случае определенных вероятностей появления нового
потенциального пассажира на остановке. Если провести исследование для
конкретного городского маршрута, где имеет место популярность маршрута, проход
микроавтобусов по жизненно важным или востребованным местам города, то
вероятностные значения будут иными, что приведет к несколько другому значению выхода.
Заключение
В данном курсовом проекте был разработано программное
средство, имитирующее работу парка микроавтобусов одного из городских
маршрутов. Подобная имитационная модель позволяет выявить наиболее оптимальное
соотношение количества микроавтобусов на маршруте и количества мест в них,
чтобы избежать очереди на остановках как микроавтобусов в ожидании
потенциальных пассажиров, так и самих пассажиров. В модели также можно изменять
интервалы движения микроавтобусов и время стоянки на каждой из остановок. Этот
тип данных оказывает немало важное влияние на результат имитации.
Проведенный направленный вычислительный эксперимент в рамках
курсового проекта с имитационной моделью объекта исследования позволяет:
) подсчитать сколько микроавтобусов необходимо
выпускать на маршрут, чтобы их количество могло оптимальным образом обеспечить
обслуживание пассажиров. Был сделан вывод, что наилучшее количество
микроавтобусов как для пассажиров, так и для владельца парка с точки зрения
экономии это 12;
2) подсчитать сколько мест должно быть в микроавтобусе.
В результате множества прогонов имитационной модели было выявлено, что
оптимальное количество мест 10. Многоместные или микроавтобусы малой
вместимостью не помогают в решении поставленной задачи;
) определить интервал движения микроавтобусов. Слишком
частое циркулирование маршрутных микроавтобусов несет большие топливные
издержки, большой же интервал движения влечет за собой длинные очереди на
конечной остановке и большой объем пассажиров в ожидании на других остановочных
пунктах. В результате проведенной работы выявлено, что время ожидания на
остановках потенциальных пассажиров при наличии свободных мест лучше установить
в 2 минуты, а интервал выхода на маршрут равным 1 минуте;
) определить выручку со всех маршрутных микроавтобусов
в течение всего рабочего дня (время имитации 16 часов). При выше описанных
входных данных денежная прибыль составит 98265 рублей.
) определить длину очереди маршрутных микроавтобусов.
Длина очереди при указанных исходных данных будет также минимальна - 4 минуты
часа будет потрачено водителями на ожидание.
Приложения
Приложение А
Алгоритм работы имитационной модели
Приложение Б
Листинг программного средства имитационной модели
using System;System. Collections.
Generic;System.componentModel;System. Data;System. Drawing;System. Linq;System.
Text;System. Windows. Forms;WindowsFormsApplication1
{partial class Form1: Form
{mbit; Graphics gr; // графикаForm1 ()
{();
}DateTime time;double [] GrGetedPas,GrIncome,GrPas;avtobus
avtopark;ostanovk ost;int oborot, avtoch, pas, oborothour,
svobodnihmest,kolvopas;double maxi (double a, double b)
{(a > b)a;b;
}ostanovk
{int [] HourRange, Kolvo, Wait;int n,kol;ostanovk
(int n)
{. kol = 0;. n = n;. HourRange = new int [16];.
Kolvo = new int [n];. Wait = new int [n];(int i = 0; i < n; i++). Wait [i] =
0;
}void Tic (int hour)
{r = new Random ();(int i = 0; i < n;
i++)(Wait [i] < 1)
{++;. Kolvo [i] ++;( (hour>15) &&
(hour<0)). Wait [i] = r. Next (-1,1) +HourRange [hour];. Wait [i] = r. Next
(-1,1) +HourRange. Max ();
}. Wait [i] - -;
}
}avtobus
{int [,] matr;double [] km;int [] wait;int m,
n;avtobus (int m, int n) // конструктор
{. matr = new int [m, n + 2];. m = m;. n = n;.
km=new double [m];. wait = new int [m];
}void FirstAvto (int per) // опустошает автобусы и задаёт промежутки выезда
{(int i = 0; i < m; i++)(int j = 0; j < n;
j++). matr [i, j] = - 1;(int i = 0; i < m; i++)
{ this. km [i] = 0; this. matr [i, n] = per * i;
this. wait [i] = - 1; }(int i = 0; i < m; i++)
this. matr [i, n + 1] = 0;
}int GetT (int i) // выводит сколько осталось до след ост
заданного авт
{matr [i, n];
}void SetT (int i, int val) // задаёт сколько осталось до
след ост заданного авт
{. matr [i, n] = val;
}int GetK (int i) // выводит номер остановки заданного авт
{matr [i, n + 1];
}void SetK (int i, int val) // задаёт номер остановки
заданного авт
{. matr [i, n + 1] = val;
}int free (int i) // выводит количество свободных мест в
заданом авт
{k = 0;(int j = 0; j < n; j++)(matr [i, j] ==
- 1)++;k;
}int In (int i, int kol) // переключает счётчик остановок
пасажиров, загружает заданное колво и возвращает сколько не вместилось
{(int j = 0; j < n; j++)(matr [i, j]! = - 1).
matr [i, j] - -;k = 0;r = new Random ();(this. free (i)! = 0)(int j = 0; j <
n; j++)( (matr [i, j] == - 1) && (k < kol))
{ this. matr [i, j] = r. Next (2,5); k++; }kol -
k;
}int Out (int i) // выгружает и показывает сколько выгрузил
{k = 0;(int j = 0; j < n; j++)(matr [i, j] ==
0)
{ this. matr [i, j] = - 1; k++; }k;
}bool CheckWork () // выводит true если на маршруте есть хотябы один автобус
{(int i = 0; i < m; i++)(matr [i,n]! =-1)true;
return false;
}void Tic () // уменьшает время до остановки всех автобусов
{(int i = 0; i < m; i++)(matr [i, n] > - 1).
matr [i, n] = matr [i, n] - 1;
}int Exit (int i) // сход с маршрута возвращает выгруженных
пасажиров
{k=0;(int j = 0; j < n; j++)(matr [i,j]! =-1)
{ this. matr [i, j] = - 1; k++; }. SetT (i, -
1);k;
}
}void Form1_Load (object sender, EventArgs e)
{= Convert. ToDateTime ("01.05.2014 08: 00:
00");. Text = Convert. ToString (time). Remove (0,11);
}void timer1_Tick (object sender, EventArgs e)
{r = new Random ();. Text = Convert. ToString
(avtopark. GetK (comboBox1. SelectedIndex));. Text = Convert. ToString (avtopark.
free (comboBox1. SelectedIndex));. Text = Convert. ToString (avtopark. km
[comboBox1. SelectedIndex]);(avtopark. CheckWork ())
{(int i = 0; i < avtopark. matr. GetLength
(0); i++)
{
{
// обработка очередей
{( (avtopark. matr. GetLength (0) > 1) &&
(avtopark. GetT (i)! = - 1))
{( ( (avtopark. km [i - 1] - avtopark. km [i])
< 1) && (avtopark. GetT (i - 1)! = - 1))
{ avtopark. SetT (i, avtopark. GetT (i) + 1);
avtoch++; }
}( ( (avtopark. km [i] - avtopark. km [avtopark.
matr. GetLength (0) - 1] - ost. n) > - 1) && (avtopark. GetT
(avtopark. matr. GetLength (0) - 1)! = - 1))
{ avtopark. SetT (i, avtopark. GetT (i) + 1);
avtoch++; }
}
}
}
// обработка проезда(avtopark. GetT (i) == 0)
{( (avtopark. GetK (i) == 0) && (time
>= Convert. ToDateTime ("02.05.2014 00: 00: 00")))+= avtopark.
Exit (i);
{ // на остановке+= avtopark. Out (i);(avtopark. free (i) >
ost. Kolvo [avtopark. GetK (i)])(avtopark. wait [i])
{- 1: { avtopark. SetT (i, r. Next (1,3));
avtopark. wait [i] = 0; } break; // ожидание на остановке0:
{. Kolvo [avtopark. GetK (i)] = avtopark. In (i,
ost. Kolvo [i]);. km [i] ++;(avtopark. GetK (i)! = ost. Kolvo. GetLength (0) -
1). SetK (i, avtopark. GetK (i) + 1);. SetK (i, 0);. SetT (i, Convert. ToInt32
(textBox3. Text));. wait [i] = - 1;
} break;
}
{. Kolvo [avtopark. GetK (i)] = avtopark. In (i,
ost. Kolvo [i]);. km [i] ++;(avtopark. GetK (i)! = ost. Kolvo. GetLength (0) -
1). SetK (i, avtopark. GetK (i) + 1);. SetK (i, 0);. SetT (i, Convert. ToInt32
(textBox3. Text));. wait [i] = - 1;
}
}
}
}
}
{(true);. Enabled = false;. Enabled = false;.
Enabled = true;. Text = Convert. ToString (oborot*Convert. ToInt32 (textBox5.
Text));. Text = Convert. ToString (avtoch);. DroppedDown = false;. Items. Clear
();= new Bitmap (pictureBox1. Width, pictureBox1. Height);= Graphics. FromImage
(mbit);MyPen = new Pen (Color. Lime);. FillRectangle (Brushes. Black, 0, 0,
pictureBox1. Width, pictureBox1. Height);. DrawLine (MyPen, 20, 185, 20, 1);
gr. DrawLine (MyPen, 21, 185, 21, 1);. DrawLine (MyPen, 20, 185, 310, 185); gr.
DrawLine (MyPen, 20, 184, 310, 184);(int i = 0; i < 16; i++). DrawString
(Convert. ToString (i + 8), new Font ("Arial",
), new SolidBrush (Color. Lime), 24 + i * 17,
186);. DrawString (Convert. ToString (0), new Font ("Arial",
), new SolidBrush (Color. Lime), 24 + 16 * 17,
186);(int i = 0; i < 17; i++). DrawLine (MyPen, 31 + i * 17, 185, 31 + i *
17, 1);(int i = 1; i < 17; i++). DrawLine (MyPen, 31 + (i - 1) * 17, -
Convert. ToInt32 (165 * (GrIncome [i - 1] / GrIncome. Max ())) + 20 + 165, 31 +
i * 17, - Convert. ToInt32 (165 * (GrIncome [i] / GrIncome. Max ())) + 20 +
165);. Image = mbit;= new Bitmap (pictureBox2. Width, pictureBox2. Height);=
Graphics. FromImage (mbit);. FillRectangle (Brushes. Black, 0, 0, pictureBox2.
Width, pictureBox2. Height);. DrawLine (MyPen, 20, 185, 20, 1); gr. DrawLine
(MyPen, 21, 185, 21, 1);. DrawLine (MyPen, 20, 185, 310, 185); gr. DrawLine
(MyPen, 20, 184, 310, 184);(int i = 0; i < 16; i++). DrawString (Convert.
ToString (i + 8), new Font ("Arial",
), new SolidBrush (Color. Lime), 24 + i * 17,
186);. DrawString (Convert. ToString (0), new Font ("Arial",
), new SolidBrush (Color. Lime), 24 + 16 * 17,
186);(int i = 0; i < 17; i++). DrawLine (MyPen, 31 + i * 17, 185, 31 + i *
17, 1);. Color = Color. Red;(int i = 1; i < 17; i++). DrawLine (MyPen, 31 +
(i - 1) * 17, - Convert. ToInt32 (165 * (GrPas [i - 1] / maxi (GrPas. Max (),
GrGetedPas. Max ()))) + 20 + 165, 31 + i * 17, - Convert. ToInt32 (165 * (GrPas
[i] / maxi (GrPas. Max (), GrGetedPas. Max ()))) + 20 + 165);. Color = Color.
Yellow;(int i = 1; i < 17; i++). DrawLine (MyPen, 31 + (i - 1) * 17, -
Convert. ToInt32 (165 * (GrGetedPas [i - 1] / maxi (GrPas. Max (), GrGetedPas.
Max ()))) + 20 + 165, 31 + i * 17, - Convert. ToInt32 (165 * (GrGetedPas [i] /
maxi (GrPas. Max (), GrGetedPas. Max ()))) + 20 + 165);. Image = mbit;
}
// графики( (time. Minute == 0) && (time
<= Convert. ToDateTime ("02.05.2014 00: 00: 00")))
{k=time. Hour - 8;(k < 0) k = 16;[k] = pas;[k]
= (oborot-oborothour) *Convert. ToInt32 (textBox5. Text);[k] = svobodnihmest;=
oborot;= 0;= 0;
}(int i = 0; i < ost. n; i++)+=ost. Kolvo
[i];(int i = 0; i < avtopark. matr. GetLength (0); i++)+= avtopark. free
(i);(time == Convert. ToDateTime ("02.05.2014 00: 00: 00")). Text =
Convert. ToString (oborot) + "/" + Convert. ToString (ost. kol);. Tic
();. Tic (time. Hour - 8);= time. AddMinutes (1);. Text = Convert. ToString
(time). Remove (0,11);. PerformStep ();(button1. Text == "Продолжить").
Enabled = false;
}void textBox3_TextChanged (object sender,
EventArgs e)
{s = "";(int i = 0; i < textBox3.
TextLength; i++)( (textBox3. Text [i] <= '9') && (textBox3. Text [i]
>= '0'))= s + textBox3. Text [i];. Text = s;
}void textBox2_TextChanged (object sender,
EventArgs e)
{s = "";(int i = 0; i < textBox2.
TextLength; i++)( (textBox2. Text [i] <= '9') && (textBox2. Text [i]
>= '0'))= s + textBox2. Text [i];. Text = s;
}void textBox1_TextChanged (object sender,
EventArgs e)
{s = "";(int i = 0; i < textBox1.
TextLength; i++)( (textBox1. Text [i] <= '9') && (textBox1. Text [i]
>= '0'))= s + textBox1. Text [i];. Text = s;
}void textBox4_TextChanged (object sender,
EventArgs e)
{s = "";(int i = 0; i < textBox4.
TextLength; i++)( (textBox4. Text [i] <= '9') && (textBox4. Text [i]
>= '0'))= s + textBox4. Text [i];. Text = s;
}void textBox6_TextChanged (object sender,
EventArgs e)
{s = "";(int i = 0; i < textBox6.
TextLength; i++)( (textBox6. Text [i] <= '9') && (textBox6. Text [i]
>= '0'))= s + textBox6. Text [i];. Text = s;
}void OnOff (bool b)
{. Enabled = b; textBox2. Enabled = b; textBox3.
Enabled = b; textBox4. Enabled = b; textBox5. Enabled = b; textBox6. Enabled =
b;. Enabled = b; textBox8. Enabled = b; textBox9. Enabled = b; textBox10.
Enabled = b; textBox11. Enabled = b; textBox12. Enabled = b;. Enabled = b;
textBox14. Enabled = b; textBox15. Enabled = b; textBox16. Enabled = b;
textBox17. Enabled = b; textBox18. Enabled = b;. Enabled = b; textBox20.
Enabled = b; textBox21. Enabled = b; textBox22. Enabled = b;
}void button2_Click (object sender, EventArgs e)
{(false);= Convert. ToDateTime ("01.05.2014
08: 00: 00");. Value = 0;= 0; avtoch = 0; pas = 0; oborothour = 0;
svobodnihmest = 0; kolvopas = 0;= new avtobus (Convert. ToInt32 (textBox1.
Text), Convert. ToInt32 (textBox2. Text));=new double [17];=new double [17];=
new double [17];[0] = 0;[0] = 0;[0] = 0;(int i = 0; i < Convert. ToInt32
(textBox1. Text); i++). Items. Add (i);. SelectedIndex = 0;. FirstAvto
(Convert. ToInt32 (textBox4. Text));= new ostanovk (Convert. ToInt32 (textBox6.
Text) * 2);. HourRange [0] = Convert. ToInt32 (textBox7. Text);. HourRange [1]
= Convert. ToInt32 (textBox8. Text);. HourRange [2] = Convert. ToInt32
(textBox9. Text);. HourRange [3] = Convert. ToInt32 (textBox10. Text);.
HourRange [4] = Convert. ToInt32 (textBox11. Text);. HourRange [5] = Convert.
ToInt32 (textBox12. Text);. HourRange [6] = Convert. ToInt32 (textBox13.
Text);. HourRange [7] = Convert. ToInt32 (textBox14. Text);. HourRange [8] =
Convert. ToInt32 (textBox15. Text);. HourRange [9] = Convert. ToInt32
(textBox16. Text);. HourRange [10] = Convert. ToInt32 (textBox17. Text);.
HourRange [11] = Convert. ToInt32 (textBox18. Text);. HourRange [12] = Convert.
ToInt32 (textBox19. Text);. HourRange [13] = Convert. ToInt32 (textBox20.
Text);. HourRange [14] = Convert. ToInt32 (textBox21. Text);. HourRange [15] =
Convert. ToInt32 (textBox22. Text);. Enabled = true;. Enabled = false;. Enabled
= true;. Enabled = false;
}void button1_Click (object sender, EventArgs e)
{. Enabled =! timer1. Enabled;(timer1. Enabled ==
true)
{button1. Text = "Пауза";
button4. Enabled = false; }
{ button1. Text = "Продолжить";
button4. Enabled = true; }
}void comboBox1_SelectedIndexChanged (object
sender, EventArgs e)
{(button1. Enabled==true)
{. Text = Convert. ToString (avtopark. GetK
(comboBox1. SelectedIndex));. Text = Convert. ToString (avtopark. free
(comboBox1. SelectedIndex));. Text = Convert. ToString (avtopark. km
[comboBox1. SelectedIndex]);
}
}void button3_Click (object sender, EventArgs e)
{
}void button3_Click_1 (object sender, EventArgs
e)
{( (button1. Enabled == true) && (time.
Hour>8))
{(true);. Enabled = false;. Enabled = false;.
Text = "Пауза";.
Enabled = false;. Enabled = true;. Text = Convert. ToString (oborot * Convert.
ToInt32 (textBox5. Text));. Text = Convert. ToString (avtoch);. DroppedDown =
false;. Items. Clear ();= new Bitmap (pictureBox1. Width, pictureBox1.
Height);= Graphics. FromImage (mbit);MyPen = new Pen (Color. Lime);.
FillRectangle (Brushes. Black, 0, 0, pictureBox1. Width, pictureBox1. Height);.
DrawLine (MyPen, 20, 185, 20, 1); gr. DrawLine (MyPen, 21, 185, 21, 1);.
DrawLine (MyPen, 20, 185, 310, 185); gr. DrawLine (MyPen, 20, 184, 310,
184);(int i = 0; i < 16; i++). DrawString (Convert. ToString (i + 8), new
Font ("Arial",
), new SolidBrush (Color. Lime), 24 + i * 17,
186);. DrawString (Convert. ToString (0), new Font ("Arial",
), new SolidBrush (Color. Lime), 24 + 16 * 17,
186);(int i = 0; i < 17; i++). DrawLine (MyPen, 31 + i * 17, 185, 31 + i *
17, 1);(int i = 1; i < 17; i++). DrawLine (MyPen, 31 + (i - 1) * 17, -
Convert. ToInt32 (165 * (GrIncome [i - 1] / GrIncome. Max ())) + 20 + 165, 31 +
i * 17, - Convert. ToInt32 (165 * (GrIncome [i] / GrIncome. Max ())) + 20 +
165);. Image = mbit;= new Bitmap (pictureBox2. Width, pictureBox2. Height);=
Graphics. FromImage (mbit);. FillRectangle (Brushes. Black, 0, 0, pictureBox2.
Width, pictureBox2. Height);. DrawLine (MyPen, 20, 185, 20, 1); gr. DrawLine
(MyPen, 21, 185, 21, 1);. DrawLine (MyPen, 20, 185, 310, 185); gr. DrawLine
(MyPen, 20, 184, 310, 184);(int i = 0; i < 16; i++). DrawString (Convert.
ToString (i + 8), new Font ("Arial",
), new SolidBrush (Color. Lime), 24 + i * 17,
186);. DrawString (Convert. ToString (0), new Font ("Arial",
), new SolidBrush (Color. Lime), 24 + 16 * 17,
186);(int i = 0; i < 17; i++). DrawLine (MyPen, 31 + i * 17, 185, 31 + i *
17, 1);. Color = Color. Red;(int i = 1; i < 17; i++). DrawLine (MyPen, 31 +
(i - 1) * 17, - Convert. ToInt32 (165 * (GrPas [i - 1] / GrPas. Max ())) + 20 +
165, 31 + i * 17, - Convert. ToInt32 (165 * (GrPas [i] / GrPas. Max ())) + 20 +
165);. Color = Color. Yellow;(int i = 1; i < 17; i++). DrawLine (MyPen, 31 +
(i - 1) * 17, - Convert. ToInt32 (165 * (GrGetedPas [i - 1] / GrGetedPas. Max
())) + 20 + 165, 31 + i * 17, - Convert. ToInt32 (165 * (GrGetedPas [i] /
GrGetedPas. Max ())) + 20 + 165);. Image = mbit;
}
}void button4_Click (object sender, EventArgs e)
{. Enabled = true;
}
}
}