Исследование возможностей светофора с нечеткой логикой




Описание необходимых функций принадлежности

 

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

1. Время T зеленого света нечеткого светофора для улицы Север-Юг (СЮ). Для улицы Запад-Восток (ЗВ) этот параметр равен соответственно «60 – T»).

2. Число машин на улице СЮ по окончанию очередного цикла.

3. Число машин на улице ЗВ по окончанию цикла.

 

Переменная «время Т зеленого света для улицы СЮ» задана трапецеидальными функциями принадлежности:

Графики функций изображены на рис. 2.1.

Рис. 2.1 Функции принадлежности первой входной переменной.

Две другие переменные так же заданы трапецеидальными функциями, графики которых изображены на рис. 2.2.

Рис. 2.2 Функции принадлежности второй и третьей входной переменной.

 

Выходным значением в нашей программе является величина изменения времени ΔТ зеленого света для улицы СЮ. Функции принадлежности данной величины имеют форму Гаусса.

Графики функций изображены на рис. 2.3.

Рис. 2.3 Функции принадлежности выходной переменной.

 

Описание правил вывода

 

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

[1 1 1 1 1 1;

1 1 2 1 1 1;

1 1 3 1 1 1;

1 1 4 2 1 1;

1 1 5 2 1 1;

1 2 1 1 1 1;

1 2 2 1 1 1;

1 2 3 1 1 1;

1 2 4 2 1 1;

1 2 5 2 1 1;

1 3 1 1 1 1;

1 3 2 1 1 1;

1 3 3 1 1 1;

1 3 4 1 1 1;

1 3 5 2 1 1;

1 4 1 1 1 1;

1 4 2 1 1 1;

1 4 3 1 1 1;

1 4 4 1 1 1;

1 4 5 1 1 1;

1 5 1 1 1 1;

1 5 2 1 1 1;

1 5 3 1 1 1;

1 5 4 1 1 1;

1 5 5 1 1 1;

2 1 1 2 1 1;

2 1 2 2 1 1;

2 1 3 3 1 1;

2 1 4 3 1 1;

2 1 5 3 1 1;

2 2 1 1 1 1;

2 2 2 2 1 1;

2 2 3 3 1 1;

2 2 4 3 1 1;

2 2 5 3 1 1;

2 3 1 1 1 1;

2 3 2 1 1 1;

2 3 3 2 1 1;

2 3 4 3 1 1;

2 3 5 3 1 1;

2 4 1 1 1 1;

2 4 2 1 1 1;

2 4 3 1 1 1;

2 4 4 2 1 1;

2 4 5 3 1 1;

2 5 1 1 1 1;

2 5 2 1 1 1;

2 5 3 1 1 1;

2 5 4 1 1 1;

2 5 5 2 1 1;

3 1 1 3 1 1;

3 1 2 3 1 1;

3 1 3 3 1 1;

3 1 4 3 1 1;

3 1 5 3 1 1;

3 2 1 3 1 1;

3 2 2 3 1 1;

3 2 3 3 1 1;

3 2 4 3 1 1;

3 2 5 3 1 1;

3 3 1 2 1 1;

3 3 2 3 1 1;

3 3 3 3 1 1;

3 3 4 3 1 1;

3 3 5 3 1 1;

3 4 1 2 1 1;

3 4 2 2 1 1;

3 4 3 2 1 1;

3 4 4 3 1 1;

3 4 5 3 1 1;

3 5 1 2 1 1;

3 5 2 2 1 1;

3 5 3 2 1 1;

3 5 4 3 1 1;

3 5 5 3 1 1;]

 

В приведенной таблице значения первого столбца соответствуют термам первой входной переменной – времени T зеленого света для улицы СЮ:

1 – малое, 2- среднее, 3 – большое.

 

Второй столбец соответствует значению числа машин на улице СЮ:

1 – очень малое, 2 – малое, 3 – среднее, 4 – большое, 5 – очень большое.

 

Третий столбец соответствует значению числа машин на улице ЗВ:

1 – очень малое, 2 – малое, 3 – среднее, 4 – большое, 5 – очень большое.

 

В четвертом столбце определено соответствующее выходное значение:

1 – увеличить, 2 – не изменять, 3 – уменьшить.

 

Предпоследний столбец содержит весовые коэффициенты правил: везде 1.

 

В последнем столбце задано логическое отношение между входными значениями: 1 – И.

 

Пример, как это все работает: если (время зеленого света на улице СЮ=малое) И (число машин на улице СЮ=большое) И (число машин на улице ЗВ=очень малое), то (время зеленого света на улице СЮ=увеличить).

 

Реализация системы

 

Полный исходный код программы:

% создаем новую систему нечеткой логики

potok = newfis('traffic_light');

 

% входные параметры

potok = addvar(potok, 'input', 'Tgns', [10 50]);

potok= addmf(potok, 'input', 1, 'Little', 'trapmf', [0 0 20 25]);

potok= addmf(potok, 'input', 1, 'Average', 'trapmf', [20 25 35 40]);

potok= addmf(potok, 'input', 1, 'Big', 'trapmf', [35 40 50 50]);

potok= addvar(potok,'input', 'Stop on NS', [0 90]);

potok= addmf(potok, 'input', 2, 'Very little', 'trapmf', [0 0 12 18]);

potok= addmf(potok, 'input', 2, 'Little', 'trapmf', [16 21 31 36]);

potok= addmf(potok, 'input', 2, 'Average', 'trapmf', [34 40 50 56]);

potok= addmf(potok, 'input', 2, 'Big', 'trapmf', [54 59 69 76]);

potok= addmf(potok, 'input', 2, 'Very big', 'trapmf', [72 78 90 90]);

potok= addvar(potok, 'input', 'Stop on WE', [0 90]);

potok= addmf(potok, 'input', 3, 'Very little', 'trapmf', [0 0 12 18]);

potok= addmf(potok, 'input', 3, 'Little', 'trapmf', [16 21 31 36]);

potok= addmf(potok, 'input', 3, 'Average', 'trapmf', [34 40 50 56]);

potok= addmf(potok, 'input', 3, 'Big', 'trapmf', [54 59 69 76]);

potok= addmf(potok, 'input', 3, 'Very big', 'trapmf', [72 78 90 90]);

 

%выходной параметр

potok= addvar(potok, 'output', 'delta Тg NS', [-20 20]);

potok= addmf(potok, 'output', 1, 'Increase', 'gaussmf', [6 20]);

potok= addmf(potok, 'output', 1, 'Not change', 'gaussmf', [4.5 0]);

potok= addmf(potok, 'output', 1, 'Decrease', 'gaussmf', [6 -20]);

 

%таблица правил

potok= addrule(potok,[

1 1 1 1 1 1;

1 1 2 1 1 1;

1 1 3 1 1 1;

1 1 4 2 1 1;

1 1 5 2 1 1;

1 2 1 1 1 1;

1 2 2 1 1 1;

1 2 3 1 1 1;

1 2 4 2 1 1;

1 2 5 2 1 1;

1 3 1 1 1 1;

1 3 2 1 1 1;

1 3 3 1 1 1;

1 3 4 1 1 1;

1 3 5 2 1 1;

1 4 1 1 1 1;

1 4 2 1 1 1;

1 4 3 1 1 1;

1 4 4 1 1 1;

1 4 5 1 1 1;

1 5 1 1 1 1;

1 5 2 1 1 1;

1 5 3 1 1 1;

1 5 4 1 1 1;

1 5 5 1 1 1;

2 1 1 2 1 1;

2 1 2 2 1 1;

2 1 3 3 1 1;

2 1 4 3 1 1;

2 1 5 3 1 1;

2 2 1 1 1 1;

2 2 2 2 1 1;

2 2 3 3 1 1;

2 2 4 3 1 1;

2 2 5 3 1 1;

2 3 1 1 1 1;

2 3 2 1 1 1;

2 3 3 2 1 1;

2 3 4 3 1 1;

2 3 5 3 1 1;

2 4 1 1 1 1;

2 4 2 1 1 1;

2 4 3 1 1 1;

2 4 4 2 1 1;

2 4 5 3 1 1;

2 5 1 1 1 1;

2 5 2 1 1 1;

2 5 3 1 1 1;

2 5 4 1 1 1;

2 5 5 2 1 1;

3 1 1 3 1 1;

3 1 2 3 1 1;

3 1 3 3 1 1;

3 1 4 3 1 1;

3 1 5 3 1 1;

3 2 1 3 1 1;

3 2 2 3 1 1;

3 2 3 3 1 1;

3 2 4 3 1 1;

3 2 5 3 1 1;

3 3 1 2 1 1;

3 3 2 3 1 1;

3 3 3 3 1 1;

3 3 4 3 1 1;

3 3 5 3 1 1;

3 4 1 2 1 1;

3 4 2 2 1 1;

3 4 3 2 1 1;

3 4 4 3 1 1;

3 4 5 3 1 1;

3 5 1 2 1 1;

3 5 2 2 1 1;

3 5 3 2 1 1;

3 5 4 3 1 1;

3 5 5 3 1 1;

]);

 

% графики функций принадлежности

plotmf(potok, 'input', 1);

plotmf(potok, 'input', 2);

plotmf(potok, 'input', 3);

plotmf(potok, 'output', 1)

 

%Количествоциклов

COUNT = 100;

 

% Длительность цикла (с)

T = 60;

 

% Длительность горения зеленого света для СЮ (с) (по умолчанию)

Tg_ns_nechetkii = 30;

Tg_ns_chetkii = 30;

 

% Длительность горения зеленого света для ЗВ (с) (по умолчанию)

Tg_we_nechetkii = T - Tg_ns_nechetkii;

Tg_we_chetkii = T - Tg_ns_chetkii;

 

% В среднем каждую секунду, машины завершают проезд перекрестка

t = 1;

 

% Эффективность - Average число не обслуженных заявок

% за заданное количество циклов светофора

 

effect_chetkii = 0;

effect_nechetkii = 0;

 

%ЦИКЛ

i = 1;

stop_on_ns_chetkii = 0;

stop_on_we_chetkii = 0;

ne_obsluj_chetkii = 0;

stop_on_ns_nechetkii = 0;

stop_on_we_nechetkii = 0;

ne_obsluj_nechetkii = 0;

 

while i<=COUNT

 

% ЗЕЛЕНЫЙ ДЛЯ СЮ

cars_count_ns = randi([0, 90]); % генерируем случайное число машин

ok_count = int32(Tg_ns_nechetkii/t); % число машин, успевших проехать перекресток

stop_on_ns_nechetkii = double(cars_count_ns - ok_count); % НЕОБСЛУЖЕННЫЕ ЗАЯВКИ

if stop_on_ns_nechetkii< 0

stop_on_ns_nechetkii = 0;

end;

 

% ЗЕЛЕНЫЙ ДЛЯ ЗВ

cars_count_we = randi([0, 90]); % генерируем случайное число машин

ok_count = int32(Tg_we_nechetkii/t); % число машин, успевших проехать перекресток

stop_on_we_nechetkii = double(cars_count_we - ok_count); % НЕОБСЛУЖЕННЫЕ ЗАЯВКИ

if stop_on_we_nechetkii< 0

stop_on_we_nechetkii = 0;

end;

 

% Суммируем общее количество не обслуженных заявок

ne_obsluj_nechetkii = ne_obsluj_nechetkii + stop_on_ns_nechetkii + stop_on_we_nechetkii;

 

%выполнение нечеткого вывода

deltaT = evalfis([Tg_ns_nechetkii stop_on_ns_nechetkii stop_on_we_nechetkii], potok, 1000);

 

%округляем

deltaT = round(deltaT);

 

% deltaT поступает на светофор

Tg_ns_nechetkii = double(Tg_ns_nechetkii + deltaT);

Tg_we_nechetkii = T - Tg_ns_nechetkii;

 

i = i + 1;

%%

end;

 

%Вычисляем эффективность

effect_nechetkii = round(ne_obsluj_nechetkii/100)

 

i = 1;

while i<=COUNT

 

%ЗЕЛЕНЫЙ ДЛЯ СЮ

cars_count_ns = randi([0, 90]); % генерируем случайное число машин

ok_count = int32(Tg_ns_chetkii/t); % число машин, успевших проехать перекресток

stop_on_ns_chetkii = double(cars_count_ns - ok_count); % НЕОБСЛУЖЕННЫЕ ЗАЯВКИ

if stop_on_ns_chetkii< 0

stop_on_ns_chetkii = 0;

end;

 

% ЗЕЛЕНЫЙ ДЛЯ ЗВ

cars_count_we = randi([0, 90]); % генерируем случайное число машин

ok_count = int32(Tg_we_chetkii/t); % число машин, успевших проехать перекресток

stop_on_we_chetkii = double(cars_count_we - ok_count); % НЕОБСЛУЖЕННЫЕ ЗАЯВКИ

if stop_on_we_chetkii< 0

stop_on_we_chetkii = 0;

end;

 

% Суммируем общее количество не обслуженных заявок

ne_obsluj_chetkii = ne_obsluj_chetkii + stop_on_ns_chetkii + stop_on_we_chetkii;

 

i = i + 1;

%%

end;

 

%Вычисляем эффективность

effect_chetkii = round(ne_obsluj_chetkii/100)

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-21 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: