BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki

Baza wiedzy











Samomodyfikujący się program cz.2.

16-01-2011 12:00 | pawel.gorczynski
W pierwszej cześci artykułu w wielkim skrócie przedstawiłem działanie przestrzeni nazw System.Codedom. W tej części chciałbym pokazać przykładowe zastosowanie tejże. Konkretnie zaimlementujemy przy jej pomocy prosty system uczący się i tym samym modyfikujący w trakcie działania własny kod decyzyjny.

W pierwszej cześci artykułu (http://www.codeguru.pl/Articles/14465.aspx) w wielkim skrócie przedstawiłem działanie przestrzeni nazw System.Codedom. W tej części chciałbym pokazać przykładowe jej zastosowanie.

Konkretnie zaimlementujemy przy jej pomocy prosty system uczący się i tym samym modyfikujący w trakcie działania własny kod decyzyjny.

Aby to zilustrować napisałem prosty symulator: mysz biegająca losowo po planszy, która w trakcie swojego życia napotyka na obiekty innych typów (aktualnie są to: koty, sery i drzewa). Interakcja z tym obiektami może skończyć się na jeden z 3 możliwych sposobów: śmiercią myszy (negatywnie), najedzeniem się jej (pozytywnie) lub neutralnie.

Mysz posiada własne pole widzenia. Gdy zauważy ona jakiś obiekt, system decyzyjny na podstawie zadanych kryteriów (aktualnie tylko na podstawie typu tego obiektu), podejmuje jedno z 3 działań: udanie się do obiektu, ucieczka lub zignorowanie obiektu.

W początkowym stadium działania mysz nie posiada wyuczonych żadnych informacji. Ponieważ nasza mysz jest wyjątkowo ciekawska, więc niezależnie od typu zauważonego obiektu, udaje się w jego kierunku. Ilustruje to początkowa implementacja metody Decide interfejsu IDecisionSystem:

public Decision Decide(Actor actor)
{
   
return Decision.Go;
}

W efekcie takiej decyzji mysz prawdopodobnie wejdzie w interakcję z obiektem, który zauważyła. Wynik tej interakcji zostanie przekazany do klasy TeachingSystem, która wygeneruje nową implementację interfejsu decyzyjnego:

public IDecisionSystem Learn(Actor actor, InteractionResult interactionResult)
{
   
Decision decision;

    switch
(interactionResult)
   
{
       
case InteractionResult.Ok:
            decision = Decision.Go;
            
break;
        
case InteractionResult.Neutral:
            
decision = Decision.Ignore;
            
break;
        
case InteractionResult.Death:
            
decision = Decision.Run;
            
break;
        
default:
            
throw new InvalidOperationException("unknown interaction result: " + interactionResult);
    
}

    
CreateReactionCondition(actor, decision);
    
compiledSystem = CompileAndLoadType();
    
return compiledSystem;
}

W ten sposób kod decyzyjny będzie się zmieniać tak długo, jak długo mysz będzie napotykać nie znane wcześniej rodzaje obiektów, czego efekty można obserwować na odpowiednich zakładkach w oknie aplikacji. Warto w tym miejscu odnotować fakt, że w tym przypadku generowanie kodu w językach C# / VB jest tylko niejako fajerwerkiem, gdyż kompilacji (i załadowaniu) poddawane jest samo, stworzone dynamiczne, drzewo codedom (a nie wygenerowany z niego kod).

Sama aplikacja umożliwa dodatkowo modyfikowanie niektórych parametrów symulacji w trakcie jej działania, co pozwala lepiej kontrolować jej przebieg (ostatnia zakładka).

Znanych jest też kilka ułomności, między innymi stan „paniki”, kiedy kot znajduje się w zasięgu widzenia myszy i ta zaczyna biegać w tą i z powrotem. Efekt ten można wyeliminować implementując odpowiednią maszynę stanową, ale to już temat na odrębny artykuł.

Załączniki:

http://codeguru.pl/Data/Publications/Articles/Applications/17454/CodeDom2.zip

Bibliografia:

http://msdn.microsoft.com/en-us/library/system.codedom.aspx

Kontrolka DataGridColorPicker:

http://www.codeproject.com/KB/grid/DataGridColorPicker.aspx

 

Podobne artykuły

Komentarze 0

pkt.

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.