Najprostszym rodzajem agenta jest prosty środek odruchowy. Agenci ci wybierają działania na podstawie bieżącego perceptu, ignorując resztę historii percepcji. Na przykład, czynnik próżniowy, którego funkcję agenta przedstawiono w tabeli na rysunku 2.3, jest prostym czynnikiem odruchowym, ponieważ jego decyzja opiera się tylko na bieżącej lokalizacji i na tym, czy ta lokalizacja zawiera brud. Program agenta dla tego agenta pokazano tu
funkcja REFLEX-VACUUM-AGENT([lokalizacja,stan]) zwraca akcję
jeśli status = Brudny, to zwróć Ssanie
w przeciwnym razie, jeśli lokalizacja = A, następnie zwróć w prawo
w przeciwnym razie, jeśli lokalizacja = B, następnie wróć w lewo
Zauważ, że program odkurzania jest rzeczywiście bardzo mały w porównaniu z odpowiednią tabelą. Najbardziej oczywista redukcja wynika z ignorowania historii percepcji, co zmniejsza liczbę odpowiednich sekwencji percepcji z zaledwie do 4. Kolejna niewielka redukcja wynika z faktu, że gdy bieżący kwadrat jest brudny, akcja nie zależy od lokalizacji . Chociaż napisaliśmy program agenta przy użyciu instrukcji if-then-else, jest on na tyle prosty, że można go również zaimplementować jako obwód logiczny. Proste zachowania odruchowe występują nawet w bardziej złożonych środowiskach. Wyobraź sobie, że jesteś kierowcą zautomatyzowanej taksówki. Jeśli samochód z przodu hamuje i zapalają się jego światła stopu, powinieneś to zauważyć i rozpocząć hamowanie. Innymi słowy, na wejściu wizualnym odbywa się pewne przetwarzanie, aby ustalić stan, który nazywamy „Samochód z przodu hamuje”. Następnie uruchamia to pewne nawiązane połączenie w programie agenta z akcją „zainicjuj hamowanie”. Takie połączenie nazywamy regułą warunek-działanie, napisaną, ponieważ ludzie również mają wiele takich połączeń, z których niektóre są wyuczonymi reakcjami (jak w przypadku prowadzenia pojazdu), a niektóre z nich są wrodzonymi odruchami (np. mruganie, gdy coś zbliża się do oka). Program powyższy jest specyficzny dla jednego konkretnego środowiska próżniowego. Bardziej ogólnym i elastycznym podejściem jest najpierw zbudowanie interpretera ogólnego przeznaczenia dla reguł akcji warunkowych, a następnie utworzenie zestawów reguł dla określonych środowisk zadań. Rysunek przedstawia strukturę tego ogólnego programu w formie schematycznej, pokazując, w jaki sposób reguły warunek-akcja pozwalają agentowi na nawiązanie połączenia od perceptu do akcji. Nie martw się, jeśli to wydaje się trywialne; wkrótce robi się ciekawiej.
Program agenta dla powyższego rysunku pokazano tu
Funkcja INTERPRET-INPUT generuje abstrakcyjny opis bieżącego stanu z perceptu, a funkcja RULEMATCH zwraca pierwszą regułę z zestawu reguł, która pasuje do podanego opisu stanu. Zauważ, że opis w terminach „reguły” i „dopasowanie” jest czysto koncepcyjny; jak wspomniano powyżej, rzeczywiste implementacje mogą być tak proste, jak zbiór bramek logicznych realizujących obwód logiczny. Alternatywnie można zastosować obwód „neurowy”, w którym bramki logiczne są zastąpione nieliniowymi jednostkami sztucznych sieci neuronowych. Proste środki odruchowe mają godną podziwu właściwość prostoty, ale mają ograniczoną inteligencję. Agent na rysunku będzie działał tylko wtedy, gdy właściwa decyzja może zostać podjęta na podstawie tylko bieżącej percepcji – to znaczy tylko wtedy, gdy środowisko jest w pełni obserwowalne. Nawet odrobina nieobserwowalności może spowodować poważne kłopoty. Na przykład, podana wcześniej reguła hamowania zakłada, że stan samochodu z przodu hamuje można określić na podstawie aktualnego spostrzeżenia – pojedynczej klatki wideo. Działa to, jeśli samochód z przodu ma centralnie zamontowane (a tym samym jednoznacznie identyfikowalne) światło hamowania. Niestety, starsze modele mają różne konfiguracje tylnych świateł, świateł stopu i kierunkowskazów i nie zawsze można stwierdzić na podstawie jednego obrazu, czy samochód hamuje, czy po prostu ma włączone tylne światła. Prosty środek odruchowy jadący za takim samochodem albo hamowałby ciągle i niepotrzebnie, albo, co gorsza, wcale nie hamował. Podobny problem pojawia się w świecie próżni. Załóżmy, że prosty odruchowy odkurzacz pozbawiony jest czujnika położenia i ma tylko czujnik zanieczyszczenia. Taki agent ma tylko dwa możliwe spostrzeżenia: |Dirty| i |Clean| . Może zrobić |Suck| w odpowiedzi na |Dirty| ; co powinien zrobić w odpowiedzi na |Clean| ? Poruszanie się w Lewo kończy się niepowodzeniem (na zawsze), jeśli zdarzy się, że rozpocznie się na polu A , a poruszenie się w Prawo nie powiedzie (na zawsze), jeśli zacznie się na polu B . Nieskończone pętle są często nieuniknione w przypadku prostych odruchów działających w częściowo obserwowalnych środowiskach. Ucieczka z nieskończonych pętli jest możliwa, jeśli agent może losować swoje działania. Na przykład, jeśli odkurzacz dostrzeże |Clean|, może rzucić monetą, aby wybrać między Prawo i Lewo . Łatwo wykazać, że agent dotrze do drugiego placu średnio w dwóch krokach. Następnie, jeśli ten kwadrat jest brudny, agent go wyczyści i zadanie zostanie ukończone. W związku z tym randomizowany prosty czynnik odruchowy może przewyższać deterministyczny prosty czynnik odruchowy. Wspomnieliśmy, że losowe zachowanie odpowiedniego rodzaju może być racjonalne w niektórych środowiskach wieloagentowych. W środowiskach z jednym agentem randomizacja zwykle nie jest racjonalna. Jest to przydatna sztuczka, która w niektórych sytuacjach pomaga prostemu agentowi odruchowemu, ale w większości przypadków możemy zrobić znacznie lepiej z bardziej wyrafinowanymi agentami deterministycznymi.