Программа управления светофором посредством системы нечетких множеств

IX Международный конкурс научно-исследовательских и творческих работ учащихся
Старт в науке

Программа управления светофором посредством системы нечетких множеств

Плешков А.О. 1
1МБОУ СШ 31
Муслимова Д.Г. 1
1МБОУ СШ 31
Автор работы награжден дипломом победителя II степени
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF

Введение

Наиболее удивительным свойством интеллекта человека является возможность принятия верных решений при наличии неполной либо нечеткой информации. Обычные вычисления на компьютерах являются «слишком точными» для реального мира. Однако существуют проблемы, для решения которых получить полную информацию невозможно. Можно подумать, что ситуация безвыходная, однако благодаря совершенствованию и развитию нечетких и гибридных систем сейчас уже «сверхинтеллектуальные» бытовые автоматы и стиральные машины, а также самонаводящиеся ракеты, гиперзвуковые самолеты и многое другое воспринимаются довольно обыденно.

Математическая теория нечетких множеств, предложенная в 1965 году в работах Лотфи А. Заде, профессора технических наук Калифорнийского университета в Беркли, позволяет описать нечеткие понятия и знания, оперировать этими знаниями и делать нечеткие выводы. Наличие математических средств отображения нечеткой исходной информации позволят строить модель, адекватную реальности. Поэтому рассматриваемая тема является актуальной.

Цель: создать модель практического применения нечетких множеств.

Задачи:

Рассмотреть основные определения теории нечетких множеств, свойства нечетких множеств и операции над нечеткими множествами.

Проанализировать приложения нечёткой математики на примере нечёткого регулятора.

Определить технические системы, в которых используется нечёткая математика.

Объект исследования: элементы нечёткой математики.

Предмет исследования: приложение нечёткой математики к решению инженерных задач.

Гипотеза: инженерные задачи с недостаточными данными целесообразно решать с использованием нечёткой математики.

Методы:

1. Содержательный анализ отечественной и зарубежной математической литературы

2. Эмпирические методы: наблюдение, анализ работы транспортной инфраструктуры, объектно-ориентированная технология создания программы.

Этапы исследования:

I этап – поисковый. Осмысление теоретических основ исследования, определение ведущих позиций исследования и его терминологического поля, осуществление поиска теоретико-методологической стратегии практического применения нечетких множеств.

II этап – опытно-экспериментальный. Экспериментальное исследование работы транспортной инфраструктуры. Разработка программы работы светофора с использованием датчика движения; проверка результативности данной программы.

III этап – заключительно-обобщающий. Итоговая обработка результатов реализации программы, уточнение выводов, обобщение результатов исследования.

Глава 1. Нечеткие множества: основные определения, свойства и операции.

1.1. Основные определения и свойства нечетких множеств.

Определение 1.1. Допустим это множество, - элемент этого множества. Тогда нечетким подмножеством либо множеством , относящегося к множеству , называется множество упорядоченных пар:

.

Здесь - некая функция из множества входит в так называемое множество принадлежностей . Таким образом, функция является функцией принадлежности [3].

Впоследствии множество неотрицательных действительных чисел будем рассматривать в качестве множества принадлежностей.

Допустим . Тогда нечеткое множество следует рассмотреть в качестве «не нечеткого» либо простого обычного множества. Следовательно, обычные множества будут являться частными случаями нечетких множеств.

Рассмотрим в качестве примера нечеткое множество «высокие люди». К высоким людям отнесем людей ростом более двух метров, низкими –ростом ниже 170 см. Что расположено между данными границами? Учитывая, что чем больше рост человека, тем он выше. Таким образом, функция принадлежностей может выглядеть как на рис. 1. (см. Приложение 1)

Другим интересным примером нечетких множеств являются нечеткие числа.

Определение 1.2. Нечеткое подмножество универсального множества действительных чисел называется нечетким числом. Его функция принадлежности должна удовлетворять условиям:

нормальность: ,

непрерывность,

выпуклость: .

(см. Приложение 1, рис. 2)

Приведем свойства нечетких множеств.

Определение 1.3. Высота нечеткого множества – это верхняя граница функции его принадлежности: .

Если принять, что высота нечеткого множества равна единице, то это множество нормальное. Чтобы нечеткое множество сделать нормальным (нормализовать) его нужно преобразовать: .

Множество с функцией принадлежности является нормальным.

Далее будем рассматривать множества с высотой 1.

Определение 1.4. Четкое подмножество универсального множества называется носителем нечеткого множества. Его элементы имеют ненулевые степени принадлежности: .

Нечеткое множество является пустым, если его носитель пустое множество.

Определение 1.5. Четкое подмножество универсального множества называется ядром нечеткого множества, если .

Определение 1.6. Четкое подмножество множества называется -сечением (или множеством -уровня) нечеткого множества, если . В качестве носителя (ядра) можно рассматривать сечение нечеткого множества на нулевом (единичном) -уровне. (см. Приложение 1, рис. 3)

1.2. Операции над нечеткими множествами

Допустим множества и являются нечеткими, имеющими функции принадлежности и соответственно.

Определение 1.7. Примем, что множество содержится в , при и обозначим .

Определение 1.8. Примем, что множества и будут равны тогда и только при таком условии, что и обозначим .

Допустим, что множество принадлежностей .

Определение 1.9. Примем, что множества и дополняют друг друга, при условии и обозначим или . (см. Приложение 1, рис. 4)

Определение 1.10. Определим пересечение множеств в качестве наибольшего нечеткого множества, которое содержится одновременно и в множестве и в множестве : .

Стоит отметить, что, согласно данному определению, пересечение множества с его дополнением не обязательно будет пусто. (см. Приложение 1, рис. 5)

Определение 1.11. Определим объединение в качестве наименьшего нечеткого множества, которое содержит оба множества, как , так и : . (см. Приложение 1, рис. 6)

Таким образом, оперировать с нечеткими множествами возможно так же, как и с обычными. Далее рассмотрим операцию, которая является специфичной именно для нечетких множеств.

Глава 2. Моделирование работы системы с нечеткой логикой.

2.1. Модели текстового поиска на основе теории нечетких множеств.

Интерпретируем понятия текстового поиска в терминах теории нечетких множеств [5], [6].

Пусть - конечное множество документов коллекции, - конечное множество понятий предметной области коллекции, - конечное множество запросов.

Множество концептуальных индексов документов можно представить как нечеткое бинарное индексирующее отношение: , где - функция принадлежности, обозначающая для каждой пары степень принадлежности понятия документу (вес понятия в концептуальном индексе). Индексирующее отношение индуцирует множества (концептуальные индексы) как нечеткие множества на множестве понятий: , где - вес понятия в концептуальном индексе документа.

Множество концептуальных индексов запросов можно представить как нечеткое бинарное индексирующее отношение: , где — функция принадлежности, обозначающая для каждой пары степень информационной потребности понятия в запросе (вес понятия в концептуальном индексе запроса). Запрос представляется как нечеткое множество понятий: .

Отношение семантической связанности понятий можно представить как нечеткое рефлексивное отношение на с функцией принадлежности , где - семантическая связанность понятий и : .

С целью повышения эффективности текстового поиска вводится понятие расширенного запроса: исходный запрос, дополненный семантически связанными понятиями.

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

Расширенный запрос представляется как образ нечеткого множества при нечетком отображении (отношении) - нечеткое множество : . По принципу обобщения функция принадлежности множества имеет вид: .

Расширенный запрос представляется как результат композиции двух нечетких отношений и , если рассматривать как нечеткое унарное отношение на множестве : , .

Композиция нечетких отношений определяется разными способами. Максиминная композиция нечетких отношений и на определяется функцией принадлежности вида ,

минимаксная композиция - функцией принадлежности вида ,

максимультипликативная композиция - функцией принадлежности вида .

Релевантность документа запросу определяется различными способами.

Релевантность документов запросу определяется как близость между двумя нечеткими множествами. Близость между двумя нечеткими множествами вычисляется различными способами (Mitrovic, 2006), например, как обобщение мер близости между двумя четкими множествами: Хемминга, Эвклида, Дайса и др.

Релевантность документов запросу определяется как образ нечеткого множества на четкое множество при нечетком индексирующем отображении (отношении) : .

По принципу обобщения функция принадлежности множества имеет вид: .

Функция определяет релевантность документа запросу .

Релевантность документов запросу определяется как результат композиции двух нечетких отношений и , если рассматривать как нечеткое унарное отношение на множестве : , ,

где определяет релевантность документа запросу , вычисляется в зависимости от выбранной композиции.

В данной модели применяется принцип обобщения – это универсальный принцип теории нечетких множеств. Эта теория используется для преобразования от отношений между понятиями к отношениям между документами и запросами, или к релевантности документов запросам от связанности понятий.

На начальном этапе отношение связанности обобщается на понятиях, для получения нечеткого отношения связанности нечетких запросов с единственным понятием: .

Далее принцип обобщения применяется еще раз. При этом нечеткое отношение связанности нечетких запросов с одним понятием обобщается, для получения нечеткого отношения релевантности нечетким запросам нечетких документов :

Формула может быть преобразована к виду:

Следовательно, релевантность документа запросу вычисляется по формуле .

Модель текстового поиска с расширением запроса, основанная на максимальной близости между нечеткими множествами

В предлагаемой модели используется расширение запроса максиминной композицией нечетких отношений и : .

Функция определяет степень принадлежности понятия расширенному запросу .

Релевантность документа запросу определяется как близость между двумя нечеткими множествами: расширенным запросом и документом.

Определим близость между нечеткими множествами и на множестве следующим образом: .

Тогда релевантность документа запросу с использованием введенной близости будет вычисляться по формуле:

что эквивалентно формуле.

Модель релевантности из работы [1] можно представить как последовательное применение двух композиций: , .

Если на каждом этапе применять максиминную композицию [1], то релевантность документа запросу тоже будет вычисляться по формуле.

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

2.2. Светофор, как пример алгоритма работы нечеткого множества

2.2.1. Разработка нечеткой системы управления светофором

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

При работе обычного светофора время работы зеленого и красного света на перекрестке, а также время работы цикла светофора зафиксированы. Это может привести к появлению автомобильных пробок, особенно в часы пик.

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

Для примера рассмотрена работа обычного светофора на перекрестке улиц И. Каролинского - Университетская г. Сургут. Время горения зеленого и красного света обычного светофора на перекрестке 30 секунд, тогда продолжительность работы обычного и нечеткого светофоров будет 60 секунд.

В нечетком светофоре продолжительность работы зеленого света будет меняться в зависимости от количества подъезжающих к перекрестку машин. Для работы нечеткого светофора на перекрестке улиц И. Каролинского (далее север-юг) – Университетская (далее запад-восток) необходимо установить 8 датчиков, подсчитывающих количество проехавших машин (рис. 1).

Рис. 1 Расположение датчиков на перекрестке улиц И. Каролинского -Университетская

В системе представлены две входные переменные. Первая переменная - количество машин на стороне прибытия, вторая - количество машин со стороны встречного движения.

Допустим, зеленый горит для дороги со стороны прибытия (дорога север – юг), а дорога встречного движения (дорога запад-восток) — стороной скапливающейся очереди.

Для того чтобы очередь не скапливалась, необходимо увеличить продолжительность зеленого света на этой стороне. Тогда правила нечеткого регулятора (увеличивать продолжительность зеленого света или не) будут приниматься решение на основе текущих условий движения. Для управления светофором есть четыре функции принадлежности и механизм логического вывода.

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

Для разработки нечеткой системы управления светофором были сделаны следующие допущения:

Если (число машин север-юг = малое или очень малое) и (число машин запад-восток = большое) и (время зеленого света север-юг = большое), то (время зеленого света = уменьшить).

Если (число машин север-юг = малое или очень малое) и (число машин запад-восток = среднее) и (время зеленого света запад-восток = малое), то (время зеленого света = увеличить).

Если (число машин север-юг =большое или очень большое) и (число машин запад-восток =малое или очень малое) и (время зеленого света север-юг =малое), то (время зеленого света=увеличить).

Если (число машин запад-восток = малое или очень малое) и (число машин север-юг = большое) и (время зеленого света запад-восток = большое), то (время зеленого света = уменьшить).

Если (число машин запад-восток =большое или очень большое) и (число машин север-юг =среднее) и (время зеленого света север-юг =большое), то (время зеленого света=уменьшить).

Если (число машин запад-восток =большое или очень большое) и (число машин север-юг =малое) и (время зеленого света запад-восток =малое), то (время зеленого света=увеличить).

Все выше перечисленные условия легли в основу компьютерной программы, разработанную нами для демонстрации применения нечётких множеств в работе нечёткого светофора. (Приложение на электронном носителе).

2.2.2 Описание работы программы нечеткого светофора на Delphi

Программа для работы нечеткого светофора была написана с помощью использования Delfi. Delphi - это среда быстрой разработки, в которой в качестве языка программирования используется Object Pascal.

Стандартные компоненты Delphi перечислены ниже с некоторыми комментариями по их применению.

TMainMenu позволяет Вам поместить главное меню в программу. При помещении TMainMenu на форму это выглядит, как просто иконка. Иконки данного типа называют "невидимыми компонентом", поскольку они невидимы во время выполнения программы.

TPopupMenu позволяет создавать всплывающие меню. Этот тип меню появляется по щелчку правой кнопки мыши.

TLabel служит для отображения текста на экране. Вы можете изменить шрифт и цвет метки, если дважды щелкнете на свойство Font в Инспекторе Объектов.

TEdit - стандартный управляющий элемент Windows для ввода. Он может быть использован для отображения короткого фрагмента текста и позволяет пользователю вводить текст во время выполнения программы.

TMemo - иная форма TEdit. Подразумевает работу с большими текстами. TMemo может переносить слова, сохранять в Clipboard фрагменты текста и восстанавливать их, и другие основные функции редактора. TMemo имеет ограничения на объем текста в 32Кб, это составляет 10-20 страниц.

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

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

TScrollbar - полоса прокрутки, появляется автоматически в объектах редактирования, ListBox’ах при необходимости прокрутки текста для просмотра.

TGroupBox используется для визуальных целей и для указания Windows, каков порядок перемещения по компонентам на форме (при нажатии клавиши TAB).

TPanel - управляющий элемент, похожий на TGroupBox, используется в декоративных целях. Чтобы использовать TPanel, просто поместите его на форму и затем положите другие компоненты на него. Теперь при перемещении TPanel будут передвигаться и эти компоненты. TPanel используется также для создания линейки инструментов и окна статуса.

TScrollBox представляет место на форме, которое можно скроллировать в вертикальном и горизонтальном направлениях. Пока Вы в явном виде не отключите эту возможность, форма сама по себе действует так же. Однако, могут быть случаи, когда понадобится прокручивать только часть формы. В таких случаях используется TScrollBox.

Написанная с помощью Delphi, данная программа позволила смоделировать регулирование движение автотранспорта на перекрестке посредством сигналов светофора с нечеткой системой управления.

При запуске программы появляется окно (рис.2), интерфейс которого представляет собой сочетание нескольких кнопок (старт, стоп, настройки, трафик) и меток (время, север, юг, запад, восток, время зеленого света, время красного света).

Рис.2 Главное окно программы

При нажатии кнопки старт начинается отсчет времени, запускается таймер, и светофоры начинают работать. Задается начальное количество машин, которое будет меняться в зависимости от работы светофоров. Изменившееся количество выводится в метки (север, юг, запад, восток). В зависимости от числа машин, меняется время зеленого и красного света (когда выполняется одно из 10 нечетких правил), которое также выводится в метки. При нажатии кнопки стоп, останавливается таймер и фиксируется последнее изменение. В программе можно настроить, в зависимости от часа суток, сколько машин/мин подъезжает с каждой стороны к перекрестку.

Рис. 3 Ситуация, при которой увеличен поток машин с западного и восточного направления

На рисунке 3 показана ситуация, когда преобладает поток машин с западного и восточного направлений. В результате для светофоров север-юг установились значения: 20 секунд зеленого света, 40 - для красного. Так как поток машин небольшой, то суммарное время цикла осталось минимальным - 60 секунд.

Рис. 4 − Ситуация, при которой увеличен поток машин с южного направления

На рисунке 4 показана ситуация, когда преобладает поток машин с южного направления. В результате для светофоров север-юг установились значения: 90 секунд зеленого света, 30 - для красного. Так как поток машин большой (больше 50), то суммарное время цикла - 120 секунд.

Рис. 5 − Ситуация, при которой увеличен поток машин с южного и восточного направлений

На рисунке 5 показана ситуация, когда преобладает поток машин с южного и восточного направления. В результате для светофоров север-юг установились значения: 60 секунд зеленого света, 60 - для красного. Так как поток машин очень большой (больше 80 машин), то суммарное время цикла стало максимальным - 120 секунд.

Рис. 6 - Настройка трафика

Для настройки количества машин, подъезжающих к перекрестку с каждой из сторон, используется окно "Настройка трафика" (рис.6). В нем для каждого часа суток можно установить количество автомобилей, подъезжающих к перекрестку за 10 секунд.

Таким образом, алгоритм программы нечеткого светофора следующий: на светофор с датчиков движения поступает информация о количестве автомобилей на улицах И. Каролиского и Университетская. Эти данные переводятся в нечеткий формат согласно заданным правилам, далее, внутри программы происходит их обработка, полученное значение изменения времени зеленого света переводится обратно в четкий формат и поступает в виде управляющего сигнала на светофор. В соответствии с этим сигналом время горения зеленого света светофора в следующем цикле будет другим.

Можно сказать, что нечеткая логика на примере модели работы светофора на перекрестке улиц И. Каролиского и Университетская позволяет уменьшить количество пробок в часы пик.

Заключение

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

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

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

При работе обычного светофора время работы зеленого и красного света на перекрестке, а также время работы цикла светофора зафиксированы. Это может привести к появлению автомобильных пробок, особенно в часы пик.

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

Составленная программа автоматизации работы нечеткого светофора позволит уменьшить загруженность дорог.

Список использованной литературы

Панкова Л. А., Пронина В. А., Крюков К. В. Онтологическиемодели поиска экспертов в системах управления знанияминаучных организаций // Проблемы управления. - 2011. -№ 6. - C. 52-60.

Панкова Л.А., Пронина В.А. Модели текстового поиска на основе теории нечетких множеств. // Проблемы управления. Издательство: Сенсидат-Плюс (Москва). – 2013. - №2. – С. 41-44.

Mitrović Zoran, Rusov Srđan. Z Similarity Measure Among FuzzySets // FME Transactions. - 2006. - № 34. - P. 115-119.

Белослудцева О. Нечёткие множества. Нечёткая логика. - Интернет-публикация. 2006. - 19 с.

Заде Л. Понятие лингвистической переменной и его применение к принятию приближенных решений. - СПб.: Питер, 2000. - 384 с.

Орловский С.А. Проблемы принятия решений при нечеткой исходной информации. - М.: Наука, 1981. - 208 с.

Архангельский, А.Я. Программирование в Delphi 7/А.Я. Архангельский. - М.: Бином, 2003

Круглов, В.В. Нечеткая логика и искусственные нейронные сети / В.В. Круглов, М.И. Дли, Р.Ю. Голунов - М.: Физматлит, 2001.

ПРИЛОЖЕНИЕ 1

Рис. 1. График функции принадлежности нечеткого множества «высокие люди»

Рис 2. График функции принадлежности нечеткого числа 4.63

Рис 3. Носитель, ядро, -сечение и -уровень

Рис 4. Нечеткое множество и его дополнение

Рис 5. Пересечение двух нечетких множеств

Рис 6. Объединение двух нечетких множеств.

ПРИЛОЖЕНИЕ 2

unit PMain;

interface

uses

Windows,Messages, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls;

type

TMain = class (TForm)

Button1: TButton;

procedure Button1Click (Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Main: TMain;

implementation

uses POne;

{$R *.dfm}

procedure TMain.Button1Click (Sender: TObject);

begin

One. ShowModal; // открытьформу

end;

end.

unit POne;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, ExtCtrls, StdCtrls, comCtrls;

type

TOne = class (TForm)

Panel1: TPanel;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Image1: TImage;

Button4: TButton;

Timer1: TTimer;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Procedure Draw;

procedure Button1Click (Sender: TObject);

procedure Button2Click (Sender: TObject);

procedure Timer1Timer (Sender: TObject);

procedure FormShow (Sender: TObject);

procedure Button4Click (Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

CarsN, CarsS, CarsE, CarsW: array [0..23] of integer;

end;

var

One: TOne;

N,S,E,W: Integer;

Cn,Cs,Ce,Cw: integer;

min,max,Step: integer;

hour, minute, sec: integer;

Svetofor: boolean;

SvetoforTime: integer;

SvetoforGreen: integer;

SvetoforRed: integer;

S1,S2,S3: boolean;

implementation

{$R *.dfm}

uses PTrafic;

procedure TOne. Button1Click (Sender: TObject);

begin

Timer1. Enabled:=true;

end;

procedure TOne. Button2Click (Sender: TObject);

begin

Timer1. Enabled:=False;

end;

procedure TOne. Button4Click (Sender: TObject);

begin

Trafic. Init;

end;

Procedure TOne.Draw;

var

i, number, count: integer;

begin

Randomize;

// Отрисовкаулицы

Image1. Canvas. Brush. Color:=clGray;

Image1. Canvas. Rectangle (0,0, Image1. Width, Image1. Height);

Image1. Canvas. Pen. Color:=clBlack;

Image1. Canvas. Pen. Width:=3;

Image1. Canvas. MoveTo (50, 200);

Image1. Canvas. LineTo (200, 200);

Image1. Canvas. LineTo (200,50);

Image1. Canvas. MoveTo (300,50);

Image1. Canvas. LineTo (300, 200);

Image1. Canvas. LineTo (450, 200);

Image1. Canvas. MoveTo (50,300);

Image1. Canvas. LineTo (200,300);

Image1. Canvas. LineTo (200,450);

Image1. Canvas. MoveTo (300,450);

Image1. Canvas. LineTo (300,300);

Image1. Canvas. LineTo (450,300);

Image1. Canvas. Pen. Color:=clBlack;

Image1. Canvas. Pen. Style:=psDash;

Image1. Canvas. Pen. Width:=1;

Image1. Canvas. MoveTo (50,250);

Image1. Canvas. LineTo (450,250);

Image1. Canvas. MoveTo (250,50);

Image1. Canvas. LineTo (250,450);

// Отрисовка машин север

Count:=N;

if N mod 2=0 then number:=N div 2 else number:=N div 2+1;

for i:=1 to number do

begin

if Count<>0 then

begin

Image1. Canvas. Brush. Color:=Random (2000000);

Image1. Canvas. Rectangle (210, 195- (i-1) *25,220,175- (i-1) *25);

Count:=Count-1;

end;

if Count<>0 then

begin

Image1. Canvas. Brush. Color:=Random (2000000);

Image1. Canvas. Rectangle (225, 195- (i-1) *25,235,175- (i-1) *25);

Count:=Count-1;

end;

end;

// Отрисовкамашинюг

Count:=S;

if S mod 2=0 then number:=S div 2 else number:=S div 2+1;

for i:=1 to number do

begin

if Count<>0 then

begin

Image1. Canvas. Brush. Color:=Random (2000000);

Image1. Canvas. Rectangle (290,305+ (i-1) *25,280,325+ (i-1) *25);

Count:=Count-1;

end;

if Count<>0 then

begin

Image1. Canvas. Brush. Color:=Random (2000000);

Image1. Canvas. Rectangle (275,305+ (i-1) *25,265,325+ (i-1) *25);

Count:=Count-1;

end;

end;

// Отрисовка машин запад

Count:=W;

if W mod 2=0 then number:=W div 2 else number:=W div 2+1;

for i:=1 to number do

begin

if Count<>0 then

begin

Image1. Canvas. Brush. Color:=Random (2000000);

Image1. Canvas. Rectangle (195- (i-1) *25,295,175- (i-1) *25,285);

Count:=Count-1;

end;

if Count<>0 then

begin

Image1. Canvas. Brush. Color:=Random (2000000);

Image1. Canvas. Rectangle (195- (i-1) *25,280,175- (i-1) *25,270);

Count:=Count-1;

end;

end;

// Отрисовка машин восток

Count:=E;

if E mod 2=0 then number:=E div 2 else number:=E div 2+1;

for i:=1 to number do

begin

if Count<>0 then

begin

Image1. Canvas. Brush. Color:=Random (2000000);

Image1. Canvas. Rectangle (305+ (i-1) *25, 205,325+ (i-1) *25,215);

Count:=Count-1;

end;

if Count<>0 then

begin

Image1. Canvas. Brush. Color:=Random (2000000);

Image1. Canvas. Rectangle (305+ (i-1) *25,220,325+ (i-1) *25,230);

Count:=Count-1;

end;

end;

if Svetofor then

begin

Image1. Canvas. Brush. Color:=clGreen;

Image1. Canvas. Ellipse (180,180, 195, 195);

Image1. Canvas. Ellipse (320,320,305,305);

Image1. Canvas. Brush. Color:=clRed;

Image1. Canvas. Ellipse (180,320, 195,305);

Image1. Canvas. Ellipse (320,180,305, 195);

end

else begin

Image1. Canvas. Brush. Color:=clRed;

Image1. Canvas. Ellipse (180,180, 195, 195);

Image1. Canvas. Ellipse (320,320,305,305);

Image1. Canvas. Brush. Color:=clGreen;

Image1. Canvas. Ellipse (180,320, 195,305);

Image1. Canvas. Ellipse (320,180,305, 195);

end;

Label6. Caption:=IntToStr (SvetoforGreen);

Label7. Caption:=IntToStr (SvetoforRed);

// условияпринадлежности

If (Cn<10) and (Cs<10) and ( (Cw>50) or (Ce>50)) and (SvetoforGreen>20) then

begin

SvetoforGreen:= SvetoforGreen-10;

SvetoforRed:= SvetoforRed+10;

end;

If (Cn<10) and (Cs<10) and ( (Cw>30) and (Cw<60) or (Ce>30) and (Ce<60)) and (SvetoforGreen>20) then

begin

SvetoforRed:= SvetoforRed+10;

SvetoforGreen:= SvetoforGreen-10;

end;

If ( (Cn>60) or (Cs>60)) and ( (Cw<20) and (Ce<20)) and (SvetoforRed>20) then

begin

SvetoforRed:= SvetoforRed-10;

SvetoforGreen:= SvetoforGreen+10;

end;

If (Cw<10) and (Ce<10) and ( (Cn>50) or (Cs>50)) and (SvetoforGreen>20) then

begin

SvetoforGreen:= SvetoforGreen-10;

SvetoforRed:= SvetoforRed+10;

end;

If (Cw>60) and (Ce>60) and ( (Cn>30) and (Cn<60) or (Cs>30) and (Cs<60)) and (SvetoforGreen>20) then

begin

SvetoforGreen:= SvetoforGreen-10;

SvetoforRed:= SvetoforRed+10;

end;

If (Cw>60) and (Ce>60) and ( (Cn<20) or (Cs<20)) and (SvetoforRed>20) then

begin

SvetoforRed:= SvetoforRed-10;

SvetoforGreen:= SvetoforGreen+10;

end;

If (Cn<10) and (Cs<10) and (Cw<10) and (Ce<10) and S1 then

begin

SvetoforGreen:=30;

SvetoforRed:=30;

S1:=False;

S2:=True;

S3:=True;

end;

If ( (Cn>60) or (Cs>60) or (Cw>60) or (Ce>60)) and S3 then

begin

SvetoforGreen:=60;

SvetoforRed:=60;

S1:=True;

S2:=True;

S3:=False;

end;

{If ( ( (Cn>30) and (Cn<50) or (Cs>30) and (Cs<50)) or ( (Ce>30) and (Ce<50) or (Cw>30) and (Cw<50))) and S2 then

begin

SvetoforGreen: =45;

SvetoforRed: =45;

S1: =True;

S2: =False;

S3: =True;

end; }

end;

procedure TOne. FormShow (Sender: TObject);

begin

min:=20;

max:=100;

step:=10;

hour:=20;

minute:=0;

sec:=0;

S1:=True; S2:=True; S3:=True;

CarsN[0]:=2;CarsS[0]:=4;CarsE[0]:=6;CarsW[0]:=7;

CarsN[1]:=2;CarsS[1]:=4;CarsE[1]:=6;CarsW[1]:=7;

CarsN[2]:=2;CarsS[2]:=4;CarsE[2]:=6;CarsW[2]:=7;

CarsN[3]:=2;CarsS[3]:=4;CarsE[3]:=6;CarsW[3]:=7;

CarsN[4]:=2;CarsS[4]:=4;CarsE[4]:=6;CarsW[4]:=7;

CarsN[5]:=2;CarsS[5]:=4;CarsE[5]:=6;CarsW[5]:=7;

CarsN[6]:=2;CarsS[6]:=4;CarsE[6]:=6;CarsW[6]:=7;

CarsN[7]:=2;CarsS[7]:=4;CarsE[7]:=6;CarsW[7]:=7;

CarsN[8]:=7;CarsS[8]:=4;CarsE[8]:=3;CarsW[8]:=9;

CarsN[9]:=6;CarsS[9]:=7;CarsE[9]:=3;CarsW[9]:=3;

CarsN[10]:=2;CarsS[10]:=7;CarsE[10]:=7;CarsW[10]:=4;

CarsN[11]:=2;CarsS[11]:=8;CarsE[11]:=5;CarsW[11]:=4;

CarsN[12]:=3;CarsS[12]:=7;CarsE[12]:=4;CarsW[12]:=5;

CarsN[13]:=2;CarsS[13]:=5;CarsE[13]:=4;CarsW[13]:=3;

CarsN[14]:=3;CarsS[14]:=6;CarsE[14]:=4;CarsW[14]:=5;

CarsN[15]:=4;CarsS[15]:=5;CarsE[15]:=4;CarsW[15]:=5;

CarsN[16]:=6;CarsS[16]:=6;CarsE[16]:=4;CarsW[16]:=4;

CarsN[17]:=6;CarsS[17]:=4;CarsE[17]:=5;CarsW[17]:=6;

CarsN[18]:=5;CarsS[18]:=6;CarsE[18]:=5;CarsW[18]:=6;

CarsN[19]:=6;CarsS[19]:=4;CarsE[19]:=7;CarsW[19]:=6;

CarsN[20]:=3;CarsS[20]:=3;CarsE[20]:=5;CarsW[20]:=5;

CarsN[21]:=3;CarsS[21]:=3;CarsE[21]:=4;CarsW[21]:=5;

CarsN[22]:=4;CarsS[22]:=3;CarsE[22]:=3;CarsW[22]:=3;

CarsN[23]:=2;CarsS[23]:=2;CarsE[23]:=3;CarsW[23]:=2;

Cn:=0;

Cs:=0;

Ce:=0;

Cw:=0;

Svetofor:=False;

SvetoforTime:=0;

SvetoforGreen:=60;

SvetoforRed:=60;

Draw;

end;

procedure TOne. Timer1Timer (Sender: TObject);

begin

sec:=sec+10;

if sec>=60 then

begin

minute:=minute+1;

sec:=0;

end;

if minute>=60 then

begin

hour:=hour+1;

minute:=0;

end;

if hour>=24 then

hour:=0;

Label1. Caption:=IntToStr (hour) +': '+IntToStr (minute) +': '+IntToStr (sec);

SvetoforTime:=SvetoforTime+10;

if Svetofor then

begin

Cn:=Cn-10;

if Cn<0 then Cn:=0;

Cs:=Cs-10;

if Cs<0 then Cs:=0;

if SvetoforTime>=SvetoforGreen then

begin

Svetofor:=False;

SvetoforTime:=0;

end;

end

else begin

Ce:=Ce-10;

if Ce<0 then Ce:=0;

Cw:=Cw-10;

if Cw<0 then Cw:=0;

if SvetoforTime>=SvetoforRed then

begin

Svetofor:=True;

SvetoforTime:=0;

end;

end;

Cn:=Cn+CarsN [hour];

Cs:=Cs+CarsS [hour];

Ce:=Ce+CarsE [hour];

Cw:=Cw+CarsW [hour];

Label2. Caption:=IntToStr (Cn);

Label3. Caption:=IntToStr (Cs);

Label4. Caption:=IntToStr (Cw);

Label5. Caption:=IntToStr (Ce);

N:=Cn div 10+1;

S:=Cs div 10+1;

E:=Ce div 10+1;

W:=Cw div 10+1;

Draw;

end;

end.

unit PTrafic;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, Grids;

type

TTrafic = class (TForm)

StringGrid1: TStringGrid;

procedure FormClose (Sender: TObject; var Action: TCloseAction);

private

{ Private declarations }

public

{ Public declarations }

Procedure Init;

end;

var

Trafic: TTrafic;

implementation

uses POne;

{$R *.dfm}

procedure TTrafic. FormClose (Sender: TObject; var Action: TCloseAction);

var

i: integer;

begin

for I:= 0 to 23 do

Begin

One. CarsN [i]:=StrToInt (StringGrid1.Cells[1, i+1]);

One. CarsS [i]:=StrToInt (StringGrid1.Cells[2, i+1]);

One. CarsW [i]:=StrToInt (StringGrid1.Cells[3, i+1]);

One. CarsE [i]:=StrToInt (StringGrid1.Cells[4, i+1]);

End;

end;

Procedure TTrafic. Init;

var

i: integer;

begin

StringGrid1.Cells[0,0]:=' t \ N ';

StringGrid1.Cells[1,0]:='Север';

StringGrid1.Cells[2,0]:='Юг';

StringGrid1.Cells[3,0]:='Запад';

StringGrid1. Cells[4,0]:='Восток';

StringGrid1.RowCount:=25;

for I:= 0 to 23 do

Begin

StringGrid1. Cells [0, i+1]:=inttoStr (i);

StringGrid1. Cells [1, i+1]:=IntToStr (One. CarsN [i]);

StringGrid1. Cells [2, i+1]:=IntToStr (One. CarsS [i]);

StringGrid1. Cells [3, i+1]:=IntToStr (One. CarsW [i]);

StringGrid1. Cells [4, i+1]:=IntToStr (One. CarsE [i]);

End;

ShowModal;

end;

end.

Просмотров работы: 20