You are here

Tutorial 5: (Advanced) Setting Up & Using the NACS

Tutorial 5: (Advanced) Setting Up & Using the NACS


 

Setting Up & Performing Reasoning

É apresentado um exemplo para configurar e usar os aspetos básicos do NACS (Non-Action Centered Subsystem), o exemplo é chamado Reasoner – Simple.cs

A Walk-through of the “Simple Reasoner” Task

O primeiro passo é adicionar os namesipaces, neste caso são usados os seguintes namespaces:

using Clarion;
using Clarion.Framework;

O método Main é o seguinte:

 A função InitializeWorld() é a encarregada de inicializar a classe Wolrd com 30 pares dimension-value e a declaração de 5 chunk "padrões" únicos. Estes chunks são especificados assim:

 O seguinte código associa cada valor do array acima apresentado aos valores nos 30 pares dimension-value. É necessário criar um DeclarativeChunk por cada um de

Adding Knowledge to the GKS

Voltando ao método Main o seguinte passo é chamar ao método AddKnowledge que esta localizado na classe Agent:

foreach (DeclarativeChunk dc in chunks)
	reasoner.AddKnowledge(dc);

Este método é usado para adicionar chunks declarativos dentro do GKS do agente. É importante que TODOS os chunks sejam adicionados dentro do GKS.
Também é importante notar que os chunks NUNCA podem ser alterados, por exemplo adicionando ou removendo pares dimension-value, após eles serem incluídos no GKS.

Initializing Associative Memory Networks

O seguinte passo dentro do Main é a inicialização de uma rede tipo Hopfiel:

HopfieldNetwork net = AgentInitializer.InitializeAssociativeMemoryNetwork (reasoner, HopfieldNetwork.Factory);
net.Nodes.AddRange(dvs);
reasoner.Commit(net);

As anteriores linhas são usadas para inicializar a HopfieldNetwork no nível inferior do NACS. Inicializar uma rede tipo Hopfield é um pouco diferente a inicializar uma rede tipo “feed-forward”.
Os elementos na HopfieldNetwork são adicionados como uma coleção de nodos e não de camadas de entrada e saída.

Uma vez a rede HopfieldNetwork seja configurada é necessário introduzir nela algum conhecimento. As redes de memoria auto-associativa trabalhar "reconstruindo" conhecimento codificado (ou padrões) dada uma "entrada" parcial ou ruidosa. No nosso exemplo é desejável codificar os 5 padrões.
O método Encode na classe ImplicitComponentInitializer realiza a maior parte da codificação, a única coisa que deve ser feita para usar o método Encode é especificar o "data sets" que serão codificados.
O seguinte código apresenta como se deve codificar os padrões e como testar a performance da HopfieldNetwork:

 Uma vez que o conhecimento é codificado dentro no nível inferior do NACS, a próxima coisa que se pode fazer é gerar e adicionar as regras associativas no nível superior.

Initializing Associative Rules

Para o exemplo é desejado configurar 5 regras, com a seguinte convenção:

If pattern X, then conclude pattern X + 1

Por exemplo, se a entrada ao nível superior é o DeclarativeChunk que representa o padrão 1, então o nível superior deve concluir que o DeclarativeChunk representa o padrão 2. O seguinte código apresenta como se deve configurar este tipo de regras associativas no nível superior do NACS

 

Performing Reasoning

A ultima coisa que pode ser feita antes de iniciar o processo de raciocino é configurar alguns parâmetros do raciocino. Para o nosso exemplo são estabelecidos os seguintes parâmetros:

reasoner.NACS.Parameters.REASONING_ITERATION_COUNT = 2;
reasoner.NACS.Parameters.CONCLUSION_THRESHOLD = 1;

O primeiro parâmetro especifica que NACS deve fazer 2 iterações antes de entregar a sua conclusão. O segundo parâmetro indica que só se desejam as conclusões que sejam retornadas como "fully activated"

Para iniciar o raciocino só é preciso chamar o método PerformReasoning dentro da classe NACS do agente:

var o = reasoner.NACS.PerformReasoning(si);

O seguinte código mostra como, para o nosso exemplo, pode-se configurar a entrada de padrões, iniciar o raciocino e processar as conclusões:

 Se todo funciona corretamente deve-se ver o seguinte comportamento:

1ra iteraçãp: O nível inferior completará os padrões parciais das entradas
2da iteraço: O nível superior reconhecera as conclusões associadas com o padrão reconstruido do nível inferior e concluira o seguinte padrão.
Conclusões: O chunk conclução de cada iteração.

Por exemplo, se a entrada é baseada numa reconstrução parcial do padrão 1, as conclusões do raciocínio deveriam ser chunks declarativos associados aos padrões 1 e 2.

Finalmente, como sempre é necessário matar ao agente:

reasoner.Die();

A saída do programa executado é apresentada a seguir:

...

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer