Sterownik rozmyty
Systemy Sztucznej Inteligencji Instrukcje do ćwiczeń laboratoryjnych
Zadanie do wykonania (zadanie opcjonalne)
Zadaniem systemu jest sterowanie ruchu wirtualną ciężarówką, która musi dojechać do środkowej części górnej krawędzi pola zwrócona ku górze. Pojazd ten porusza się stale do przodu z niezmienną prędkością wykonując jednocześnie ewentualnie niewielki obrót (skręt). System sztucznej inteligencji ma za zadanie na bazie aktualnego, podanego położenia i zwrotu ciężarówki określić w jaką stronę ma się obrócić jadąc stale do przodu. Dla uproszczenia sterownik nie bierze w tym przypadku pod uwagę poprzedniego stanu ciężarówki, lecz skupia się jedynie na aktualnym stanie pojazdu.
Parametry symulacji
Stałe dotyczące zadania zawarte są w strukturze SymulacjaParametry:
public struct SymulacjaParametry {
public static readonly int x_min = -100, x_max = 100, x_zasieg = 200;
public static readonly int y_min = -100, y_max = 0, y_zasieg = 100;
public static readonly int int rampa_lewy = -30, rampa_prawy = +30, rampa_dol = -10, rampa_gora = 0;
public static readonly int rampa_kat_docelowy_min = -20, rampa_kat_docelowy_max = +20;
public static readonly int obrot_min = -20, obrot_max = +20;
public static readonly int kat_min = -180, kat_max = +180, kat_zasieg = 360;
public static readonly double ruch_skok = 5.0;
}
Wejście
Decyzja na temat ruchu i ewentualnego obrotu dokonywana jest na podstawie aktualnego stanu pojazdu opisanego za pomocą struktury PojazdPolozenie.
public struct PojazdPolozenie {
public int x, y;
public int kat; //-180...+180 stopni
// 0= oznacza zwrot do góry, 90=zwrot w prawo }
Wyjście
Zaimplementowany system ma dla każdego stanu (wejścia) opisanego przez strukturę
PojazdPolozenie zwrócić jedną wartość - obrót (wyjście). Zakres tej zmiennej powinien się mieścić w przedziale [SymulacjaParametry.obrot_min; SymulacjaParametry.obrot_max].
Szczegóły implementacji
Należy użyć projektu SterownikRozmyty_Szablon_projektu. Cały kod odpowiedzialny za sterownik powinien znajdować się w pojedynczym pliku SI.cs. Należy zaimplementować metody SI.inicjuj() oraz SI.zwroc_odpowiedz(…),
• public static void inicjuj() - metoda uruchamiana tylko raz podczas startu programu;
• public static void zwroc_odpowiedz(PojazdPolozenie polozenie, out int obrot) - metoda ma zaimplementować wskazany algorytm sterowania. polozenie - struktura typu
PojazdPolozenie opisuje aktualne położenie ciężarówki. obrot - wartość wyjściowa algorytmu, która powinna zawierać się w przedziale [SymulacjaParametry.obrot_min;
.obrot_max]. Wartość dodatnia oznacza obrót zgodnie z ruchem wskazówek zegara.
Sterownik (Model) rozmyty Takagi-Sugeno
System ten zbudowany jest na bazie reguł, które są w postaci
JEŚLI (wejście_1 jest …) {ORAZ (wejście_2 jest …) ORAZ ...} TO wyjście_1 = … ; {wyjście_2
= …; wyjście_3 = …; ...}
JEŚLI (wejście_1 jest …) {ORAZ (wejście_2 jest …) ORAZ ...} TO wyjście_1 = … ; {wyjście_2
= …; wyjście_3 = …; ...}
…
Część pomiędzy słowem JEŚLI i TO nazwana jest poprzednikiem reguły i jest to część warunkowa reguły. Może ona składać się z co najmniej jednej części składowej rozdzielonej łącznikiem ORAZ.
Kolejna część reguły występuje po słowie TO i nazywana jest następnikiem. Zawiera on wartości jakie powinny zawierać wyjścia, jeśli spełnione będą warunki zawarte w poprzedniku reguły.
Przykład zbioru reguł mających na celu ustawienie się pojazdu w prawą stronę:
JEŚLI (kat jest bardzo_mocno_w_lewo) TO obrot = obrot_max,
JEŚLI (kat jest około_w_lewo) TO obrot = obrot_max, JEŚLI (kat jest około_zero) TO obrot = obrot_max, JEŚLI (kat jest około_w_prawo) TO obrot = 0,
JEŚLI (kat jest bardzo_mocno_w_prawo) TO obrot = obrot_min.
Zbiory rozmyte
Warto zwrócić uwagę, iż użyte symbole w poprzedniku: bardzo_mocno_w_lewo, około_w_lewo itp.
są nieprecyzyjne. Do ich reprezentacji zostaną użyte zbiory rozmyte. Zbiór rozmyty (na przykład A) opisany jest na dowolnej przestrzeni i dla każdego elementu z tej przestrzeni określa stopień przynależności (wartość z przedziału [0; 1]) elementu z tej przestrzeni. Wartość funkcja przynależności elementu x do zbioru rozmytego to μA(x) . Oto wartości funkcji przynależności kilku zbiorów rozmytych:
Zwykle jednak kształt funkcji przynależności zbiorów rozmytych jest bardziej jednolity i uporządkowany. Często stosuje się funkcje Gaussa w postaci μA(x)=e(−(
x−srodek sigma )
2
) , na przykład:
Działanie sterownika
Pierwszą czynności jaką należy wykonać jest wyliczenie stopnia aktywności każdej reguły.
Aby wyliczyć aktywność pojedynczej reguły posiadającej jedną części w poprzedniku, należy jedynie wyliczyć wartość funkcji przynależności odpowiedniego zbioru. W przypadku, gdy poprzednik reguły składa się z kilku części należy wyliczyć wartości funkcji przystosowania dla
poszczególnych części, a aktywacja całej reguły to wartość T-normy z poszczególnych części (zwykle iloczyn albo minimum).
Po wyliczeniu aktywacji każdej z reguł można wyliczyć wartość wyjściową, która jest równa sumie ważonej:
wyjscie1=aktywacjaReguly1∗wyjscie1Reguly1+aktywacjaReguly2∗wyjscie1Reguly2+...
aktywacjaReguly1+aktywacjaReguly2+...
wyjscie2=aktywacjaReguly1∗wyjscie2Reguly1+aktywacjaReguly2∗wyjscie2Reguly2+...
aktywacjaReguly1+aktywacjaReguly2+...
... , w zadanym przykładzie liczba wyjść to 1.
Przykład
Istnieje system, który określa czy pogoda jest dobra do wyjścia na zewnątrz. System tej operuje na (posiada wejścia) temperatura oraz określenie opadu deszczu (w skali [0; 100]). Zadaniem systemu jest zwrot liczby pogoda określającej zadowolenie z pogody w skali [0; 10].
Powstały reguły, które są w postaci
JEŚLI (temperatura jest bardzoNiska) TO pogoda=0;
JEŚLI (temperatura jest niska) ORAZ (opad jest niski) TO pogoda = 3;
JEŚLI (temperatura jest niska) ORAZ (opad jest wysoki) TO pogoda = 0;
JEŚLI (temperatura jest średnia) ORAZ (opad jest niski) TO pogoda = 10;
JEŚLI (temperatura jest średnia) ORAZ (opad jest wysoki) TO pogoda = 1;
JEŚLI (temperatura jest wysoka) TO pogoda = 0;
Warto zwrócić uwagę, że ze zmienną temperatura skojarzone są pojęcia bardzoNiska, niska, średnia, wysoka; natomiast ze zmienną opad pojęcia niski i wysoki. Należy więc skonstruować odpowiednie zbiory rozmyte, na przykład:
Następnie można przejść do testowania systemu.
Załóżmy, iż wejścia systemu to temperatura =19, opad = 20, a do łączenia składników
poprzedników użyta zostanie T-norma iloczyn. W takim przypadku aktywacje poszczególnych reguł to:
• reguła 1. „JEŚLI (temperatura jest bardzoNiska) TO pogoda=0” -
μAtemperatura ,bardzoNiska(temperatura)=0 więc aktywacjaReguly1=0 ;
• reguła 2. „JEŚLI (temperatura jest niska) ORAZ (opad jest niski) TO pogoda = 3” ,
μAtemperatura ,niska(temperatura)=0,1 ; μAopad,niski(opad)=0,8 więc
aktywacjaReguly2=0,1∗0,8=0,08 ;
• reguła 3. „JEŚLI (temperatura jest niska) ORAZ (opad jest wysoki) TO pogoda = 0” - μA
temperatura ,niska(temperatura)=0,1 ; μA
opad,wysoki(opad)=0,2 więc
aktywacjaReguly3=0,1∗0,2=0,02 ;
• reguła 4. „JEŚLI (temperatura jest średnia) ORAZ (opad jest niski) TO pogoda = 10” -
μAtemperatura ,srednia(temperatura)=0,4 ; μAopad,niski(opad)=0,8 więc
aktywacjaReguly4=0,4∗0,8=0,32 ;
• reguła 5. „JEŚLI (temperatura jest średnia) ORAZ (opad jest wysoki) TO pogoda = 1” - μA
temperatura ,srednia(temperatura)=0,4 ; μAopad,wysoki(opad)=0,2 więc
aktywacjaReguly5=0,4∗0,2=0,08 ;
• reguła 6. „JEŚLI (temperatura jest wysoka) TO pogoda = 0” - μA
temperatura ,wysokoa(temperatura)=0 więc aktywacjaReguly6=0 .
Po wyliczeniu aktywacji reguł można wyliczyć wartość wyjścia pogoda stosując sumę ważoną.
Warto przypomnieć, że wartości wyjścia kolejnych reguł to: 0, 3, 0, 10, 1, 0.
pogoda=aktywacjaReguly1∗wyjscieReguly1+aktywacjaReguly2∗wyjscieReguly2+...
aktywacjaReguly1+aktywacjaReguly2+...
pogoda=0∗0+0,08∗3+0,02∗0+0,32∗10+0,08∗1+0∗0 0+0,08+0,02+0,32+0,08+0 =7,04
Podsumowując, dla zadanych reguł wartość określająca przydatność pogody wyniosła 7,04.
Uwagi końcowe
Projekt można zaimplementować stosując różną liczbę reguł oraz zbiorów rozmytych. Dokładne kształty funkcji przynależności zbiorów rozmytych należy dobrać metodą eksperymentalną. Jeśli kiedykolwiek suma aktywacji wszystkich reguł wynosi 0, oznacza to, iż sterownik rozmyty został nieprawidłowo skonstruowany. Przewiduje się 3 poziomy skomplikowania:
1. Algorytm wstępnie przekształca zmienne x, y, kąt, w jedną zmienną nalezyObrocic, która określa o jaki kąt wyrażony w stopniach należy obrócić pojazd, aby był on skierowany w środek górnej części parkingu (w stronę rampy; punktu [0;0] ). Należy wymusić, aby zmienna nalezyObrocic zawierała się w przedziale [-180; 180]. Po przekształceniu zmienna nalezyObrocic jest traktowana jako jedyne wejście sterownika Takagi-Sugeno.
2. Sterownik rozmyty bierze pod uwagę jedynie x oraz kąt. Ta wersja została użyta w działającym przykładzie.
3. Sterownik rozmyty bierze pod uwagę x, y, kąt.