You are on page 1of 38

Rzeszw 2012-01-16

POLITECHNIKA RZESZOWSKA im. Ignacego ukasiewicza

Projekt:

Sterowanie ruchem pojazdw z zastosowaniem logiki rozmytej.

Jakub Klimasz 4EF-DI

1. Cel projektu ........................................................................................................................4 2. Wykorzystane narzdzia i biblioteki ...................................................................................4 3. Rzeczywisty model ruchu ulicznego uyty w projekcie .......................................................4 4. Definicja modelu w SUMO ................................................................................................6 4.1. Definicja wzw .........................................................................................................6 4.2. Definicja drg ..............................................................................................................7 4.3. Definicja pocze pomidzy pasami ...........................................................................7 4.4. Definicja detektorw dla pasw ruchu..........................................................................8 4.5. Odwzorowanie rzeczywistych map w SUMO ..............................................................8 5. Generowanie tras dla samochodw ................................................................................... 10 6. Przygotowanie pozostaych plikw ................................................................................... 12 6.1. Przygotowanie pliku konfiguracyjnego dla SUMO GUI ............................................. 12 6.2. Konfiguracja moliwoci przecze wiate na skrzyowaniu ................................... 13 7. Logika rozmyta................................................................................................................. 14 7.1. Zaoenia oglnie dotyczce logiki rozmytej .............................................................. 14 7.2. Opis ukadw wnioskowania, zbiorw rozmytych oraz regu ..................................... 14 7.2.1. Dla kombinacji aktualnie aktywnej ......................................................................... 14 7.2.2. Dla kombinacji aktualnie nieaktywnej ..................................................................... 16 7.3. Implementacja logiki rozmytej w jzyku FCL ............................................................ 19 8. Program Fuzzy Traffic Light Controller ............................................................................24 8.1. Moliwoci Fuzzy Traffic Light Controller ................................................................ 24 8.2. Opis klas Fuzzy Traffic Light Controller ....................................................................24 8.3. Implementacja obsugi sygnalizacji wietlnej na skrzyowaniach. .............................. 25 8.3.1. Pobieranie listy skrzyowa, odpowiadajcych im pocze drg, detektorw oraz dugoci drg na ktrych umiejscowione s detektory. .....................................25 8.3.2. Wybr trybu sterowania sygnalizacj wietln. .......................................................26 8.3.3. Wyznaczanie optymalnej kombinacji przeczenia sygnalizacji wietlnej za pomoc logiki rozmytej. .................................................................................... 28 8.4. Opis GUI Fuzzy Traffic Light Controller ................................................................... 31

1. Cel projektu
Celem projektu jest zrealizowanie sterowania sygnalizacj wietln za pomoc logiki rozmytej. Docelowo zostaa stworzona aplikacja umoliwiajca dostosowanie zasad logiki rozmytej, zbiorw rozmytych, tworzenie dowolnej infrastruktury drogowej, skrzyowa oraz ustawianie sterowania dla kadego z skrzyowa za pomoc wnioskowania rozmytego.

2. Wykorzystane narzdzia i biblioteki


-SUMO "Simulation of Urban MObility" - program o otwartym rdle umoliwiajcy tworzenie oraz symulowanie mikroskopowego modelu ruchu ulicznego. Program SUMO jest dostarczany z zestawem narzdzi umoliwiajcych tworzenie map, tras dla samochodw, modelowania ruchu. W celu zapewniania zamierzonej funkcjonalnoci konieczne byy pewne zmiany w interfejsie TraCI umoliwiajcym komunikacje z symulatorem za pomoc Socketw. Wicej informacji dotyczcych pakietu SUMO moe zosta odnalezione na stronie http://sumo.sourceforge.net. - TraCI4J - eksperymentalny klient protokou TraCI dla jzyka JAVA. Jako, e gwna cz programu realizowana jest w jzyku Java konieczna bya adaptacja biblioteki autorstwa Enrico Gueli dystrybuowanej na licencji GPLv3. Wicej informacji dotyczcych biblioteki TraCI4J moe zosta odnalezione na stronie http://sourceforge.net/projects/traci4j/. - SUMO Traffic Modeler - program sucy do modelowania ruchu - aplikacja autorstwa Leontios Papaleontiou dystrybuowanej na licencji GPLv3 umoliwiajca modelowanie ruchu poprzez rzeczn definicj iloci samochodw przemieszczajcych si miedzy punktami oraz czasu w jakim przemieszczanie to nastpuje. Ze wzgldu na niepoprawne funkcjonowanie programu byy konieczne pewne jego modyfikacje. Wicej informacji dotyczcych programu SUMO Traffic Modeler moe zosta odnalezione na stronie http://trafficmodeler.sourceforge.net/ - jFuzzyLogic - biblioteka jzyka Java autorstwa Pablo Cingolani implementujca jzyk FCL (Fuzzy Control Langage) sucy do implementacji logiki rozmytej, w szczeglnoci sterownikw rozmytych, ktry to jest rozwijanym przez International Electrotechnical Commission (IEC). Wicej informacji dotyczcych biblioteki jFuzzyLogic moe zosta odnalezione na stronie http://jfuzzylogic.sourceforge.net/html/index.html.

3. Rzeczywisty model ruchu ulicznego uyty w projekcie


W celu przetestowania skutecznoci rozmytego systemu sterowania sygnalizacj wietln zbudowano, mikroskopowy model ruchu skad ktrego wchodz 4 rzeczywiste skrzyowania zlokalizowane w Rzeszowie: -skrzyowanie ul. Powstacw Warszawy i ul. Hetmask przedstawione na rys. 1 -skrzyowanie ul. Powstacw Warszawy, ul. Dbrowskiego, ul. Podkarpackiej oraz ul. Batalionw Chopskich rys. 2 -skrzyowanie ul. Dbrowskiego i ul. W. Pola rys. 3 -skrzyowanie ul. Hetmaskiej i ul. W. Pola rys.4 Pominito wszystkie dodatkowe drogi nie czce wyej wymienionych skrzyowa. Odwzorowano natomiast drogi cze wyej wymienione skrzyowania wraz z zmian liczby pasw. Odlegoci skrzyowa przedstawione w projekcie mog nieznacznie odbiega od

odlegoci rzeczywistych, nie zostay rwnie zachowane ksztaty drg. Najwaniejszym z punktu widzenia projektu jest odwzorowanie struktury skrzyowa oraz moliwoci przejazdw pomidzy poszczeglnymi drogami na skrzyowaniach.

Rys. 1. Skrzyowanie ul. Hetmaskiej i ul. Powstacw Warszawy


[rdo: http://mapy.zumi.pl]

Rys. 2. Skrzyowanie ul. Dbrowskiego, ul. Podkarpackiej, ul. Powstacw Warszawy oraz ul. Batalionw Chopskich
[rdo: http://mapy.zumi.pl]

Rys. 3. Skrzyowanie ul. Dbrowskiego i ul. W. Pola


[rdo: http://mapy.zumi.pl]

Rys. 4. Skrzyowanie ul. Hetmaskiej i ul. W. Pola


[rdo: http://mapy.zumi.pl]

4. Definicja modelu w SUMO


SUMO oferuje moliwo definicji sieci drg za pomoc kilku sposobw: -rcznej definicji w plikach XML1 -importu z OpenSreetMap2 -importu z map programu VISUM3 -importu z map programu Vissim4 -importu z map openDRIVE5 -importu z map Programu MATsim6 -importu z ksztatw z ArcView7 -importu z map z bazy danych GDF8 -generowania map abstrakcyjnych9 W celu wiernego odwzorowania struktury drg konieczna bya rczna definicja kadego z elementw modelu 4 skrzyowa opisanych w punkcie 3. 4.1. Definicja wzw Wzem w SUMO nazywany jest kady punkt na mapie, w ktrym nastpuje cznie drg. Wzem s skrzyowania, zwenia oraz podziay drg. Podstawowa definicja dla wza reprezentujcego skrzyowanie z sygnalizacj wietln zostaa przedstawiona na listingu 1.

http://sumo.sourceforge.net/doc/current/docs/userdoc/Networks/Building_Networks_from_own_XMLdescriptions.html 2 http://sumo.sourceforge.net/doc/current/docs/userdoc/Networks/Import/OpenStreetMap.html 3 http://sumo.sourceforge.net/doc/current/docs/userdoc/Networks/Import/VISUM.html 4 http://sumo.sourceforge.net/doc/current/docs/userdoc/Networks/Import/Vissim.html 5 http://sumo.sourceforge.net/doc/current/docs/userdoc/Networks/Import/openDRIVE.html 6 http://sumo.sourceforge.net/doc/current/docs/userdoc/Networks/Import/MATsim.html 7 http://sumo.sourceforge.net/doc/current/docs/userdoc/Networks/Import/ArcView.html 8 http://sumo.sourceforge.net/doc/current/docs/userdoc/Networks/Import/DlrNavteq.html 9 http://sumo.sourceforge.net/doc/current/docs/userdoc/Networks/Abstract_Network_Generation.html

Listing 1. Wze reprezentujcy skrzyowanie z sygnalizacj wietln <node id="0" x="760.00" y="210.00" type="traffic_light" tl="0"/>

Definicja wza dla punktw w ktrych wystpuje cznie lub dzielenie pasw zosta przedstawiona w listingu 2.
Listing 2. Wze reprezentujcy zcznie lub podzia drg <node id="m3" x="760.00" y="60.00" type="right_before_left"/>

Wszystkie wzy skonfigurowane w celu odzwierciedlenia fizycznego modelu zostay zawarte w pliku rzeszow.nod.xml. Plik ten zawiera 34 wzy w tym 4 wzy dla skrzyowa kontrolowanych za pomoc sygnalizacji wietlnej. Szczegowe informacje dotyczce definicji wzw zawarte s w dokumentacji pakietu oprogramowania SUMO.

4.2. Definicja drg Drogi s obiektami czcymi wzy, przy definicji kadej z drg naley poda wze pocztkowy oraz wze kocowy, kolejno podawania wzw definiuje kierunek ruchu. W ramach kadej z drg definiowana jest liczba pasw ruchu. W miejscach wystpowania wzw drogi zostan poczone automatycznie z wykorzystaniem heurystyk, o ile nie zostay zdefiniowane wasne poczenia. Przykadowa definicja 3 pasowej drogi z wza 1 do wza zPowstDojazdDoPod zostaa przedstawiona na listingu 3.
Listing 3. Definicja 3 pasowej drogi z wza 1 do wza zPowstDojazdDoPod <edge id="PowPH_3to2pasowa" from="1" to="zPowstDojazdDoPod" priority="2" numLanes="3" speed="11.11"/>

Wszystkie drogi skonfigurowane w celu odzwierciedlenia fizycznego modelu zostay zawarte w pliku rzeszow.edg.xml. Plik ten zawiera 59 drg pomidzy wzami. Szczegowe informacje dotyczce definicji drg zawarte s w dokumentacji pakietu oprogramowania SUMO. 4.3. Definicja pocze pomidzy pasami W celu poprawnej reprezentacji pocze pomidzy poszczeglnymi pasami ruchu konieczne jest zdefiniowanie pocze w formacie XML. W przypadku niezdefiniowania pocze, zostan one wyznaczone przez NETCONVERT wchodzcy w skad pakietu SUMO. Odwzorowania dokonane przez NETCONVERT bazuj jednak na heurystykach i zazwyczaj nie odzwierciedlaj fizycznych pocze pomidzy pasami ruchu. W celu definicji poczenia naley zdefiniowa drog z ktrej bdzie odbywa si ruch, drog docelow, oraz pas ruchu ma obu drogach. Pasy ruchu numerowane s od prawej do lewej strony, przy czym drog naley analizowa zgodnie z kierunkiem w ktrym biegnie. Listing 4 przedstawia poczenie wyjazdu prawym pasem z ulicy Dbrowskiego na ulic Batalionw Chopskich zgodnie z rys. 2.
Listing 4. Definicja 3 pasowej drogi z wza 1 do wza zPowstDojazdDoPod <connection from="Dbr1ToDbrJPod_3pasowa" to="naPrzemyslowa3pasy" fromLane="0" toLane="0"/>

Wszystkie poczenia zostay skonfigurowane w celu odzwierciedlenia fizycznego modelu zostay zawarte w pliku rzeszow.con.xml. Plik ten zawiera 155 pocze pomidzy pasami. Zarwno na skrzyowaniach jak rwnie w przypadku zwania lub poszerzania drg.

Szczegowe informacje dotyczce definicji pocze zawarte s w dokumentacji pakietu oprogramowania SUMO. 4.4. Definicja detektorw dla pasw ruchu W celu poprawnego zliczania dugoci kolejki na danym pasie ruchu konieczne jest zastosowanie detektorw dla poszczeglnych pasw ruchu. Do tego celu zostay uyte zmodyfikowane detektory E2. Zmian dokonano na poziomie kodu rdowego aplikacji SUMO - zmiany te nie zostan opisane w poniszym punkcie. Liczba samochodw w kolejce oraz dugo detektora bdzie wykorzystywana podczas obliczania zajtoci pasa ruchu, parametr ten bdzie stosowany przy wnioskowaniu rozmytym. Dugo detektora musi by o 0.1 m krtsza od dugoci pasa ruchu na ktrym zosta umiejscowiony. Listing 5 przedstawia przykadowy detektor przypisany do drogi PowZH_3pasowa, pas ruchu oznaczany jest jako _2 co oznaczana ostatni pas po lewej stronie drogi. W celu zapewnienia poprawnoci symulacji dane z detektora powinny by odwieane co jedn sekund.
Listing 4. Definicja 3 pasowej drogi z wza 1 do wza zPowstDojazdDoPod <laneAreaDetector id="E3PowZH_3pasowa_2" lane="PowZH_3pasowa_2" pos="0.0" length="160.45" freq="1" file="out.xml" cont="false"/>

4.5. Odwzorowanie rzeczywistych map w SUMO W celu stworzenia sieci zrozumiaej dla symulatora SUMO wykorzystano program NETCONVERT. Plikami niezbdnymi przy konwersji s pliki: wzw, drg, oraz pocze. Przykadowe wywoanie programu zostao przedstawione na listingu 5.
Listing 5. Przykadowe uruchomienie programu NETCONVERT C:\Users\DLSV3550>D:\SUMO\sumo-0.13.1\bin\netconvert --node-files="rzeszow.nod.xml" --edge-files="rzeszow.edg.xml" --connection-files="rzeszow.con.xml" --output-file="rzeszow.net.xml" --plain-output "new folder\rzeszow"

Uycie parametru plain-output umoliwia pniejsze wygenerowanie tras dla pojazdw w symulacji. Szczegowy opis programu NETCONVERT znajduje si w dokumentacji SUMO. Rys. 5 reprezentuje stworzon sie drg, natomiast rys. od 6-9 skrzyowania z zaznaczonymi poczeniami midzy pasami ruchu.

Rys. 5. Zesp skrzyowa zamodelowany w SUMO

Rys. 6. Skrzyowanie ul. Dbrowskiego, ul. Podkarpackiej, ul. Powstacw Warszawy oraz ul. Batalionw Chopskich zamodelowane w SUMO

Rys. 7. Skrzyowanie ul. Hetmaskiej i ul. Powstacw Warszawy zamodelowane w SUMO

Rys. 8. Skrzyowanie ul. Hetmaskiej i ul. W. Pola zamodelowane w SUMO

Rys. 9. Skrzyowanie ul. Dbrowskiego i ul. W. Pola zamodelowane w SUMO

5. Generowanie tras dla samochodw


SUMO oferuje kilka moliwoci generowania ruchu w symulacji. Do podstawowych moliwoci generowania ruchu w symulacji zalicza si: - wyznaczanie tras na podstawie macierzy pochodzenie/docelowa pozycja -losowe wyznaczanie tras -wyznaczanie tras na podstawie algorytmu Dijkstry (najkrtszych) -wyznaczanie tras na podstawie prawdopodobiestwa skrtw na kadym skrzyowaniu -wyznaczanie tras na podstawie definicji natenia ruchu -wyznaczanie tras na podstawie opisu populacji zamieszkujcej dany region Do wyznaczania tras moe zosta uyte dowolne oprogramowanie wchodzce w skad pakietu oprogramowania SUMO, jak rwnie zewntrzne aplikacje takie jak eWorld czy te SUMO Traffic Modeler. Rozsdnym rozwizaniem (dziaajcym rozwizaniem przy braku informacji statystycznych) okazao si zastosowanie zmodyfikowanego programu SUMO

Traffic Modeler. W dostarczonej w projektem wersji programu zosta przebudowany sposb zapisu ustawie oraz umoliwiono generowanie plikw definicji podry, ktre w kolejnym korku bd uyte przez program duarouter jako pliki wejciowe. Na rys. 10 zostay naniesione punkty 1 - 7 okrelajce moliwe punkty pocztkowe oraz kocowe tras wykorzystano relacje kady z kadym. Tabela 1 obrazuje liczb samochodw podrujcych pomidzy danymi punktami w okrelonym czasie.

Rys. 10. Widok symulowanego rodowiska w programie SUMO Traffic Modeler Tabela 1. Liczba samochodw podrujcych pomidzy punktami sieci drg
Punkt pocztkowy 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 5 5 5 5 5 Punkt kocowy 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 Czas symulacji 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 Ilo samochodw 0 100 100 100 100 100 300 100 100 0 100 800 400 0 2000 100 50 100 0 150 50 100 200 50 300 300 400 0 300 200 400 100 100 200 100 100 0

5 5 5 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 SUMA:

6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8

00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00 00:00 - 06:00

100 1200 50 100 100 100 400 100 0 600 100 200 600 200 400 300 200 0 100 300 400 300 100 200 200 300 0 14250

Sumaryczna liczba samochodw w symulacji to 14250. Aby uproci symulacj zrezygnowano z definicji wielu typw samochodw oraz ronego poziomu niedoskonaoci kierowcw. Wszystkie z pojazdw w symulacji zdefiniowane s zgodni z listingiem 6. Szczegowe informacje dotyczce definicji typw pojazdw zamieszczone s w dokumentacji SUMO.
Listing 6. Definicja typu samochodu uywanego podczas symulacji. <vType id="Default" length="4.25" minGap="0.75" maxSpeed="70.00"> <carFollowing-Krauss accel="2.60" decel="4.50" sigma="0.50" /> </vType>

Plikiem wynikowym z programu SUMO Traffic Modeler jest plik generated-trips.xml. W celu wygenerowania klas wykorzystano program duarouter generujcy plik traffic.rou.xml. Przykadowe uruchomienie programu zostao zamieszczone w listingu 7.
Listing 7. Wykorzystanie duarouter C:\Users\DLSV3550>D:\SUMO\sumo-0.13.1\bin\duarouter --trip-files "traffic.generated-trips.xml" --net-file "rzeszow.net.xml" --output-file "traffic.rou.xml"

6. Przygotowanie pozostaych plikw


6.1. Przygotowanie pliku konfiguracyjnego dla SUMO GUI SUMO GUI umoliwia wizualizacj symulacji ruchu przeprowadzan w SUMO. W celu uruchomienia symulacji konieczne jest zdefiniowanie pliku konfiguracji dla symulacji. Podczas tworzenia pliku konfiguracji naley uwzgldni: -plik sieci pocze drg -plik tras samochodw -plik detektorw -definicje portu dla TraCI

Listing 8. Konfiguracja dla SUMO GUI <configuration> <input-files> <net-file>rzeszow.net.xml</net-file> <route-files>traffic.rou.xml</route-files> <additional-files>additional.add.xml</additional-files> </input-files> <simulation> <begin>0</begin> <end>21720</end> </simulation> <traci_server> <remote-port value="50003"/> </traci_server> </configuration>

Dokadny opis pliku konfiguracyjnego dla SUMO GUI zosta opisany w dokumentacji pakietu oprogramowania SUMO. 6.2. Konfiguracja moliwoci przecze wiate na skrzyowaniu W celu umoliwienia sterownia wiatami ulicznymi konieczne jest zdefiniowanie dodatkowego pliku definicji kombinacji przecze dla kadego z skrzyowa. Poniewa rozwizanie to wykorzystywane jest wycznie w niemniejszym projekcie, struktura pliku zostanie bliej opisana. Listing 9 obrazuje fragment pliku konfiguracyjnego dla skrzyowania ul. Dbrowskiego, ul. Podkarpackiej, ul. Powstacw Warszawy oraz ul. Batalionw Chopskich.
Listing 8. Fragment konfiguracji moliwoci przecze wiate dla skrzyowania ul. Dbrowskiego, Podkarpackiej, ul. Powstacw Warszawy oraz ul. Batalionw Chopskich <?xml version="1.0" encoding="UTF-8"?> <combinations> <combination id="0"> <l id="0" value="1"/> <l id="1" value="1"/> <l id="2" value="1"/> <l id="3" value="1"/> <l id="4" value="0"/> <l id="5" value="0"/> <l id="6" value="0"/> <l id="7" value="0"/> <l id="8" value="0"/> <l id="9" value="0"/> <l id="10" value="0"/> <l id="11" value="0"/> <l id="12" value="0"/> <l id="13" value="0"/> <l id="14" value="0"/> <l id="15" value="0"/> <l id="16" value="0"/> </combination> </combinations> ul.

Gwnym wzem pliku jest wze combinations do tego wza moe zosta dodane wiele wzw combination reprezentujcych dan kombinacje wiate. W ramach kadego wza combination powinno znajdowa si tyle wzw l ile wiate sterujcych ruchem na danym skrzyowaniu. Zazwyczaj kade z wiate steruje jedn

moliwoci przejazdu. W przypadku omawianego skrzyowania (rys. 6) liczba wiate to 17. Kolejno parsowania pliku jest zgodna z kolejnoci wystpienia wpisw tym samym przypisywana do numeracji tras skrzyowania, warto atrybutu id wza l jest w tym wypadku ignorowana. Warto atrybutu value wza okrela rodzaj ustawionego witaa 1 oznacza wiato zielone, 0 oznacza wiato czerwone. Naley pamita, e do poprawnego funkcjonowania sterowania za pomoc logiki rozmytej ilo wiate zielonych w poszczeglnych kombinacjach powinna by podobna.

7. Logika rozmyta.
7.1. Zaoenia oglnie dotyczce logiki rozmytej Zgodnie z zaoeniami projektu stworzono wnioskowanie rozmyte sterujce sygnalizacj wietln bazujc nie tylko na stanie aktualnego skrzyowania ale rwnie nastpnego skrzyowania. Podejcie to pozwala na wybr optymalnej kombinacji wiate na skrzyowaniu. Zaoenia oglne przed sformuowaniem zasad logiki rozmytej: konieczna jest analiza stanu pasa ruchu przed danym wiatem w celu okrelania stopnia zapeniania drogi dojazdowej konieczna jest analiza stanu pasa docelowego w celu okrelenia stopnia zapeniania drogi docelowej w celu zmiany naley wybra optymaln kombinacj przecze - poprzez zsumowanie wynikw wnioskowania rozmytego dla kadego pasa ruchu w ramach kombinacji. Zaoenia te powinny skutecznie rozadowa kolejki na zatoczonych skrzyowaniach. Problemem okazuje si: konieczno stworzenia ukadu wnioskowania dla kombinacji aktywnej, w ktrej wyjciem z ukadu wnioskowania rozmytego jest konieczno przeduenia biecej kombinacji; konieczno stworzenia ukadu wnioskowania dla kombinacji nieaktywnej w ktrej wyjciem z ukadu wnioskowania rozmytego jest konieczno zmiany biecej kombinacji na analizowan przez ukad kombinacj; ukad wnioskowania rozmytego dla nieaktywnej kombinacji w celu ograniczenia czasu oczekiwania dostarcza informacji na temat czasu nieaktywnoci danej kombinacji, a bardziej precyzyjnie czasu wiecenia wiata czerwonego dla danego poczenia drg. 7.2. Opis ukadw wnioskowania, zbiorw rozmytych oraz regu 7.2.1. Dla kombinacji aktualnie aktywnej W przypadku gdy koniecznie jest obliczenie potrzeby przeduenie aktualnie trwajcej kombinacji brane s pod uwag drogi dla ktrych wczone jest zielone wiato. Do zmiennych wejciowych zalicza si: poziom zapenienia drogi dojazdowej do skrzyowania - kolejka dojazdowa poziom zapeniania drogi docelowej - kolejka na drodze docelowej Jako wyjcie z ukadu wnioskowania rozmytego obliczana jest: konieczno przeduenia danej trwania wiata zielonego dla analizowanej pary drg Kolejka drogi dojazdowej do skrzyowania - KOLEJKA - reprezentowana jest przez nastpujce zbiory rozmyte: - BRAK - opisany funkcj trjktn o parametrach: (-25, 0) (0, 1) (25, 0); - KROTKA - opisany funkcj trjktn o parametrach: (0, 0) (25, 1) (50, 0); - UMIARKOWANA - opisany funkcj trjktn o parametrach - (25,0) (50, 1) (75, 0);

- DLUGA - opisany funkcj trjktn o parametrach - (50, 0) (75, 1) (100, 0); - BARDZO_DLUGA - opisany funkcj trjktn o parametrach - (75, 0) (100, 1) (125, 0); Graficzna reprezentacja zbiorw rozmytych zostaa przedstawiona na rys. 10.

Rys. 10. Graficzna reprezentacja zbiorw rozmytych dla wejcia reprezentujcego kolejk na drodze dojazdowej

Kolejka na drodze docelowej - DROGA_DOCELOWA - jest przez nastpujce zbiory rozmyte: - BARDZO_PUSTA - opisany funkcj trjktn o parametrach: (-25, 0) (0, 1) (25, 0); - PUSTA - opisany funkcj trjktn o parametrach: (0, 0) (25, 1) (50, 0); - UMIARKOWANIE_ZAPELNIONA - opisany funkcj trjktn o parametrach - (25,0) (50, 1) (75, 0); - ZAPELNIONA - opisany funkcj trjktn o parametrach - (50, 0) (75, 1) (100, 0); - BARDZO_ZAPELNIONA - opisany funkcj trjktn o parametrach - (75, 0) (100, 1) (125, 0); Graficzna reprezentacja zbiorw rozmytych zostaa przedstawiona na rys. 11.

Rys. 11. Graficzna reprezentacja zbiorw rozmytych dla wejcia reprezentujcego kolejk na drodze docelowej

Wyjcie ukadu wnioskowania - KONIECZNOSC_PRZEDLUZENIA - jest reprezentowane przez nastpujce zbiory rozmyte: - BRAK - opisany funkcj trjktn o parametrach: (-0.25, 0) (0, 1) (0.25, 0); - MALA - opisany funkcj trjktn o parametrach: (0, 0) (0.25, 1) (0.5, 0); - UMIARKOWANA - opisany funkcj trjktn o parametrach: (0.25, 0) (0.5, 1) (0.75, 0); - DUZA - opisany funkcj trjktn o parametrach: (0.5, 0) (0.75, 1) (1, 0); - BARDZO_DUZA - opisany funkcj trjktn o parametrach: (0.75, 0) (1, 1) (1.25, 0); Graficzna reprezentacja zbiorw rozmytych zostaa przedstawiona na rys. 12.

Rys. 12. Graficzna reprezentacja zbiorw rozmytych dla wyjcia reprezentujcego konieczno przeduenia aktualnej kombinacji

Zestaw regu zosta opracowany na podstawie oglnej wiedzy i zasad ktre powinny by stosowane na skrzyowaniu, reguy zostay przedstawione w tabeli 2.
Tabela 2. Tabela regu dla kombinacji aktualnie aktywnej
KOLEJKA BRAK KROTKA KROTKA KROTKA KROTKA KROTKA UMIARKOWANA UMIARKOWANA UMIARKOWANA UMIARKOWANA UMIARKOWANA DLUGA DLUGA DLUGA DLUGA DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA DROGA_DOCELOWA BARDZO_PUSTA PUSTA UMIARKOWANIE_ZAPELNIONA ZAPELNIONA BARDZO_ZAPELNIONA BARDZO_PUSTA PUSTA UMIARKOWANIE_ZAPELNIONA ZAPELNIONA BARDZO_ZAPELNIONA BARDZO_PUSTA PUSTA UMIARKOWANIE_ZAPELNIONA ZAPELNIONA BARDZO_ZAPELNIONA BARDZO_PUSTA PUSTA UMIARKOWANIE_ZAPELNIONA ZAPELNIONA BARDZO_ZAPELNIONA KONIECZNOSC_PRZEDLUZENIA BRAK MALA MALA MALA MALA MALA DUZA DUZA UMIARKOWANA MALA MALA BARDZO_DUZA DUZA UMIARKOWANA MALA MALA BARDZO_DUZA BARDZO_DUZA UMIARKOWANA MALA MALA

Implementacja regu zostaa zawarta opisana w rozdziale 6.3. 7.2.2. Dla kombinacji aktualnie nieaktywnej W przypadku gdy koniecznie jest obliczenie potrzeby zmiany aktualnie trwajcej kombinacji na now analizowane s pozostae kombinacje. Z kadej z nich wybierane s drogi dla ktrych byoby wczone jest zielone wiato w przypadku zmiany na analizowan kombinacj. Do zmiennych wejciowych zalicza si: poziom zapenienia drogi dojazdowej do skrzyowania - kolejka dojazdowa poziom zapeniania drogi docelowej - kolejka na drodze docelowej czas trwania czerwonego wiata dla drogi dojazdowej Jako wyjcie z ukadu wnioskowania rozmytego obliczana jest: konieczno zmiany na dan kombinacj wiate

Kolejka drogi dojazdowej do skrzyowania - KOLEJKA - reprezentowana jest przez nastpujce zbiory rozmyte: - BRAK - opisany funkcj trjktn o parametrach: (-25, 0) (0, 1) (25, 0); - KROTKA - opisany funkcj trjktn o parametrach: (0, 0) (25, 1) (50, 0); - UMIARKOWANA - opisany funkcj trjktn o parametrach - (25,0) (50, 1) (75, 0); - DLUGA - opisany funkcj trjktn o parametrach - (50, 0) (75, 1) (100, 0); - BARDZO_DLUGA - opisany funkcj trjktn o parametrach - (75, 0) (100, 1) (125, 0); Graficzna reprezentacja zbiorw rozmytych zostaa przedstawiona na rys. 13.

Rys. 13. Graficzna reprezentacja zbiorw rozmytych dla wejcia reprezentujcego kolejk na drodze dojazdowej

Kolejka na drodze docelowej - DROGA_DOCELOWA - jest reprezentowany przez nastpujce zbiory rozmyte: - BARDZO_PUSTA - opisany funkcj trjktn o parametrach: (-25, 0) (0, 1) (25, 0); - PUSTA - opisany funkcj trjktn o parametrach: (0, 0) (25, 1) (50, 0); - UMIARKOWANIE_ZAPELNIONA - opisany funkcj trjktn o parametrach - (25,0) (50, 1) (75, 0); - ZAPELNIONA - opisany funkcj trjktn o parametrach - (50, 0) (75, 1) (100, 0); - BARDZO_ZAPELNIONA - opisany funkcj trjktn o parametrach - (75, 0) (100, 1) (125, 0); Graficzna reprezentacja zbiorw rozmytych zostaa przedstawiona na rys. 14.

Rys. 14. Graficzna reprezentacja zbiorw rozmytych dla wejcia reprezentujcego kolejk na drodze docelowej

Czas trwania wiata czerwonego na drodze dojazdowej - SWIATLO_CZERWONE - jest reprezentowany przez nastpujce zbiory rozmyte: - KROTKO - opisany funkcj trjktn o parametrach: (-30, 0) (0, 1) (30, 0); - UMIARKOWANIE - opisany funkcj trjktn o parametrach: (0, 0) (30, 1) (60, 0); - DLUGO - opisany funkcj trjktn o parametrach - (30, 0) (60, 1) (90, 0); Graficzna reprezentacja zbiorw rozmytych zostaa przedstawiona na rys. 14.

Rys. 14. Graficzna reprezentacja zbiorw rozmytych dla wejcia reprezentujcego czas oczekiwnia

Wyjcie ukadu wnioskowania - KONIECZNOSC_ZMIANY - jest reprezentowane przez nastpujce zbiory rozmyte: - BRAK - opisany funkcj trjktn o parametrach: (-0.25, 0) (0, 1) (0.25, 0); - MALA - opisany funkcj trjktn o parametrach: (0, 0) (0.25, 1) (0.5, 0); - UMIARKOWANA - opisany funkcj trjktn o parametrach: (0.25, 0) (0.5, 1) (0.75, 0); - DUZA - opisany funkcj trjktn o parametrach: (0.5, 0) (0.75, 1) (1, 0); - BARDZO_DUZA - opisany funkcj trjktn o parametrach: (0.75, 0) (1, 1) (1.25, 0); Graficzna reprezentacja zbiorw rozmytych zostaa przedstawiona na rys. 15.

Rys. 15. Graficzna reprezentacja zbiorw rozmytych dla wyjcia reprezentujcego konieczno zmiany na analizowan kombinacj

Zestaw regu zosta opracowany na podstawie oglnej wiedzy i zasad ktre powinny by stosowane na skrzyowaniu, reguy zostay przedstawione w tabeli 3.
Tabela 3. Reguy dla pary drg aktualnie nieaktywnej
KOLEJKA BRAK KROTKA KROTKA KROTKA KROTKA KROTKA KROTKA KROTKA KROTKA KROTKA KROTKA KROTKA KROTKA KROTKA KROTKA KROTKA UMIARKOWANA UMIARKOWANA UMIARKOWANA UMIARKOWANA DROGA_DOCELOWA BARDZO_PUSTA BARDZO_PUSTA BARDZO_PUSTA PUSTA PUSTA PUSTA UMIARKOWANIE_ZAPELNIONA UMIARKOWANIE_ZAPELNIONA UMIARKOWANIE_ZAPELNIONA ZAPELNIONA ZAPELNIONA ZAPELNIONA BARDZO_ZAPELNIONA BARDZO_ZAPELNIONA BARDZO_ZAPELNIONA BARDZO_PUSTA BARDZO_PUSTA BARDZO_PUSTA PUSTA SWIATLO_CZERWONE KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO KONIECZNOSC_ZMIANY BRAK MALA MALA UMIARKOWANA MALA MALA UMIARKOWANA MALA MALA UMIARKOWANA MALA MALA UMIARKOWANA MALA MALA MALA UMIARKOWANA DUZA BARDZO_DUZA UMIARKOWANA

UMIARKOWANA UMIARKOWANA UMIARKOWANA UMIARKOWANA UMIARKOWANA UMIARKOWANA UMIARKOWANA UMIARKOWANA UMIARKOWANA UMIARKOWANA UMIARKOWANA DLUGA DLUGA DLUGA DLUGA DLUGA DLUGA DLUGA DLUGA DLUGA DLUGA DLUGA DLUGA DLUGA DLUGA DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA BARDZO_DLUGA

PUSTA PUSTA UMIARKOWANIE_ZAPELNIONA UMIARKOWANIE_ZAPELNIONA UMIARKOWANIE_ZAPELNIONA ZAPELNIONA ZAPELNIONA ZAPELNIONA BARDZO_ZAPELNIONA BARDZO_ZAPELNIONA BARDZO_ZAPELNIONA BARDZO_PUSTA BARDZO_PUSTA BARDZO_PUSTA PUSTA PUSTA PUSTA UMIARKOWANIE_ZAPELNIONA UMIARKOWANIE_ZAPELNIONA UMIARKOWANIE_ZAPELNIONA ZAPELNIONA ZAPELNIONA ZAPELNIONA BARDZO_ZAPELNIONA BARDZO_ZAPELNIONA BARDZO_ZAPELNIONA BARDZO_PUSTA BARDZO_PUSTA BARDZO_PUSTA PUSTA PUSTA PUSTA UMIARKOWANIE_ZAPELNIONA UMIARKOWANIE_ZAPELNIONA UMIARKOWANIE_ZAPELNIONA ZAPELNIONA ZAPELNIONA ZAPELNIONA BARDZO_ZAPELNIONA BARDZO_ZAPELNIONA BARDZO_ZAPELNIONA

UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO KROTKO UMIARKOWANIE DLUGO

UMIARKOWANA DUZA MALA UMIARKOWANA DUZA MALA MALA UMIARKOWANA MALA MALA UMIARKOWANA UMIARKOWANA DUZA BARDZO_DUZA UMIARKOWANA BARDZO_DUZA BARDZO_DUZA UMIARKOWANA UMIARKOWANA DUZA MALA MALA DUZA MALA MALA UMIARKOWANA DUZA BARDZO_DUZA BARDZO_DUZA DUZA DUZA DUZA UMIARKOWANA DUZA DUZA UMIARKOWANA UMIARKOWANA DUZA MALA MALA UMIARKOWANA

Implementacja regu zostaa zawarta opisana w rozdziale 6.3. 7.3. Implementacja logiki rozmytej w jzyku FCL Do implementacji logiki rozmytej w projekcie uyto jzyka FCL (Fuzzy Control Language) dokadny opis jzyka jest zawarty w dokumentacji IEC 1131-710. Pliki logiki rozmytej dla obliczania koniecznoci zmiany dla kombinacji, ktra jest aktualnie nie aktywna (wiato czerwone) oraz koniecznoci przeduenia biecej kombinacji (wiato zielone) zostay zdefiniowane odpowiednio w plikach: fuzzy-czerwone.txt (listing 9) oraz fuzzy-zielone.txt (listing 10). Poszczeglne sekcje w obu plikach oznaczaj: VAR_INPUT - deklaracja zmiennych wejciowych VAR_OUTPUT - deklaracja zmiennych wyjciowych FUZZIFY - fuzyfikacja (rozmywanie) zmiennych - TERM definiuje zbiory rozmyte za pomoc punktw opisanych par (x,y), gdzie x jest wartoci zmiennej wejciowej, a y stopniem przynalenoci elementu x do definiowanego zbioru, a wic wartoci z przedziau [0,1]
10

http://www.fuzzytech.com/binaries/ieccd1.pdf

DEFUZZIFY - defuzyfikacja (wyostrzanie) - METHOD metoda wyostrzania (znajdowania wartoci ostrej reprezentujcej zbir rozmytego) moe by jedn spord nastpujcych metod: o COG (Center of Gravity) o COGS (Center of Gravity for Singletons) o COA (Center of Area) o LM (Left Most Maximum) o RM (Right Most Maximum) RULEBLOCK - definicje regu rozmytych - naley zdefiniowa operator and, or, act (metod aktywacji reguy) wraz z algorytmem np: AND : MIN; ACT : MIN; oraz metod akumulacji (agregacji) regu (jedn z BoundedSum, Max, ProbOr, Sum, NormedSum) np. ACCU : MAX; A nastpnie zdefiniowa zabir regu w postaci "RULE 2 : IF ZMIENNA_WE is ZBIOR_ROZMYTY_WE and/or ZMIENNA_WE2 is ZBIOR_ROZMYTY_WE then ZMIENNA_WE is ZBIOR_ROZMYTY_WY;
Listing 9. Plik logiki rozmytej dla aktualnie nieaktywnej kombinacji
FUNCTION_BLOCK complexmamdani VAR_INPUT KOLEJKA: REAL; DROGA_DOCELOWA: REAL; SWIATLO_CZERWONE: REAL; END_VAR FUZZIFY KOLEJKA TERM BRAK := (-25, 0) (0, 1) (25, 0); TERM KROTKA := (0, 0) (25, 1) (50, 0); TERM UMIARKOWANA := (25,0) (50, 1) (75, 0); TERM DLUGA := (50, 0) (75, 1) (100, 0); TERM BARDZO_DLUGA := (75, 0) (100, 1) (125, 0); END_FUZZIFY FUZZIFY DROGA_DOCELOWA TERM BARDZO_PUSTA := (-25, 0) (0, 1) (25, 0); TERM PUSTA := (0, 0) (25, 1) (50, 0); TERM UMIARKOWANANIE_ZAPELNIONA := (25,0) (50, 1) (75, 0); TERM ZAPELNIONA := (50, 0) (75, 1) (100, 0); TERM BARDZO_ZAPELNIONA := (75, 0) (100, 1) (125, 0); END_FUZZIFY FUZZIFY SWIATLO_CZERWONE TERM KROTKO := (-30, 0) (0, 1) (30, 0); TERM UMIARKOWANIE := (0, 0) (30, 1) (60, 0); TERM DLUGO := (30, 0) (60, 1) (90, 0); END_FUZZIFY VAR_OUTPUT KONIECZNOSC_ZMIANY: REAL; END_VAR DEFUZZIFY KONIECZNOSC_ZMIANY TERM BRAK := (-0.25, 0) (0, 1) (0.25, 0); TERM MALA := (0, 0) (0.25, 1) (0.5, 0); TERM UMIARKOWANA := (0.25, 0) (0.5, 1) (0.75, 0); TERM DUZA := (0.5, 0) (0.75, 1) (1, 0); TERM BARDZO_DUZA := (0.75, 0) (1, 1) (1.25, 0); END_DEFUZZIFY RULEBLOCK NO1 // Uycie 'min' dla metody and (aktywacji reguy) -> DeMorgan 'max' dla metody or AND : MIN; // Metoda aktywacji 'min' ACT : MIN; // metoda akumulacji 'max' ACCU : MAX;

RULE 1 : IF KOLEJKA is BRAK then KONIECZNOSC_ZMIANY is BRAK;

RULE 2 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is BARDZO_PUSTA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is MALA; RULE 3 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is BARDZO_PUSTA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is MALA; RULE 4 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is BARDZO_PUSTA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 5 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is PUSTA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is MALA; RULE 6 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is PUSTA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is MALA; RULE 7 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is PUSTA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 8 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is MALA; RULE 9 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is MALA; RULE 10 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 11 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is ZAPELNIONA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is MALA; RULE 12 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is ZAPELNIONA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is MALA; RULE 13 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is ZAPELNIONA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 14 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is MALA; RULE 15 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is MALA; RULE 16 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is MALA; RULE 17 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is BARDZO_PUSTA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 18 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is BARDZO_PUSTA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is DUZA; RULE 19 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is BARDZO_PUSTA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is BARDZO_DUZA; RULE 20 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is PUSTA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 21 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is PUSTA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 22 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is PUSTA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is DUZA; RULE 23 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is MALA; RULE 24: IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 25 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is DUZA; RULE 26 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is ZAPELNIONA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is MALA; RULE 27 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is ZAPELNIONA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is MALA; RULE 28 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is ZAPELNIONA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 29 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is MALA; RULE 30 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is MALA; RULE 31 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 32 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is BARDZO_PUSTA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 33 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is BARDZO_PUSTA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is DUZA; RULE 34 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is BARDZO_PUSTA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is BARDZO_DUZA; RULE 35 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is PUSTA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 36 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is PUSTA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is BARDZO_DUZA; RULE 37 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is PUSTA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is BARDZO_DUZA; RULE 38 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 39 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA and

SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 40 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is DUZA; RULE 41 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is ZAPELNIONA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is MALA; RULE 42 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is ZAPELNIONA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is MALA; RULE 43 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is ZAPELNIONA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is DUZA; RULE 44 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is MALA; RULE 45 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is MALA; RULE 46 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 47 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is BARDZO_PUSTA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is DUZA; RULE 48 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is BARDZO_PUSTA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is BARDZO_DUZA; RULE 49 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is BARDZO_PUSTA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is BARDZO_DUZA; RULE 50 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is PUSTA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is DUZA; RULE 51 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is PUSTA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is DUZA; RULE 52 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is PUSTA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is BARDZO_DUZA; RULE 53 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 54 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is DUZA; RULE 55 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is DUZA; RULE 56 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is ZAPELNIONA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 57 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is ZAPELNIONA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is UMIARKOWANA; RULE 58 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is ZAPELNIONA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is DUZA; RULE 59 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA and SWIATLO_CZERWONE is KROTKO then KONIECZNOSC_ZMIANY is MALA; RULE 60 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA and SWIATLO_CZERWONE is UMIARKOWANIE then KONIECZNOSC_ZMIANY is MALA; RULE 61 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA and SWIATLO_CZERWONE is DLUGO then KONIECZNOSC_ZMIANY is UMIARKOWANA; END_RULEBLOCK END_FUNCTION_BLOCK

Listing 10. Plik logiki rozmytej dla aktualnie aktywnej kombinacji


FUNCTION_BLOCK complexmamdani VAR_INPUT KOLEJKA: REAL; DROGA_DOCELOWA: REAL; END_VAR FUZZIFY KOLEJKA TERM BRAK := (-25, 0) (0, 1) (25, 0); TERM KROTKA := (0, 0) (25, 1) (50, 0); TERM UMIARKOWANA := (25,0) (50, 1) (75, 0); TERM DLUGA := (50, 0) (75, 1) (100, 0); TERM BARDZO_DLUGA := (75, 0) (100, 1) (125, 0); END_FUZZIFY FUZZIFY DROGA_DOCELOWA TERM BARDZO_PUSTA := (-25, 0) (0, 1) (25, 0); TERM PUSTA := (0, 0) (25, 1) (50, 0); TERM UMIARKOWANANIE_ZAPELNIONA := (25,0) (50, 1) (75, 0); TERM ZAPELNIONA := (50, 0) (75, 1) (100, 0); TERM BARDZO_ZAPELNIONA := (75, 0) (100, 1) (125, 0); END_FUZZIFY

VAR_OUTPUT KONIECZNOSC_PRZEDLUZENIA: REAL; END_VAR DEFUZZIFY KONIECZNOSC_PRZEDLUZENIA TERM BRAK := (-0.25, 0) (0, 1) (0.25, 0); TERM MALA := (0, 0) (0.25, 1) (0.5, 0); TERM UMIARKOWANA := (0.25, 0) (0.5, 1) (0.75, 0); TERM DUZA := (0.5, 0) (0.75, 1) (1, 0); TERM BARDZO_DUZA := (0.75, 0) (1, 1) (1.25, 0); END_DEFUZZIFY RULEBLOCK NO1 AND : MIN; ACT : MIN; ACCU : MAX;

RULE 1 : IF KOLEJKA is BRAK then KONIECZNOSC_PRZEDLUZENIA is BRAK; RULE 2 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is BARDZO_PUSTA then KONIECZNOSC_PRZEDLUZENIA is MALA; RULE 3 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is PUSTA then KONIECZNOSC_PRZEDLUZENIA is MALA; RULE 4 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA then KONIECZNOSC_PRZEDLUZENIA is MALA; RULE 5 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is ZAPELNIONA then KONIECZNOSC_PRZEDLUZENIA is MALA; RULE 6 : IF KOLEJKA is KROTKA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA then KONIECZNOSC_PRZEDLUZENIA is MALA; RULE 7 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is BARDZO_PUSTA then KONIECZNOSC_PRZEDLUZENIA is DUZA; RULE 8 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is PUSTA then KONIECZNOSC_PRZEDLUZENIA is DUZA; RULE 9 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA then KONIECZNOSC_PRZEDLUZENIA is UMIARKOWANA; RULE 10 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is ZAPELNIONA then KONIECZNOSC_PRZEDLUZENIA is MALA; RULE 11 : IF KOLEJKA is UMIARKOWANA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA then KONIECZNOSC_PRZEDLUZENIA is MALA; RULE 12 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is BARDZO_PUSTA then KONIECZNOSC_PRZEDLUZENIA is BARDZO_DUZA; RULE 13 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is PUSTA then KONIECZNOSC_PRZEDLUZENIA is DUZA; RULE 14 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA then KONIECZNOSC_PRZEDLUZENIA is UMIARKOWANA; RULE 15 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is ZAPELNIONA then KONIECZNOSC_PRZEDLUZENIA is MALA; RULE 16 : IF KOLEJKA is DLUGA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA then KONIECZNOSC_PRZEDLUZENIA is MALA; RULE 17 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is BARDZO_PUSTA then KONIECZNOSC_PRZEDLUZENIA is BARDZO_DUZA; RULE 18 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is PUSTA then KONIECZNOSC_PRZEDLUZENIA is BARDZO_DUZA; RULE 19 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is UMIARKOWANANIE_ZAPELNIONA then KONIECZNOSC_PRZEDLUZENIA is UMIARKOWANA; RULE 20 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is ZAPELNIONA then KONIECZNOSC_PRZEDLUZENIA is MALA; RULE 21 : IF KOLEJKA is BARDZO_DLUGA and DROGA_DOCELOWA is BARDZO_ZAPELNIONA then KONIECZNOSC_PRZEDLUZENIA is MALA; END_RULEBLOCK END_FUNCTION_BLOCK

8. Program Fuzzy Traffic Light Controller


8.1. Moliwoci Fuzzy Traffic Light Controller Jest programem opracowanym na potrzeby projektu. Jego gwnymi cechami jest: graficzna reprezentacja zbiorw rozmytych, wnioskowania rozmytego moliwo adowania plikw logiki rozmytej dla ukadw wnioskowania rozmytego opisanego w rozdziale 7.2 oraz 7.3 moliwo testowania regu rozmytych z graficzn interpretacj wyniku uruchamianie oraz kontrola pracy symulatora SUMO (konieczne jest wskazanie pliku konfiguracji opisanego w rozdziale 6.1 automatycznie wykrywanie skrzyowa sterownych sygnalizacj wietln moliwo przypisania pliku kombinacji sygnalizacji wietlnej (rozdzia 6.2) do kadego z skrzyowa automatyczne przypisywanie detektorw zajtoci pasw do skrzyowa (musz by wczeniej zdefiniowane) moliwo rcznej kontroli sygnalizacji wietlnej na kadym skrzyowaniu moliwo rozmytej kontroli sygnalizacji wietlnej na kadym skrzyowaniu z wykorzystaniem zaadowanych plikw logiki rozmytej oraz plikw kombinacji dla danej sygnalizacji wietlnej podgld stanu sygnalizacji wietlnej dla kadego skrzyowania domylna kontrola sygnalizacji wietlnej odbywa si z wykorzystaniem cykli czasowych wygenerowanych przez NETCONVERT 8.2. Opis klas Fuzzy Traffic Light Controller Diagram klas zastosowany w programie zosta przedstawiony na rysunku 16. Klasy oraz ich funkcje w programie: WnioskowaczGreenLight - klasa odpowiedzialna za Fuzzy Inference System dla aktualnie trwajcej kombinacji sygnalizacji wietlnej. Jej zadaniem jest obliczanie potrzeby przeduenia aktualnej kombinacji. WnioskowaczRedLight - klasa odpowiedzialna za Fuzzy Inference System kombinacji sygnalizacji wietlnej, ktra nie jest aktywna. Jej zadaniem jest obliczanie potrzeby zmiany aktualnej kombinacji na kombinacje rozwaan. XMLCombinationParser - Parser plikw moliwoci przecze sygnalizacji wietlnej dla danego skrzyowania TesterPlikowLogikiRozmytej - Tester plikw logiki rozmytej - sprawdza, czy zawarto zaadowanego pliku, jest poprawna, dokonuje rwnie prbnego wnioskowania. NextSimStep - klasa implementujca interfejs Runnable - wykonywana jako wtek w okrelonych odstpach czasu skonfigurowanych w GUI Fuzzy Traffic Light Kontroler jej zadaniem jest sterowanie symulacj, ustawianie odpowiednich stanw dla sygnalizacji wietlnej, pobieranie z symulacji informacji o ruchu pojazdw. ListaSwiatel - klasa reprezentujca skrzyowanie, odpowiedzialna za odpowiednie ustawianie wiate, przechowywanie czasu trwania wiata czerwonego, stanu detektorw, dugoci pasw ruchu, trybu sterowania skrzyowaniem, zawiera obiekty klasy LightSwitcher - reprezentujce pojedyncze wiato.

LightSwitcher - reprezentuje pojedyncze wiato - jego stany - oraz reprezentacje graficzn, umoliwia zmian stanu danego wiata poprzez odpowiedni kombinacj klikni. FuzzyTesterView - gowna klasa programu, obsuguje interakcje z uytkownikiem, FileNameFilterek - filtr plikw wywietlanych w oknie wyboru pliku. FuzzyConfig - przechowuje cieki do plikw logiki rozmytej dla FIS

8.3. Implementacja obsugi sygnalizacji wietlnej na skrzyowaniach. 8.3.1. Pobieranie listy skrzyowa, odpowiadajcych im pocze drg, detektorw oraz dugoci drg na ktrych umiejscowione s detektory. cieka postpowania przy dodawaniu skrzyowa: -stworzenie repozytorium wiate ulicznych -pobranie wszystkich wiate do repozytorium -przejcie przez wszystkie pobrane wiata -pobranie kontrolowanych linkw w ramach kadego z wiate -pobranie drogi dojazdowej oraz drogi docelowej dla kadego z linkw -sprawdzenie czy istnieje detektor przypisany dla kadej z pobranych wczeniej drg -przypisanie dugoci drogi do dojazdowej i docelowej kadego z linkw -przypisanie plikw logiki rozmytej do skrzyowania (moliwo zdefiniowania wielu plikw logiki rozmytej zostanie zaimplementowana w przyszych wersjach) -dodanie stworzonego obiektu klasy ListaSwaitel to tablicy przechowujcej wszystkie obsugiwane sygnalizacje wietlenie w ramach symulacji.
Listing 11. Fragment kodu odpowiedzialny za wstpne przygotowanie skrzyowa Repository<TrafficLight> tlrepo = conn.getTrafficLightRepository(); Set<String> detectorsIDs = null; Set<String> lista = tlrepo.getIDs(); for(String nazwa:lista){ ListaSwiatel listaSwiatel = null; TrafficLight tLight = tlrepo.getByID(nazwa); ControlledLinks linki = tLight.getReadControlledLinksQuery().get(); ControlledLink[][] linkiArray = linki.getLinks(); listaSwiatel = new ListaSwiatel(linkiArray.length, nazwa); Double[] incLen = new Double[linkiArray.length]; Double[] outLen = new Double[linkiArray.length]; for(int i=0; i<linkiArray.length; i++){ ControlledLink clink = linkiArray[i][0]; String incLaneStr = clink.getIncomingLane().getID(); String outLaneStr = clink.getOutgoingLane().getID(); incLen[i]=0.0; outLen[i]=0.0; for(String det:detectorsIDs){ InductionLoop detectorek = ilrepo.getByID(det); Lane lane = detectorek.queryReadLane().get(); if(incLaneStr.equals(lane.getID())){ incLen[i] = detectorek.queryReadLaneLen().get(); break; }

} for(String det:detectorsIDs){ InductionLoop detectorek = ilrepo.getByID(det); Lane lane = detectorek.queryReadLane().get(); if(outLaneStr.equals(lane.getID())){ outLen[i] = detectorek.queryReadLaneLen().get(); break; } } } listaSwiatel.setdlugoscIncLane(incLen); listaSwiatel.setdlugoscOutLane(outLen); if(this.fuzzyConfig.GetGreenLightFile()!=null&&this.fuzzyConfig.GetGreenLig htFile().length()>0)listaSwiatel.setFuzzyFileG(this.fuzzyConfig.GetGreenLig htFile()); if(this.fuzzyConfig.GetRedLightFile()!=null&&this.fuzzyConfig.GetRedLightFi le().length()>0)listaSwiatel.setFuzzyFileR(this.fuzzyConfig.GetRedLightFile ()); this.listaKontrolowanychSwiatel.add(listaSwiatel); }

8.3.2. Wybr trybu sterowania sygnalizacj wietln. Kolejno analizowane s wszystkie elementy tablicy listaSwiatel. Z repozytorium wiate ulicznych pobierane jest wiato zgodnie z nazw zawart w elemencie listy. Sprawdzana jest warto logiczna zwracana przez funkcje zawarte w elemencie nalecym do listy wiate odpowiednio getDoFuzzy() lub getManualControll(). Przypadek kontroli za pomoc logiki rozmytej zostanie opisany w punkcie 8.3.3. Kontrola rczna moliwa jest poprzez pobranie cigu znakw reprezentujcego stany poszczeglnych wiate z obiektu ListaSwiatel. Cig ten jest analizowany poda ktem wystpie liter 'g', 'y', 'r', a nastpnie tworzony jest obiekt klasy LightState, do ktrego zapisywane s wszystkie stany zgodnie z typem wyliczeniowym zawartym w klasie LightState. Tryb automatyczny bazujcy na stanach zdefiniowanych w symulatorze SUMO przenosi wartoci z symulatora na kontrolki obrazujce stan sygnalizacji wietlnej w Fuzzy Traffic Light Controller. Operacja jest analogiczna do operacji kontroli rcznej, z tym, e dane przesyane s w przeciwnym kierunku.
Listing 12. Fragment kodu odpowiedzialny za wybr metody sterowania for (ListaSwiatel swiatlo : listaSwiatel) { Repository<TrafficLight> tlr = this.connection.getTrafficLightRepository(); Repository<InductionLoop> e2Repo = this.connection.getInductionLoopRepository(); TrafficLight tl = tlr.getByID(swiatlo.getNameTL()); Repository<MeMeDetector> repod = connection.getMeMeDetectorRepository(); ControlledLinks kontrolowanePolacznia = tl.getReadControlledLinksQuery().get(); if (swiatlo.getDoFuzzy()) { policzFuzzy(swiatlo.getNameTL()); } else if (swiatlo.getManualControll()) { LightState[] ls = new LightState[tl.getReadCurrentStateQuery().get().lightStates.length]; ls = tl.getReadCurrentStateQuery().get().lightStates;

String swiatla = swiatlo.getLights(); for (int i = 0; i < tl.getReadCurrentStateQuery().get().lightStates.length; i++) { switch (swiatla.charAt(i)) { case 'g': ls[i] = LightState.GREEN; break; case 'r': ls[i] = LightState.RED; break; case 'y': ls[i] = LightState.YELLOW; break; } } TLState tls = new TLState(ls); ChangeLightsStateQuery q = tl.getChangeLightsStateQuery(); q.setValue(tls); q.run(); } else { LightState[] ls = new LightState[tl.getReadCurrentStateQuery().get().lightStates.length]; ls = tl.getReadCurrentStateQuery().get().lightStates; char[] literoweSwiatla = new char[tl.getReadCurrentStateQuery().get().lightStates.length]; swiatlo.updateLights(String.copyValueOf(literoweSwiatla)); ControlledLinks links = tl.getReadControlledLinksQuery().get(); for (int i = 0; i < tl.getReadCurrentStateQuery().get().lightStates.length; i++) { switch (ls[i]) { case GREEN: case GREEN_NODECEL: literoweSwiatla[i] = 'g'; break; case RED: case RED_NODECEL: literoweSwiatla[i] = 'r'; break; case YELLOW: case YELLOW_NODECEL: literoweSwiatla[i] = 'y'; break; } ControlledLink link = links.getLinks()[i][0]; Repository<Lane> lrepo = connection.getLaneRepository(); Lane lane = lrepo.getByID(link.getIncomingLane().getID()); } swiatlo.updateLights(String.copyValueOf(literoweSwiatla)); } }

8.3.3. Wyznaczanie optymalnej kombinacji przeczenia sygnalizacji wietlnej za pomoc logiki rozmytej. Wyznaczanie optymalnej kombinacji przeczenia sygnalizacji wietlnej za pomoc logiki rozmytej, odbywa si przez obliczenie koniecznoci przeduenia aktualnie trwajcej kombinacji jak rwnie obliczenie potrzeby zmiany na jedn z kombinacji nieaktywnych. Metoda zaprezentowana na listingu 13 jest programistycznym opisem zaoe rozdziau 7. Obliczanie zajtoci pasa ruchu odbywa si przez pobranie liczby samochodw znajdujcych si na pasie ruchu, jego dugoci, wyznaczeniu maksymalnej liczby samochodw na pasie. Wykonujc dzielc aktualn liczb samochodw przez maksymalna liczb samochodw na pasie otrzymuje si zajto pasa w przedziale od 0 do 1. W celu poprawnego wnioskowania z przygotowanym FIS naley warto t pomnoy przez liczb 100. Czas trwania wiata czerwonego przechowywany jest w specjalnie stworzonej tablicy przechowujcej wartoci trwania wiate dla poszczeglnych sygnalizatorw. Inkrementacja tych wartoci odbywa si podczas kadego kolejnego kroku symulacji, zerowanie podczas zmiany stanu sygnalizatora na inny.
Listing 13. Fragment kodu odpowiedzialny za wyznaczanie najlepszej moliwej konfiguracji wiate ListaSwiatel swiatlo = null; for (int p = 0; p < listaSwiatel.size(); p++) { if (listaSwiatel.get(p).getNameTL().equals(name)) { swiatlo = listaSwiatel.get(p); if (this.wnioskowaczGL == null) { this.wnioskowaczGL = new WnioskowaczGreenLight(swiatlo.getGfuzzy()); } if (this.wnioskowaczRL == null) { this.wnioskowaczRL = new WnioskowaczRedLight(swiatlo.getRfuzzy()); } } } if (swiatlo.getCombinations().length > 0) { Repository<TrafficLight> tlr = this.connection.getTrafficLightRepository(); Repository<InductionLoop> repod=connection.getInductionLoopRepository(); TrafficLight tl = tlr.getByID(name); ControlledLinks kontrolowanePolacznia = tl.getReadControlledLinksQuery().get(); int kombinacje[][] = swiatlo.getCombinations(); Double[] koniecznoscZmianyDlaKombinacji = new Double[kombinacje.length]; System.out.println("Fuzzy Junction: " + name); for (int k = 0; k < kombinacje.length; k++) { System.out.print(Integer.valueOf(k).toString() + " "); int[] kombinacja = kombinacje[k]; koniecznoscZmianyDlaKombinacji[k] = 0.0; if (k == swiatlo.getAktualnyIndex()) { for (int l = 0; l < kombinacja.length; l++) { if (kombinacja[l] == 1) { System.out.print(Integer.valueOf(l).toString() + ": "); ControlledLink clink = kontrolowanePolacznia.getLinks()[l][0]; String incLaneStr = clink.getIncomingLane().getID(); String outLaneStr = clink.getOutgoingLane().getID(); String incLaneDetectorStr = null; String outLaneDetectorStr = null; for (String det : repod.getIDs()) { InductionLoop detectorek = repod.getByID(det); Lane lane = detectorek.queryReadLane().get();

if (incLaneStr.equals(lane.getID())) { incLaneDetectorStr = detectorek.getID(); break; } } for (String det : repod.getIDs()) { InductionLoop detectorek = repod.getByID(det); Lane lane = detectorek.queryReadLane().get(); if (outLaneStr.equals(lane.getID())) { outLaneDetectorStr = detectorek.getID(); break; } } InductionLoop incDetector = null; InductionLoop outDetector = null; if (outLaneDetectorStr != null && incLaneDetectorStr != null) { incDetector = repod.getByID(incLaneDetectorStr); outDetector = repod.getByID(outLaneDetectorStr); } if (incDetector != null && outDetector != null) { Double maxSamochodowInc = swiatlo.getDlugoscIncLaneOfLink(l)/dlSamochodu; maxSamochodowInc = Math.ceil(maxSamochodowInc); Double zajetoscInc = incDetector.queryReadLastStepVehicleNumber().get().doubleValue() /maxSamochodowInc; Double maxSamochodowOut = swiatlo.getDlugoscOutLaneOfLink(l)/dlSamochodu; maxSamochodowOut = Math.ceil(maxSamochodowOut); Double zajetoscOut = outDetector.queryReadLastStepVehicleNumber().get().doubleValue() / maxSamochodowOut; if (zajetoscOut > 1.0) { zajetoscOut = 1.0; } if (zajetoscInc > 1.0) { zajetoscInc = 1.0; } zajetoscInc *= 100; zajetoscOut *= 100; Double koniecznoscPrzedluzenia = wnioskowaczGL.Wnioskuj(zajetoscInc, zajetoscOut); System.out.println(""); koniecznoscZmianyDlaKombinacji[k] += koniecznoscPrzedluzenia; } } } } else { for (int l = 0; l < kombinacja.length; l++) { if (kombinacja[l] == 1) { System.out.print(Integer.valueOf(l).toString() + ": "); ControlledLink clink = kontrolowanePolacznia.getLinks()[l][0]; String incLaneStr = clink.getIncomingLane().getID(); String outLaneStr = clink.getOutgoingLane().getID(); String incLaneDetectorStr = null; String outLaneDetectorStr = null; for (String det : repod.getIDs()) { InductionLoop detectorek = repod.getByID(det); Lane lane = detectorek.queryReadLane().get(); if (incLaneStr.equals(lane.getID())) { incLaneDetectorStr = detectorek.getID(); break;

} } for (String det : repod.getIDs()) { InductionLoop detectorek = repod.getByID(det); Lane lane = detectorek.queryReadLane().get(); if (outLaneStr.equals(lane.getID())) { outLaneDetectorStr = detectorek.getID(); break; } } InductionLoop incDetector = null; InductionLoop outDetector = null; if (outLaneDetectorStr != null && incLaneDetectorStr != null) { incDetector = repod.getByID(incLaneDetectorStr); outDetector = repod.getByID(outLaneDetectorStr); } if (incDetector != null && outDetector != null) { Double maxSamochodowInc = swiatlo.getDlugoscIncLaneOfLink(l) / dlSamochodu; maxSamochodowInc = Math.ceil(maxSamochodowInc); Double zajetoscInc = incDetector.queryReadLastStepVehicleNumber().get().doubleValue() / maxSamochodowInc; Double maxSamochodowOut = swiatlo.getDlugoscOutLaneOfLink(l) / dlSamochodu; maxSamochodowOut = Math.ceil(maxSamochodowOut); Double zajetoscOut = outDetector.queryReadLastStepVehicleNumber().get().doubleValue() / maxSamochodowOut; if (zajetoscOut > 1.0) { zajetoscOut = 1.0; } if (zajetoscInc > 1.0) { zajetoscInc = 1.0; } zajetoscInc *= 100; zajetoscOut *= 100; int czas = swiatlo.getCzasyTrwaniaSwiatla(l); Double koniecznoscZmiany = wnioskowaczRL.Wnioskuj(zajetoscInc, zajetoscOut, Integer.valueOf(czas).doubleValue()); System.out.println(""); koniecznoscZmianyDlaKombinacji[k] += koniecznoscZmiany; } } } } System.out.println(" Koniecznosc zmiany dla kombinacji :" + Integer.valueOf(k).toString() + koniecznoscZmianyDlaKombinacji[k].toString()); } int maxIndex = 0; Double maxValue = 0.0; for (int o = 0; o < koniecznoscZmianyDlaKombinacji.length; o++) { if (koniecznoscZmianyDlaKombinacji[o] > maxValue) { maxIndex = o;

maxValue = koniecznoscZmianyDlaKombinacji[o]; } } System.out.println("Najelpsza kombinacja to: " + Integer.valueOf(maxIndex).toString()); if (maxIndex != swiatlo.getAktualnyIndex()) { swiatlo.updateLights(maxIndex); } else { swiatlo.updateLights(swiatlo.getAktualnyIndex()); } LightState[] ls = new LightState[tl.getReadCurrentStateQuery().get().lightStates.length]; String swiatla = swiatlo.getLights(); for (int i = 0; i < tl.getReadCurrentStateQuery().get().lightStates.length; i++) { switch (swiatla.charAt(i)) { case 'g': ls[i] = LightState.GREEN; break; case 'r': ls[i] = LightState.RED; break; case 'y': ls[i] = LightState.YELLOW; break; } } TLState tls = new TLState(ls); ChangeLightsStateQuery q = tl.getChangeLightsStateQuery(); q.setValue(tls); q.run(); //tylko testowo } return 0; }

8.4. Opis GUI Fuzzy Traffic Light Controller Gwne okno programu Fuzzy Traffic Light Controller zawiera zestaw zakadek oraz menu umoliwiajcych jego pene wykorzystanie. Struktura menu: Plik Koniec - umoliwia zakoczenie programu (rys. 17)

Rys. 17. Fuzzy Traffic Controll - menu Plik

SUMO Otwrz plik konfiguracji - pozwala na wskazanie pliku konfiguracyjnego dla SUMO GUI (rys. 18) SUMO Wska lokalizacj SUMO - pozwala na wskazanie zmodyfikowanego pliku wykonywalnego symulatora SUMO - wersja oficjalna nie bdzie funkcjonowaa poprawnie - (rys. 18)

Rys. 18. Fuzzy Traffic Controll - menu SUMO

Logika rozmyta Otwrz plik logiki Red light - pozwala na wskazanie pliku logiki rozmytej dla nieaktywnej kombinacji wiate (rys. 19) Logika rozmyta Otwrz plik logiki Green light - pozwala na wskazanie pliku logiki rozmytej dla aktywnej kombinacji wiate (rys. 19)

Rys. 19. Fuzzy Traffic Controll - menu Logika rozmyta

Pomoc O programie - wywietla informacje o programie - kontakt z autorem

Log systemowy, program zosta wyposaony w pole klasy JTextEdit penicy funkcje konsoli do ktrej przekierowane s strumienie wyjciowe. W konsoli ukazywane s komunikaty o wykonanych czynnociach, informacje diagnostyczne, oraz wyjtki o ile wystpuj. Widok konsoli zosta ukazany na rys. 20.

Rys. 20. Fuzzy Traffic Controll - konsola diagnostyczna

Gwne okno programu zawiera kilka zakadek, kada zakadka oferuje pewien zakres funkcjonalnoci programu. Zakadka SUMO, dostarcza informacji o statusie wczytanych plikw konfiguracyjnych, wskazaniu pliku wykonywalnego sumo-gui.exe. Pozwala na rozpoczcie, zatrzymanie, wznowienie symulacji, oraz pozwala zdefiniowa krok z jakim bdzie si odbywaa symulacja. Widok zakadki SUMO zosta przedstawiony na rys. 22.

Rys. 22. Fuzzy Traffic Controll - zakadka SUMO

Zakadka wiata jest odpowiedzialna za wywietlanie aktualnego stanu sygnalizacji wietlnej dla aktualnie uruchomionej symulacji. Umoliwia wybr trybu sterownia dla danego skrzyowania. Zaadowanie plikw kombinacji sygnalizacji wietlnej oraz umoliwia rczn kontrol sygnalizacji wietlnej. Widok zakadki wiata zosta przedstawiony na rys. 23. Zaznaczanie opcji manual powoduje przeczanie trybu sterownia na rczny - zmiana wiate jest moliwa poprzez kliknicie na symbol reprezentujcy dane wiato. Wybranie trybu Fuzzy, spowoduje wywietlenie dania wskazania pliku kombinacji opisywanego w rozdziale 6.2. Zmiana kombinacji obrazowana jest przez zmian odpowiedniego kwadratu. Numeracja sygnalizacji jest zgodna z numeracj przedstawion w rozdziale 4.5. Kade skrzyowa jest opisane nazw znajdujc si powyej kwadratw reprezentujcych wiata.

Rys. 23. Fuzzy Traffic Controll - zakadka SUMO

Zakadka Fuzzy informuje o stanie, oraz poprawnoci zaadowanych plikw logiki rozmytej. Umoliwia rwnie wywietlenie wykresw logiki rozmytej po zaznaczeniu odpowiedniego JCheckBox. Widok zakadki wiata zosta przedstawiony na rys. 24.

Rys. 24. Fuzzy Traffic Controll - zakadka Fuzzy

Zaznaczenie odpowiedniego JCheckBox powoduje wywietlenie wykresw zbiorw rozmytych w nowo otwartych oknach zgodnie z rys. 25.

Rys. 25. Fuzzy Traffic Controll - wizualizacja zbiorw rozmytych

Zakadka Fuzzy Red light tester oraz Fuzzy Green light tester umoliwiaj przeprowadzenie testw zasad logiki rozmytej zdefiniowanych w zaadowanych plikach logiki rozmytej. Parametry wejciowe obu FIS zostay szczegowo opisane w rozdziale 6. Obliczona warto jest umieszczana w odpowiednim polu tekstowym, na yczenie uytkownika (poprzez zaznaczanie odpowiedniego pola JCheckBox) wywietlany jest rysunek obrazujcy dokonane wnioskowanie rozmyte (figur powsta w jego wyniku). Oba okna zostay ukazane na rysunkach 26 oraz 27. figury wynikowe s natomiast zawarte jako 2 ostatnie okna na rysunku 25.

Rys. 26. Fuzzy Traffic Controll - testowanie logiki rozmytej dla kombinacji aktualnie nieaktywnej

Rys. 27. Fuzzy Traffic Controll - testowanie logiki rozmytej dla kombinacji aktualnie aktywnej

Rysunek 28 przedstawia uruchomione sterownie przy uyciu logiki rozmytej dla skrzyowa 0 oraz 1.

Rys. 28. Fuzzy Traffic Controll - Program aktywny obliczajcy optymalne kombinacje przecze dla skrzyowa 1 oraz 0

Na rysunku 29. zostao ukazane okno symulatora SUMO z jednym z skrzyowa kontrolowanych za pomoc logiki rozmytej.

Rys. 29. SUMO - widok skrzyowania kontrolowanego za pomoc logiki rozmytej

Rys. 16. Diagram klas uytych w programie Fuzzy Traffic Controll

You might also like