Tutorial 4: Intermediate MS & MCS Setup
Setting Up and Using Drives and Meta-Cognitive Modules
Existe uma relação muito próxima entre o conceito de drive e o conceito de meta-cognitive modules. É por isso que neste tutorial será apresentado o conceito do drive (que é uma parte do nível inferior dentro do Motivacional Subsystem) e logo depois o conceito de modulo meta-cognitivo
Initializing a Drive
Para começar é importante notar que o objeto drive é considerado uma "forma especial" de um objeto funcional dentro da biblioteca do Clarion. O objeto derive não deriva da classe ClarionComponent senão da classe ImplicitComponent que é basicamente um wrapper da primeira mas que contem algumas funcionalidades próprias do drive.
A biblioteca do Clarion já vem com todos drives primários que estão na especificação técnica. Eles estão definidos como classes e o nome da classe segui a seguinte convenção:
PrimaryDriveNameDrive
Por exemplo, o nome das classes para a food drive e a dominance and power drive são “FoodDrive” e “DominancePowerDrive” respetivamente. Os drivers são inicializados com o método InitializeDrive dentro na classe AgentInitializer. Por exemplo, o seguinte código inicializa o drive FoodDrive no agente John:
FoodDrive food = AgentInitializer.InitializeDrive(John, FoodDrive.Factory, .5);
Os driver estão planejados para que pertençam a uma das seguintes categorias do nível inferior do MS:
- Approach drives (BAS drives)
- Avoidance drives (BIS drives)
- “Ambos” drives (ou seja orientado às duas : approach e avoidance)
- “Unspecified” drive types (ou seja não fazem parte de nenhuma das duas anteriores ou seu comportamento não tem sido especificado)
Em geral o tipo de categoria é definido automaticamente no construtor da classe, mas é possível mudar o tipo quando ele é inicializado, para fazer isso:
FoodDrive foodDrive = AgentInitializer.InitializeDrive(John, FoodDrive.Factory, .5, MotivationalSubsystem.DriveGroupSpecifications.BOTH);
The Drive Equation
A próxima coisa que a gente precisa fazer é inicializar o ImplicitComponent dentro do FoodDrive. Aqui será utilizado um componente chamado DriveEquation. O autor recomenda que este componente seja utilizado só quando se este testando o agente e depois deve ser trocado por um componente mais sofisticado, como uma rede neural.
As seguintes linhas de código apresentam como é possível configurar um objeto DriveEquation dentro do FoodDrive do agente John:
DriveEquation
foodEq =AgentInitializer.InitializeDriveComponent(foodDrive, DriveEquation.Factory);
A equação é inicializada chamando o método InitializeDriveComponent localizado dentro de InitializeDriveComponent. A classe DriveEquation utiliza a seguinte equação para calcular a força do drive:
As variáveis dentro da equação podem ser modificadas dentro dos parâmetros da suas respectivas classes, assim, por exemplo as variáveis UNIVERSAL_GAIN, DRIVE_GAIN, e BASE_LINE fazem parte da classe parâmetros do drive e a variável SYSTEM_GAIN faz parte da classe parâmetros do Motivational Subsystem.
A geração de pares dimension-value pode ser facilmente geradas chamando o método GenerateTypicalInputs o qual é um método estático da classe Drive.
Quando uma instancia de DriveEquation é inicializada usando AgentInitializer, varias coisas são configuradas automaticamente
Finalmente uma vez que a inicialização de ImplicitComponent acabou deve-se realizar o commit para o Drive e para o agente:
foodDrive.Commit(foodEq);
John.Commit(foodDrive);
Stimulating a Drive
Quando são usadas somente as "entradas tipicas", só é necessário especificar a ativação da entrada STIMULUS. O seguinte código apresenta como pode-se especificar o STIMULUS da FoodDrive numa informação do sensor (gerada durante a execução de uma tarefa):
si = World.NewSensoryInformation(John);
si[typeof(FoodDrive), FoodDrive.MetaInfoReservations.STIMULUS] = 1;
... //Elided initialization of other aspects of the sensory information
John.Perceive(si);
... //Elided code for running the rest of the task
É importante destacar do código anterior que não é necessário "adicionar" STIMULUS ao objeto SensoryInformation, isto é porque o método NewSensoryInformation automaticamente enche o objeto SensoryInformation com toda a meta informação do agente (que inclui as drive inputs e outputs)
Para poder utilizar os drivers é necessário implementar um dos módulos meta cognitivos os quais atuarão com base a estes drivers
Initializing a Meta-Cognitive Module
Desde o ponto de vista operacional, o MCS atua da mesma forma do que um pequeno ACS, só que as ações no modulo meta cognitivo são manipuladas diretamente através dos aspectos internos do agente (como os objetivos dentro da estrutura de objetivos, parâmetros dentro do subsistema etc). Um modulo meta cognitivo pode ser composto por qualquer combinação de instancias de ImplicitComponent para o nível inferior e instancias de RefineableActionRule no nível superior. Uma diferença com o módulo ACS é que no MCS não são usadas as instancias de FixedRule no nível superior e as ações recomendadas do nível superior e inferior são combinadas.
O processo de configurar o modulo meta cognitivo é similar ao de inicializar um drive. Aqui será utilizado um modulo muito comum chamado GoalSelectionModule. O código de embaixo apresenta como inicializar este modulo em John.
GoalSelectionModule gsm = AgentInitializer.InitializeMetaCognitiveModule (John, GoalSelectionModule.Factory);
Após inicializado o modulo pode-se encher com componentes implícitos e regras. É possível inicializar estes componentes chamado os métodos InitializeMetaCognitiveDecisionNetwork ou InitializeMetaCognitiveActionRule; eles estão na classe AgentInitializer. Aqui é apresentado como é possível inicializar a GoalSelectionEquation dentro do nível inferior de GoalSelectionModule:
GoalSelectionEquation gse = AgentInitializer.InitializeMetaCognitiveDecisionNetwork(gsm, GoalSelectionEquation.Factory);
The Goal Selection Equation
Lembrando que o nível inferior do MS é o encargado de determinar a "força" de um drive baseado na combinação de estímulos que vem da informação sensorial assim como de outas variáveis (ganhos, déficit, etc). Por exemplo, a GoalSelectionEquation combina a "força" do drive com outras informações descritivas do mundo, e faz uma recomendação do objetivo à estrutura de objetivos baseada na seguinte equação:
A primeira metade da equação relaciona especificamente a "força" do drive. Nesta parte são somadas todas as "forças" dos drives. Além de isso tem-se um fator de peso que é aplicado a cada drive, ele especifica a relevância que cada drive tem com relação ao objetivo. A segunda parte da equação é muito parecida à primeira só que ela aplica o processo a os objetos descritivos do mundo que sejam relevantes ao objetivo. A saída da equação é a "força" do objetivo, o valor para estabelecer o objetivo dentro da estrutura de objetivos.
Correlating Drives and Meta-Cognitive Modules
A entrada do GoalSelectionEquation podem ser qualquer número de pares dimension-value com os pesos dos drive, mas a camada de saída só pode ter uma ação de atualização da estrutura de objetivos. Lembrando do tutorial passado que a classe GoalStructureUpdateActionChunk é usada para estabelecer ou eliminar objetivos dentro da estrutura de objetivos (GoalStructure). A GoalStructureUpdateActionChunk é a que possibilita que GoalSelectionModule atualize a estrutura de objetivos (GoalStructure).
Assim uma vez que a GoalSelectionEquation é configurada dentro da GoalSelectionModule, ela é usada para calcular a "força" do objetivo. Depois o GoalSelectionModule é usado para selecionar a GoalStructureUpdateActionChunk. O objetivo associado a essa ação é adicionado ou removido da estrutura de objetivos (GoalStructure).
Vamos a fazer um exemplo demostrando o processo de configurar o GoalSelectionModule. Este exemplo relaciona o FoodDrive a um GoalStructureUpdateActionChunk que resetea a estrutura de objetivos e depois estabelece o objetivo g na estrutura de objetivos do agente John. A primeira linha do exemple é:
gse.Input.Add(foodDrive.GetDriveStrength());
Esta linha adiciona o par dimension-value com a informação da "força" do drive do FoodDrive à camada de entrada da GoalSelectionEquation que já foi inicializada. As próximas três linhas inicializa a GoalStructureUpdateActionChunk que estabelece o objetivo g na estrutura de objetivos e é adicionado à camada de saída da GoalSelectionEquation:
GoalStructureUpdateActionChunk gAct = World.NewGoalStructureUpdateActionChunk();
gAct.Add(GoalStructure.RecognizedActions.SET_RESET, g);
gse.Output.Add(gAct);
Após a camada de entrada e de saída são configuradas é necessário especificar a relevância de cada entrada para cada saída. Para fazer isso se segui a seguinte convenção:
SomeGoalSelectionEquation.SetRelevance(SomeGoalStructureUpdateActionChunk, SomeDrive or SomeWorldObject, SomeRelevanceValue);
Para relacionar a FoodDrive com o GoalStructureUpdateActionChunk no nosso exemplo o código será:
gse.SetRelevance(gAct, foodDrive, 1);
Finalmente uma vez a configuração do componente é completa é necessário adiciona-lo ao modulo, e o modulo ao agente:
gsm.Commit(gse);
John.Commit(gsm);
Meta-Cognitive Module Integration
Em geral, após configurar e adicionar todos os componente ao modulo ele automaticamente integra todo dentro do processo interno do agente. Não é necessário fazer mais nada. Sem embargo o Clarion permite ver o funcionamento interno se é desejado.
Por exemplo a saída do agente John para sua informação sensorial é assim: