Академический Документы
Профессиональный Документы
Культура Документы
БАКАЛАВРСКАЯ РАБОТА
Допустить к защите
Заведующий кафедрой к.т.н., доцент, А.В. Очеповский ________________
«_____»______________________20_____г.
Тольятти 2016
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное бюджетное образовательное учреждение
высшего образования
«Тольяттинский государственный университет»
Институт математики, физики и информационных технологий
Кафедра «Прикладная математика и информатика»
УТВЕРЖДАЮ
Зав.кафедрой«Прикладная
математика и информатика»
_________А.В.Очеповский
«____»___________2016 г.
ЗАДАНИЕ
на выполнение бакалаврской работы
Студент Заражевский Алексей Витальевич
1. Тема
Математическая модель управления транспортным потоком на основе
нечеткой логики
2. Срок сдачи студентом законченной бакалаврской работы
24.06.2016
3. Исходные данные к бакалаврской работе
Модель управления транспортным потоком
4. Содержание бакалаврской работы (перечень подлежащих разработке
вопросов, разделов)
Введение
Глава 1. Теоретические основы математического
моделирования
Глава 2 . Моделирование работы светофора
Глава 3. Программная реализация модели
Заключение
Список используемой литературы
5. Ориентировочный перечень графического и иллюстративного материала
Презентация
6. Дата выдачи задания « 11 » января 2016 г.
Руководитель бакалаврской
работы _______________________ Г.А. Тырыгина
УТВЕРЖДАЮ
Зав.кафедрой«Прикладная
математика и информатика»
_________А.В.Очеповский
«____»___________2016 г.
КАЛЕНДАРНЫЙ ПЛАН
выполнения бакалаврской работы
Введение......................................................................................................... 3
Глава 1 Теоретические основы математического моделирования ......... 5
1.1 Обзор математических моделей транспортных потоков ............ 5
1.2 Основные принципы моделирования загрузки ............................ 7
1.3 Модели динамики транспортного потока .................................. 10
1.4 Нечеткая логика в моделировании .............................................. 11
Глава 2 Моделирование работы светофора ............................................. 14
2.1 Математическая модель светофора ............................................. 14
2.2 Этапы работы системы управления ............................................. 16
2.3 Формулирование требований к программе ................................ 23
Глава 3 Программная реализация модели ................................................ 26
3.1 Описание программы .................................................................... 26
3.2 Программная реализация ............................................................. 28
Заключение .................................................................................................. 36
Список используемой литературы ............................................................ 38
Приложение А Листинг кода файла mainForm.cs.................................... 41
Введение
могу повлиять на время цикла. Если датчик фиксирует, что на участке дороги
нет транспорта, то светофор меняет свет, пока транспорт снова не появится.
Этот тип управления подразумевает некоторые знания о перекрестке, чтобы
настроить время цикла и место расположения транспорта [15].
Нечеткая система управления светофором является альтернативной
системой управления, которая может использоваться в более широких спектрах
моделей перекрестков [10]. Такая система использует датчики для подсчета
транспорта, а не просто фиксирует приближение транспорта. Это позволяет
системе учитывать плотность транспортного потока, что позволяет лучше
оценить изменение ситуации на дорогах. Поскольку распределение трафика
меняется, нечеткая система управления может изменять световой сигнал
соответствующим образом.
Общая структура нечеткой системы управления светофором изображена
на рисунке 2.1
Счетчик
- Очередь
- Прибытие
Нечеткая
система D Датчики
управления
Интерфейс
светофора
Начало
Определение четких
данных
Фаззификация значений
входных переменных
Обновление
данных
Принятие решения
Дефаззификация
значений
нет
Симуляция
закончена?
да
Конец
PZ S M B
PZ Z S M L
S Z S M M
Очередь
M Z Z S M
B Z Z Z S
Заключение
Приложение А
namespace Cross
{
public partial class Form1 : Form
{
int N = 0, S = 0, E = 0, W = 0;
int Cn = 0, Cs = 0, Ce = 0, Cw = 0, Cn1 = 0, Cs1 = 0, Ce1 = 0, Cw1 = 0, Cn2 = 0,
Cs2 = 0, Ce2 = 0, Cw2 = 0;
int hour = 0, minute = 0, sec = 0;
int max;
bool lights;
bool fuzz = true;
int lightTime = 10;
Random rnd = new Random();
Tuple<string, int, int, int>[] carsQue = new Tuple<string, int, int, int>[4];
Tuple<string, int, int, int>[] carsArr = new Tuple<string, int, int, int>[4];
Tuple<string, int, int, int>[] timeSet = new Tuple<string, int, int, int>[4];
double[] outVals = new double[4];
double[] d = new double[8];
double[,] rules = new double[5, 5];
string[,] fRules = {
{"Z", "S", "M", "L"},
{"Z", "S", "M", "M"},
{"Z", "Z", "S", "M"},
{"Z", "Z", "Z", "S"},
};
float[] v = new float[5];
static string connStr = @"Data Source=(local)\SQLEXPRESS;
Initial Catalog=transport;
User Id=root;
Password=root;";
SqlConnection conn = new SqlConnection(connStr);
int[] CarsN = new int[] {6, 8, 6, 3, 7, 4, 9, 6, 8, 7, 7, 7, 8, 7, 8, 4, 6, 6, 5,
6, 8, 8, 4, 2};
int[] CarsS = new int[] {7, 7, 9, 4, 4, 4, 7, 4, 4, 6, 4, 4, 5, 6, 6, 5, 6, 6, 6,
4, 3, 3, 3, 2};
int[] CarsE = new int[] {8, 5, 4, 5, 5, 7, 5, 6, 7, 7, 6, 3, 4, 4, 5, 6, 7, 5, 3,
3, 4, 4, 3, 3};
int[] CarsW = new int[] {6, 3, 6, 6, 6, 4, 6, 6, 6, 7, 4, 5, 5, 3, 3, 5, 3, 2, 2,
5, 5, 4, 3, 2};
public Form1()
{
InitializeComponent();
try
{
conn.Open();
}
42
}
catch
{
Console.WriteLine("Ошибка, при выполнении запроса на добавление записи");
return;
}
if (lights)
{
Cn1 ++;
if (Cn1 > Cn2) Cn1 = Cn2;
Cs1 ++ ;
if (Cs1 > Cs2) Cs1 = Cs2;
}
if (!lights)
{
Ce1 ++ ;
if (Ce1 > Ce2) Ce1 = Ce2;
Cw1 ++ ;
if (Cw1 > Cw2) Cw1 = Cw2;
}
getCars();
lightTime--;
if (max < Ce)
{
max = Ce;
label8.Text = max + " с востока";
}
if (max < Cw)
{
max = Cw;
label8.Text = max + " с запада";
}
if (max < Cn)
{
max = Cn;
label8.Text = max + " с севера";
}
if (max < Cs)
{
max = Cs;
label8.Text = max + " с юга";
}
if (lightTime == 0 && !lights)
{
if (fuzz)
{
fuzzy((Cw + Ce), (Cn + Cs));
agr();
accum();
lightTime = defuzz();
if (lightTime == 0)
{
lights = true;
lightTime = 5;
}
}
else
{
lights = true;
lightTime = 20;
}
}
if (lightTime == 0 && lights)
44
{
if (fuzz)
{
fuzzy((Cn + Cs), (Cw + Ce));
agr();
accum();
lightTime = defuzz();
Console.WriteLine(lightTime);
if (lightTime == 0)
{
lights = false;
lightTime = 5;
}
}
else
{
lights = false;
lightTime = 20;
}
}
System.Drawing.Pen myPen;
myPen = new System.Drawing.Pen(System.Drawing.Color.Black);
System.Drawing.Graphics formGraphics = this.CreateGraphics();
formGraphics.Clear(SystemColors.AppWorkspace);
//автомобили
N = Cn / 10;
int x, y;
if(Cn != 0) N++;
for (int i = 0; i < Cn; i++)
{
x = i % 2;
y = i / 2;
formGraphics.DrawRectangle(myPen, 195 + 20 * x, 130 - 25 * y, 10, 20);
}
S = Cs / 10;
if(Cs != 0) S++;
for (int i = 0; i < Cs; i++)
{
x = i % 2;
y = i / 2;
formGraphics.DrawRectangle(myPen, 245 + 20 * x, 250 + 25 * y, 10, 20);
}
E = Ce / 10;
if (Ce != 0) E++;
for (int i = 0; i < Ce; i++)
{
x = i / 2;
y = i % 2;
formGraphics.DrawRectangle(myPen, 290 + 25 * x, 155 + 20 * y, 20, 10);
}
W = Cw / 10;
if (Cw != 0) W++;
for (int i = 0; i < Cw; i++)
{
x = i / 2;
y = i % 2;
formGraphics.DrawRectangle(myPen, 170 - 25 * x, 230 - 20 * y, 20, 10);
}
if (minute < 10) label5.Text = hour + ":0" + minute + ":" + sec;
else label5.Text = hour + ":" + minute + ":" + sec;
label1.Text = Cn.ToString();
label2.Text = Cw.ToString();
label3.Text = Ce.ToString();
45
label4.Text = Cs.ToString();
label7.Text = lightTime.ToString();
formGraphics.DrawLine(myPen, 100, 250, 190, 250);
formGraphics.DrawLine(myPen, 290, 250, 400, 250);
formGraphics.DrawLine(myPen, 100, 150, 190, 150);
formGraphics.DrawLine(myPen, 290, 150, 400, 150);
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Start();
}
private void button2_Click(object sender, EventArgs e)
{
timer1.Stop();
}
private void button3_Click(object sender, EventArgs e)
{
timer1.Stop();
46
System.Drawing.Pen myPen;
myPen = new System.Drawing.Pen(System.Drawing.Color.Black);
System.Drawing.Graphics formGraphics = this.CreateGraphics();
formGraphics.Clear(SystemColors.AppWorkspace);
hour = 0; minute = 0; sec = 0;
lights = false;
lightTime = 20;
max = 0;
Cn = 0; Cw = 0; Cs = 0; Ce = 0;
label5.Text = "Время";
label8.Text = "Максимальная длина очереди";
label7.Text = "Зеленый";
label1.Text = "Север";
label2.Text = "Запад";
label3.Text = "Восток";
label4.Text = "Юг";
}
private void fuzzy(int arrive, int queue)
{
double s;
double p;
double set;
for (int i = 0; i <= 4; i++)
{
for (int j = 0; j <= 4; j++)
{
rules[i, j] = 0;
}
}
for (int i = 0; i < 4; i++)
{
if ((arrive > carsArr[i].Item2) && (arrive <= carsArr[i].Item3))
{
s = carsArr[i].Item3 - carsArr[i].Item2;
p = arrive - carsArr[i].Item2;
set = 1 / s * p;
if (rules[0, i + 1] < set) rules[0, i + 1] = set;
}
if ((arrive > carsArr[i].Item3) && (arrive <= carsArr[i].Item4))
{
s = carsArr[i].Item4 - carsArr[i].Item3;
p = arrive - carsArr[i].Item3;
set = 1 - (1 / s * p);
if (rules[0, i + 1] < set) rules[0, i + 1] = set;
}
if ((queue > carsQue[i].Item2) && (queue <= carsQue[i].Item3))
{
s = carsQue[i].Item3 - carsQue[i].Item2;
p = queue - carsQue[i].Item2;
set = 1 / s * p;
if (rules[i + 1, 0] < set) rules[i + 1, 0] = set;
}
if ((queue > carsQue[i].Item3) && (queue <= carsQue[i].Item4))
{
s = carsQue[i].Item4 - carsQue[i].Item3;
p = queue - carsQue[i].Item3;
set = 1 - (1 / s * p);
if (rules[i + 1, 0] < set) rules[i + 1, 0] = set;
}
}
}
private void agr()
47
{
for (int i = 1; i <= 4; i++)
{
for (int j = 1; j <= 4; j++)
{
if (rules[0, j] < rules[i, 0])
{
rules[i, j] = rules[0, j];
}
else
{
rules[i, j] = rules[i, 0];
}
}
}
}
private void accum()
{
double max;
for (int k = 0; k <= 3; k++)
{
outVals[k] = 0;
}
for(int k = 0; k <= 3; k++){
max = 0;
for (int i = 1; i <= 4; i++)
{
for (int j = 1; j <= 4; j++)
{
if (fRules[i - 1, j - 1] == timeSet[k].Item1)
{
if (max < rules[i, j])
{
max = rules[i, j];
}
}
}
}
outVals[k] = max;
}
}
private int defuzz()
{
double d1 = 0;
double d2 = 0;
double h;
double s;
double p;
for (int k = 0; k < timeSet[3].Item4; k++)
{
d[k] = 0;
for (int i = 0; i <= 3; i++)
{
h = 0;
if ((k > timeSet[i].Item2) && (k <= timeSet[i].Item3))
{
s = timeSet[i].Item3 - timeSet[i].Item2;
p = k - timeSet[i].Item2;
h = 1 / s * p;
if (outVals[i]!=0)
{
if (outVals[i] > h) d[k] = h;
else d[k] = outVals[i];
48
}
}
else
if ((k > timeSet[i].Item3) && (k <= timeSet[i].Item4))
{
s = (timeSet[i].Item4 - timeSet[i].Item3);
p = (k - timeSet[i].Item3);
h = 1 - (1 / s * p);
if (outVals[i] != 0)
{
if (outVals[i] > h) d[k] = h;
else d[k] = outVals[i];
}
}
}
}
for (int k = 0; k < timeSet[3].Item4; k++)
{
d1 += d[k]*k;
d2 += d[k];
}
if (d2 == 0) return 0;
double z = Math.Truncate(d1 / d2);
return Convert.ToInt32(z);
}
private void getCars()
{
SqlConnection conn = new SqlConnection(connStr);
try
{
conn.Open();
}
catch (SqlException se)
{
Console.WriteLine("Ошибка подключения:{0}", se.Message);
return;
}
SqlCommand cmd = new SqlCommand("SELECT * FROM detectors", conn);
using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
while (dr.Read())
{
Cn = dr.GetInt32(1) - dr.GetInt32(0);
Cs = dr.GetInt32(3) - dr.GetInt32(2);
Ce = dr.GetInt32(5) - dr.GetInt32(4);
Cw = dr.GetInt32(7) - dr.GetInt32(6);
}
}
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
fuzz = true;
}
else
{
fuzz = false;
}
}
private void button4_Click(object sender, EventArgs e)
{
switch (timer1.Interval)
49
{
case 500:
{
label10.Text = "Скорость x1";
timer1.Interval = 1000;
break;
}
case 100:
{
label10.Text = "Скорость x2";
timer1.Interval = 500;
break;
}
case 10:
{
label10.Text = "Скорость x3";
timer1.Interval = 100;
break;
}
}
}
private void button5_Click(object sender, EventArgs e)
{
switch(timer1.Interval)
{
case 1000:
{
label10.Text = "Скорость x2";
timer1.Interval = 500;
break;
}
case 500:
{
label10.Text = "Скорость x3";
timer1.Interval = 100;
break;
}
case 100:
{
label10.Text = "Скорость x4";
timer1.Interval = 10;
break;
}
}
}
}
}