Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Обоснование выбора используемой модели




 

В пределах одного перекрестка количество машин попадающих в область обработки строго ограничена физической вместимостью перекрестка.

При небольшом количестве одновременно обрабатываемых машин удобно применять алгоритмы микромоделирования. Для каждой машины достаточно разработать систему принятия решений о поведении на следующем шаге и при расчете нового состояния системы достаточно опросить все присутствующие в системе в данный момент машины, получить данные об их поведении на следующем шаге и перевести систему в новое состояние.

Для расчета состояния системы, состоящей из одного перекрестка вполне достаточно вычислительной мощности одного ПК.


КОНСТРУКТОРСКАЯ ЧАСТЬ

Описание логической структуры программы

 

Общая структура модели:

На каждом шаге мы имеем следующие данные о системе:

· Текущее системное время t

· Напрвленный граф разрешенных траекторий движения по перекрестку

o Множество вершин

§ Состояние вершины (движение или разрешено светофором или запрещено)

§ Приоритет вершины (знак «главная дорога» или знак «уступи дорогу»)

o Множество ребер

§ Список указателей на машины, находящиеся на данном ребре (загруженность)

§ Вес ребра (вес определяется исходя из длины ребра и его загруженности).

· Множество машин

o Текущее положение машины

o Текущее состояние машины (ускорение или замедление машины, а так же ее скорость)

Чтобы перевести систему в новое состояние необходимо:

· Выполнить расчет новых текущих параметров машин с учетом алгоритма их поведения

·   Вычислить новые положения машин с учетом вычисленных на предыдущем этапе параметров (ускорение, замедление)

·   Перевести текущее время системы в новое значение t’

Непрерывно переводя систему в новое положение, получаем непрерывный процесс изменения состояния системы от времени.

Структура классов

 

Для моделирования структуры проезжих частей и допустимых траекторий движения на перекрестке используется направленный граф. Вершины графа - точки слияния траекторий, а ребра графа - траектории движения на данном участке полосы.

Класс vertex - описывает отдельный узел графа.

Параметры

· double X,Y; - координаты для отображения узла на экране.

·   TList *s_owners; - список ребер, исходящих из этой вершины.

·   TList *e_owners; - список ребер, заканчивающихся в этой вершине.

·   bool checked; - флаг проверки, используемый в алгоритме Дейкстры для поиска пути

·   double W; - текущая цена пути до этой вершины, используется в алгоритме Дейкстры

·   bool is_open; - флаг, показывающий, разрешен ли в настоящий момент проезд через эту вершину (состояние светофора, влияющего на эту вершину)

·   TDateTime LastCh; - время последнего изменения состояния светофора

·   int period_in_msec; - период работы светофора, принимает положительные значения и -1. Если значение данного параметра равно -1, значит данная вершина всегда открыта (не регулируется светофором)

·   float closed_to_per; - соотношение времени закрытия светофора к его периоду работы в процентах.

·   bool main; - принадлежность к «главной» траектории на перекрестке, имитирует знак «главная дорога».

·   bool in_out; - флаг, показывающий, является ли данная вершина въездом на перекресток или выездом с перекрестка.

Методы

· vertex::vertex(); - конструктор вершины

·   int vertex::time_to_change(); - функция, возвращает время, оставшееся до изменения состояния светофора

Структура edge - ребро графа.

Параметры

· double r_length; - длина ребра в метрах.

·   vertex *start; - вершина, являющаяся началом этого ребра.

·   vertex *end; - вершина, являющаяся концом этого ребра.

·   double angles[2]; - углы направлений входящего и исходящего ребер.

·   double angle; - угол направления данного ребра

·   TList *cars; - динамический список машин, находящихся на ребре.

·   TList *cross_pts; - список пересечений с другими ребрами, не являющихся вершинами.

·   bool linear; - флаг, показывающий, является ли ребро прямой или дугой.

·   TColor C; - цвет для отображения ребра на экране

·   int w; - динамический вес ребра (зависит от плотности потока на ребре)

·   double scale; - масштаб отображения

Методы

· void edge::get_point(double p, double &X, double &Y); - функция, возвращает переменных X и Y значения координат в точке p траектории. (р изменяется от 0 до 1, 0 - начало ребра, 1 - конец ребра).

Структура e_cross - информация о пересечении ребер, не являющемся вершиной.

Параметры

· double p; - положение пересечения на первом ребре.

·   edge *E; - первое ребро

·   double p_; - положение пересечения на втором ребре

·   edge *E_; - второе ребро.

·   bool you_major; - флаг приоритета первого ребра над вторым.

Класс graph

Параметры

· bool finding; - флаг, отмечающий, что в данный момент на графе производится поиск пути одной из его машин. Если данный флаг установлен в значение истины, параметры вершин и ребер графа изменять нельзя.

·   double scale; - масштаб отображения графа.

·   TList *Verts; - динамический список вершин графа

·   TList *Edges; - динамический список ребер графа

·   TList *Cars; - динамический список машин, находящихся на графе

Методы

· graph::graph(); - конструктор графа

·   void graph::add_v(vertex *V); - добавить вершину V в граф

·   void graph::connect_v(vertex *V1, vertex *V2, bool l); - связать две вершины V1 и V2 ребром, если флаг l - истина - ребро является прямой, иначе - ребро является дугой.

·   void graph::draw(); - функция, отображающая граф и все машины на экране.

·   void graph::reconnect(); - функция, проверяющая связность графа и правильность параметров отображения ребер.

·   TList *graph::path(vertex *V1, vertex *V2); - функция, возвращает список вершин, через которые проходит маршрут между вершинами V1 и V2.

·   bool graph::is_reachable(vertex *V1, vertex *V2); - проверяет, достижима ли вершина V2 из вершины V1.

·   void graph::find_crosses(); - найти все пересечения ребер

·   TList *graph::find_cross_pts(edge *E); - найти пересечения для ребра Е.

Класс car - класс описывает отдельную машину и реализует ее поведение.

Параметры

· edge *line; - текущее ребро

·   edge *next_line; - следующее ребро маршрута

·   vertex *Aim; - целевая вершина

·   vertex *start; - стартовая вершина

·   TList *otherCars; - указатель на список всех машин в системе

·   TList *path_edges; - список ребер, составляющих путь следования к целевой вершине

·   bool pomeha; - флаг наличия помехи

·   bool stop_on_red; - флаг остановки на светофоре

·   double place - текущее положение на ребре

·   int e_index; - номер позиции на ребре

·   int cX,cY; - координаты для отображения

·   car *main_car; - указатель на машину, представляющую собой помеху

·   e_cross *danger_cross; - пересечение, на котором существует помеха.

·   float max_speed; - максимальная скорость в м/мсек

·   float curr_speed; - текущая скорость в м/мсек

·   float max_uskor; - максимальное ускорение в м/мсек2

·   float max_zamedl; - максимальное замедление в м/мсек2

·   float curr_uskor; - текущее ускорение в м/мсек2

·   float curr_zamedl; - текущее замедление в м/мсек2

·   TDateTime PrevTime; - время последнего изменения состояния

·   graph *road; - указатель на граф, содержащий текущую траекторию

Методы

· car::car(double m_s, double m_u, double m_z, double c_s, vertex *Start, vertex *Finish, graph *Road, TList *otCars); - конструктор машины, параметры m_s - максимальная скорость, m_u - максимальное ускорение, m_z - максимальное замедление, c_s - начальная скорость, Start - исходная вершина, Finish - конечная вершина, Road - граф траекторий, otCars - указатель на списокостальных машин.

·   void car::start_first_line(vertex *V, vertex *Vn); - получить начальное состояние, в вершине V с целевой вершине Vn.

·   void car::get_state(); - вычислить новое состояние.

·   void car::move(); - перейти в новое состояние.

·   void car::get_next_line(double Ln); - перейти на новую траекторию

·   void car::draw(); - отобразить машину

·   double car::dX_now(); - получить текущее смещение между текущим и следующим состоянием

·   double car::next_pos_now(); - получить значение следующего положения машины на траектории.

·   double car::crit_dist(); - получить критическую дистанцию для данной машины

·   double car::dist_by_time(double accel, double time_ms); - определить путь, пройденный с указанным ускорением, за указанное время.

·   double car::dist_to_stop(double accel); - определить тормозной путь с заданнымзамедлением.

·   double car::accel_by_dist_to_stop(double Ln); - получить ускорение необходимое для того, чтобы остановиться на указанном отрезке.

·   double car::accel_by_next_car(double s_next, double dist41, double realdist); - получить ускорение для коррекции состояния по следующей машине (следование за лидером)

·   double car::time_for_dist(double dist); - определить время прохождения дистанции

·   double car::check_distance(double &next_speed); - скорректировать состояние относительно скорости впереди едущей машины для соблюдения оптимальной дистанции.

·   double car::nearest_car_dist(); - определить дистанцию до ближайшей машины впереди на текущей траектории.

·   void car::follow(); - определить состояние с учетом только следования за лидером

·   void car::is_danger(); - определить состояние с учетом помех

·   void car::is_not_danger(); - определить состояние с учетом существующей помехи, проверить условие отмены помехи.

·   void car::check_light(); - проверить ближайший светофор впереди

·   car *car::take_prev_car(double &prev_dist); - получить указатель на идущую сзади машину

Основные алгоритмы

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...