Обоснование выбора используемой модели
В пределах одного перекрестка количество машин попадающих в область обработки строго ограничена физической вместимостью перекрестка. При небольшом количестве одновременно обрабатываемых машин удобно применять алгоритмы микромоделирования. Для каждой машины достаточно разработать систему принятия решений о поведении на следующем шаге и при расчете нового состояния системы достаточно опросить все присутствующие в системе в данный момент машины, получить данные об их поведении на следующем шаге и перевести систему в новое состояние. Для расчета состояния системы, состоящей из одного перекрестка вполне достаточно вычислительной мощности одного ПК. КОНСТРУКТОРСКАЯ ЧАСТЬ Описание логической структуры программы
Общая структура модели: На каждом шаге мы имеем следующие данные о системе: · Текущее системное время 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|