<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe%2F%C4%86wiczenia_13</id>
	<title>Uczenie maszynowe i sztuczne sieci neuronowe/Ćwiczenia 13 - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe%2F%C4%86wiczenia_13"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/%C4%86wiczenia_13&amp;action=history"/>
	<updated>2026-04-25T15:30:16Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/%C4%86wiczenia_13&amp;diff=856&amp;oldid=prev</id>
		<title>Jarekz: /* Agent */</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/%C4%86wiczenia_13&amp;diff=856&amp;oldid=prev"/>
		<updated>2015-05-21T19:01:10Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Agent&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Wersja z 19:01, 21 maj 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l75&quot; &gt;Linia 75:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 75:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* kontrolera (controller), który odpowiada za wykonywanie strategii, czyli mapowanie stanów na akcje.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* kontrolera (controller), który odpowiada za wykonywanie strategii, czyli mapowanie stanów na akcje.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* algorytmu uczącego (learner), który modyfikuje parametry agenta.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* algorytmu uczącego (learner), który modyfikuje parametry agenta.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* eksploratora, który w [[&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;STAT:&lt;/del&gt;Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład_11#Estymowanie_modelu_dla_MDP|fazie symulacji]] eksploruje stany.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* eksploratora, który w [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład_11#Estymowanie_modelu_dla_MDP|fazie symulacji]] eksploruje stany.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Kontrolerowi podajemy tablice wartości dla każdego stanu i możliwej akcji. W naszym przypadku rozmiar tablicy to 81(stanów) x 4(możliwe akcje). Tablicę inicjujemy wartościami 1.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Kontrolerowi podajemy tablice wartości dla każdego stanu i możliwej akcji. W naszym przypadku rozmiar tablicy to 81(stanów) x 4(możliwe akcje). Tablicę inicjujemy wartościami 1.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/%C4%86wiczenia_13&amp;diff=855&amp;oldid=prev</id>
		<title>Jarekz: /* Środowisko */</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/%C4%86wiczenia_13&amp;diff=855&amp;oldid=prev"/>
		<updated>2015-05-21T19:00:56Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Środowisko&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Wersja z 19:00, 21 maj 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l61&quot; &gt;Linia 61:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 61:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Drugi argument to współrzędne pola, które ma być celem agenta.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Drugi argument to współrzędne pola, które ma być celem agenta.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Ogólnie, Maze służy do wytwarzania dwuwymiarowych labiryntów, w których możliwe pozycje to stany [[&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;STAT:&lt;/del&gt;Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład_11#Proces_decyzyjny_Markowa|MDP]].&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Ogólnie, Maze służy do wytwarzania dwuwymiarowych labiryntów, w których możliwe pozycje to stany [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład_11#Proces_decyzyjny_Markowa|MDP]].&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Każdy ze stanów może byc potencjalnym stanem startowym (poza stanem, który jest celem). Labirynt może mieć stany absorbujące, czyli takie z których jeśli agent w nie wpadnie to zadanie się kończy (domyślnie jest to stan celu, ale na wykładzie mieliśmy też przykład z negatywnym stanem absorbującym).  &lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Każdy ze stanów może byc potencjalnym stanem startowym (poza stanem, który jest celem). Labirynt może mieć stany absorbujące, czyli takie z których jeśli agent w nie wpadnie to zadanie się kończy (domyślnie jest to stan celu, ale na wykładzie mieliśmy też przykład z negatywnym stanem absorbującym).  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l67&quot; &gt;Linia 67:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 67:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Enviroment dostaje wejścia poprzez metodę &amp;lt;tt&amp;gt; performAction()&amp;lt;/tt&amp;gt; i zwraca wyjście przez metodę &amp;lt;tt&amp;gt;getSensors()&amp;lt;/tt&amp;gt;.  &lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Enviroment dostaje wejścia poprzez metodę &amp;lt;tt&amp;gt; performAction()&amp;lt;/tt&amp;gt; i zwraca wyjście przez metodę &amp;lt;tt&amp;gt;getSensors()&amp;lt;/tt&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Agent ==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Agent ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/%C4%86wiczenia_13&amp;diff=853&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot;=Wstęp= Uczenie ze wzmocnieniem (reinforcement learning RL) odbywa się przez interakcję kilku elementów:   Plik:Rl.png|thumb| 400px|Ilustracja zależności pomięd...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/%C4%86wiczenia_13&amp;diff=853&amp;oldid=prev"/>
		<updated>2015-05-21T18:59:45Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;=Wstęp= Uczenie ze wzmocnieniem (reinforcement learning RL) odbywa się przez interakcję kilku elementów:   Plik:Rl.png|thumb| 400px|Ilustracja zależności pomięd...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Wstęp=&lt;br /&gt;
Uczenie ze wzmocnieniem (reinforcement learning RL) odbywa się przez interakcję kilku elementów: &lt;br /&gt;
&lt;br /&gt;
[[Plik:Rl.png|thumb| 400px|Ilustracja zależności pomiędzy obiektami wykorzystywanymi w uczeniu ze wzmocnieniem w PyBrain]]&lt;br /&gt;
* Enviroment (środowisko)&lt;br /&gt;
* Task (zadanie)&lt;br /&gt;
* Agent&lt;br /&gt;
&lt;br /&gt;
Enviroment dostarcza agentowi obsrewacji, a agent wykonuje akcje, które oddziaływują na środowisko; Task wraz z Enviroment dostarcza agentowi nagród. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Tutorial=&lt;br /&gt;
Poniższy tutorial pokaże jak zrealizować uczenie ze wzmocnieniem dla zadania poruszania się w labiryncie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Import modułów==&lt;br /&gt;
Na początek musimy zaimportować odpowiednie moduły:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import matplotlib&lt;br /&gt;
matplotlib.use('TkAgg')&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys, time&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
from pybrain.rl.environments.mazes import Maze, MDPMazeTask&lt;br /&gt;
from pybrain.rl.learners.valuebased import ActionValueTable&lt;br /&gt;
from pybrain.rl.agents import LearningAgent&lt;br /&gt;
from pybrain.rl.learners import Q, SARSA&lt;br /&gt;
from pybrain.rl.experiments import Experiment&lt;br /&gt;
from pybrain.rl.environments import Task&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Środowisko==&lt;br /&gt;
&lt;br /&gt;
Enviroment to świat, w którym działa Agent. Różne środowiska są zaimplementowane w modułąch znajdujących się w &lt;br /&gt;
 pybrain/rl/environments&lt;br /&gt;
&lt;br /&gt;
W tym przykładzie posłóżymy się środowiskiem w postaci labiryntu. Opisuje się go za pomocą dwuwymiarowej tablicy, w której 1 oznacza ścianę a 0 wolną przestrzeń. Poniższa tablica definiuje przykładowy labirynt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
structure = array([[1, 1, 1, 1, 1, 1, 1, 1, 1],&lt;br /&gt;
                   [1, 0, 0, 1, 0, 0, 0, 0, 1],&lt;br /&gt;
                   [1, 0, 0, 1, 0, 0, 1, 0, 1],&lt;br /&gt;
                   [1, 0, 0, 1, 0, 0, 1, 0, 1],&lt;br /&gt;
                   [1, 0, 0, 1, 0, 1, 1, 0, 1],&lt;br /&gt;
                   [1, 0, 0, 0, 0, 0, 1, 0, 1],&lt;br /&gt;
                   [1, 1, 1, 1, 1, 1, 1, 0, 1],&lt;br /&gt;
                   [1, 0, 0, 0, 0, 0, 0, 0, 1],&lt;br /&gt;
                   [1, 1, 1, 1, 1, 1, 1, 1, 1]])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Można przerobić go na obiekt środowiska w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
environment = Maze(structure, (7, 7))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Drugi argument to współrzędne pola, które ma być celem agenta.&lt;br /&gt;
&lt;br /&gt;
Ogólnie, Maze służy do wytwarzania dwuwymiarowych labiryntów, w których możliwe pozycje to stany [[STAT:Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład_11#Proces_decyzyjny_Markowa|MDP]].&lt;br /&gt;
Każdy ze stanów może byc potencjalnym stanem startowym (poza stanem, który jest celem). Labirynt może mieć stany absorbujące, czyli takie z których jeśli agent w nie wpadnie to zadanie się kończy (domyślnie jest to stan celu, ale na wykładzie mieliśmy też przykład z negatywnym stanem absorbującym). &lt;br /&gt;
&lt;br /&gt;
Po labiryncie wędruje jeden agent. Agent może poruszać się za pomocą akcji A={N,E,S,W}. Ruch w kierunku ściany nie powoduje zmiany stanu. Każdy stan dostarcza nagrody za znalezienie się w nim. Domyślnie jest ona równa 1 dla stanu będącego celem i 0 dla wszystkich pozostałych. Zarówno obserwacje jak i akcje mogą być stochastyczne.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enviroment dostaje wejścia poprzez metodę &amp;lt;tt&amp;gt; performAction()&amp;lt;/tt&amp;gt; i zwraca wyjście przez metodę &amp;lt;tt&amp;gt;getSensors()&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
==Agent ==&lt;br /&gt;
Agent jest obiektem, w którym zachodzi uczenie. Odziaływuje ze środowiskiem za pośrednictwem metod &amp;lt;tt&amp;gt;getAction()&amp;lt;/tt&amp;gt; i &amp;lt;tt&amp;gt;integrateObservations()&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Agent składa się z trzech głównych części:&lt;br /&gt;
* kontrolera (controller), który odpowiada za wykonywanie strategii, czyli mapowanie stanów na akcje.&lt;br /&gt;
* algorytmu uczącego (learner), który modyfikuje parametry agenta.&lt;br /&gt;
* eksploratora, który w [[STAT:Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład_11#Estymowanie_modelu_dla_MDP|fazie symulacji]] eksploruje stany.&lt;br /&gt;
&lt;br /&gt;
Kontrolerowi podajemy tablice wartości dla każdego stanu i możliwej akcji. W naszym przypadku rozmiar tablicy to 81(stanów) x 4(możliwe akcje). Tablicę inicjujemy wartościami 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
controller = ActionValueTable(81, 4)&lt;br /&gt;
controller.initialize(1.)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teraz wytwarzamy instancję algorytmu uczącego:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
learner = Q()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ostatecznie wytwarzamy agenta wyposażając go w przygotowany kontroler i algorytm uczący:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
agent = LearningAgent(controller, learner)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie i eksperyment==&lt;br /&gt;
Jak na razie nie ma połączenia pomiędzy agentem a środowiskiem. Elementem pozwalającym na powiązanie agenta i środowiska jest zadanie: '''task'''.  Obiekt &amp;lt;tt&amp;gt;task&amp;lt;/tt&amp;gt; określa także jaki jest cel agenta i jakie nagrody dostaje. &lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
task = MDPMazeTask(environment)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ostatecznie zadanie i agent łączone są poprzez eksperyment:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
experiment = Experiment(task, agent)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Przełączamy grafikę w tryb interaktywny, żeby móc podglądać postepy algorytmu.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
py.gray()&lt;br /&gt;
py.ion()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teraz można uruchomić eksperyment np. na 50 iteracji. W każdej iteracji agent będzie oddziaływał ze środowiskiem wskazaną ilość razy, tzn. agent będzie wykonywał jakieś akcje, które &amp;lt;tt&amp;gt;task&amp;lt;/tt&amp;gt; przekaże do środowiska. Środowisko odpowie nowym stanem, który za pośrednictwem &amp;lt;tt&amp;gt;taska&amp;lt;/tt&amp;gt;   zostanie zwrócony agentowi. Po zakończeniu symulacji na podstawie zgromadzonych danych agent będzie się uczył.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
for i in range(50):&lt;br /&gt;
    experiment.doInteractions(100)&lt;br /&gt;
    agent.learn()&lt;br /&gt;
    agent.reset()&lt;br /&gt;
&lt;br /&gt;
    py.pcolor(controller.params.reshape(81,4).max(1).reshape(9,9))&lt;br /&gt;
    py.draw()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Widoczny w powyższym kodzie reset agenta powoduje, że zapomina on kroki wykonane w poprzedniej symulacji, ale nie resetuje parametrów, które były wyuczone w poprzednich cyklach symulacji. &lt;br /&gt;
&lt;br /&gt;
Dwie ostatnie linie kodu pozwalają na obserwowanie procesu uczenia się agenta. Wizualizują one maksymalne wartości w tablicy wartości, czyli funkcję wartościującą V. W czasie nauki kolory w tablicy będą się zmieniać, ale ostatecznie powinny zbiec do sytuacji, w której pola czym bliższe celowi tym będą miały wartości większe (jaśniejsze).&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu procesu uczenia gotowa strategia wyboru akcji polega na wykonywaniu akcji, które prowadzą do sąsiedniego pola o największej wartości V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najprostszym sposobem na zmianę właściwości poszczególnych elementów MDP jest wykorzystanie dziedziczenia. Np. domyślna funkcja nagrody daje  +1 w stanie docelowym i 0 w pozostałych. Aby to zmienić możemy wykonać następującą podmianę:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
class MyTask(MDPMazeTask):&lt;br /&gt;
    def getReward(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot; compute and return the current reward (i.e. corresponding to the last action performed) &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        if self.env.goal == self.env.perseus:&lt;br /&gt;
            self.env.reset()&lt;br /&gt;
            reward = 1.&lt;br /&gt;
        else:&lt;br /&gt;
            reward = -0.02 &lt;br /&gt;
        return reward&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #def performAction(self, action):&lt;br /&gt;
    #    &amp;quot;&amp;quot;&amp;quot; The action vector is stripped and the only element is cast to integer and given&lt;br /&gt;
    #        to the super class.&lt;br /&gt;
    #    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    #    print action&lt;br /&gt;
    #    Task.performAction(self, int(action[0]))&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
task = MyTask(environment)# MDPMazeTask(environment)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Proszę zaimplementować zadanie labiryntu z ostatniego wykładu i zbadać jak funkcja nagrody wpływa na strategię.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>