📄 inferenceengine.cpp.svn-base
字号:
/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *//*! \file InferenceEngine.cpp<pre><b>File:</b> InferenceEngine.cpp<b>Project:</b> Robocup Soccer Simulation Team: MecaTeam<b>Authors:</b> Orivaldo Vieira e Augusto Loureiro<b>Created:</b> 10/09/2006<b>Last Revision:</b> $ID$<b>Contents:</b> Este arquivo cont�m a defini��o da classe InferenceEngine. A InferenceEngine � classe que disponibiliza o motor de infer�ncia para um sistema baseado em conhecimento.<hr size=2><h2><b>Changes</b></h2><b>Date</b> <b>Author</b> <b>Comment</b>19/09/2006 Orivaldo Vieira Documenta��o</pre>*/#include "InferenceEngine.h"using namespace std;/*! Construtor vazio, inicializando os ponteiros para a base de fatos e base de regras como nulos */InferenceEngine::InferenceEngine(){ m_ptrFactsBase = NULL; m_ptrRulesBase = NULL;}/*! Este m�todo carrega o ponteiro do motor de infer�ncia com o endere�o da base de fatos. \param _ptrFactsBase apontador para base de fatos */void InferenceEngine::loadFacts (FactsBase* _ptrFactsBase){ m_ptrFactsBase = _ptrFactsBase;}/*! Este m�todo carrega o ponteiro do motor de infer�ncia com o endere�o da base de regras. \param _ptrFactsBase apontador para base de regras */void InferenceEngine::loadRules (RulesBase* _ptrRulesBase){ m_ptrRulesBase = _ptrRulesBase;}string InferenceEngine::getOutputMessage(){ return m_outputMessage;}string InferenceEngine::getLocalGoalCurrent(){ return m_localGoalCurrent;}string InferenceEngine::getLocalGoalStatus(){ return m_localGoalStatus;}/*! Este m�todo configura o motor de infer�ncia a funcionar com apenas um ciclo de infer�ncia. */void InferenceEngine::singleCicle (void){}/*! Este m�todo configura o motor de infer�ncia a funcionar com v�rios ciclso de infer�ncia. */void InferenceEngine::multipleCicle (void) {}/*! M�todo Set para ativar o modo verbose. Dessa forma ser� colocada na sa�da padr�o informa��es sobre o processo de infer�ncia.*/void InferenceEngine::setVerbose (void) {}/*! M�todo Reset para desativar o modo verbose. */void InferenceEngine::resetVerbose (void){}/*! Este m�todo faz o motor de infer�ncia usar apenas uma regra por ciclo de infer�ncia.*/void InferenceEngine::setSingleRule (void){}/*! Este m�todo faz o motor de infer�ncia usar uma ou mais regras por ciclo de infer�ncia.*/void InferenceEngine::resetSingleRule (void){}/*! Este m�todo analisa um filtro de uma regra \param ptrFilter filtro a ser analisado. \return verdadeiro se a opera��o do filtro resultar verdadeiro false caso contr�rio. */bool InferenceEngine::analyseFilter( Filter* ptrFilter ){ switch ( ptrFilter->getOperator() ) { case TOKEN_OPERATOR_EQUAL: return (ptrFilter->getParameter1() == ptrFilter->getParameter2() ); case TOKEN_OPERATOR_NOT_EQUAL: return (ptrFilter->getParameter1() != ptrFilter->getParameter2() ); case TOKEN_OPERATOR_LESS: return (ptrFilter->getParameter1() < ptrFilter->getParameter2() ); case TOKEN_OPERATOR_LESS_EQUAL: return (ptrFilter->getParameter1() <= ptrFilter->getParameter2() ); case TOKEN_OPERATOR_GREATER: return (ptrFilter->getParameter1() > ptrFilter->getParameter2() ); case TOKEN_OPERATOR_GREATER_EQUAL: return (ptrFilter->getParameter1() >= ptrFilter->getParameter2() ); } return false;}/*! Este m�todo � o mais importante do motor de infer�ncia. � aqui onde � feito o processo de infer�cia usando a base de fatos e de regras. Este processo consiste em consultar a base de fatos de acordo com o lado esquerdo de cada regra. Caso o resultado das consultas seja verdadeiro na analise do lado esquerdo da regra, ela � selecionada. Depois da etapa de sele��o vem a resolu��o de conflitos, o qual ordena as regras usando algum crit�rio. Depois da resolu��o de conflitos o lado direito de cada regra � executado, atualizado a base de fatos ou gerando uma nova mensagem de saida. */void InferenceEngine::inference (){ bool leftSide; bool allLeftFacts; bool hasRuleFilter; bool hasRuleSelected = false; Rule* ptrRule = m_ptrRulesBase->getPtrFirstRule(); Filter* ptrFilter = ptrRule->getFirstPtrFilter(); LogicPattern* ptrPattern = NULL; RulesLogicPattern* ptrRulesPattern = ptrRule->getFirstPtrLogicLhs(); while( ptrRule != NULL ) { leftSide = false; allLeftFacts = false; hasRuleFilter = false; while( ptrRulesPattern != NULL ) { if ( ptrRulesPattern->getHasVariable() ) // atribui o valor corrente da variavel { ptrPattern = m_ptrFactsBase->selectObjectAndAttribute( ptrRulesPattern ); if ( ptrPattern != NULL ) ptrRulesPattern->setVariableValue( ptrPattern->getValue() ); hasRuleFilter = true; } else if ( ! (m_ptrFactsBase->queryLogicPattern( ptrRulesPattern ))) break; ptrRulesPattern = ptrRule->getNextPtrLogicLhs(); if ( ptrRulesPattern == NULL ) // se fim da lista de logic pattern { // ent�o todos fatos s�o verdadeiros //ptrFilter->print( ); allLeftFacts = true; } } if ( allLeftFacts and hasRuleFilter ) // analise dos filtros { ptrFilter = ptrRule->getFirstPtrFilter(); while ( ptrFilter != NULL ) { if ( ! ( analyseFilter( ptrFilter ))) break; if ( ptrFilter == NULL ) leftSide = true; ptrFilter = ptrRule->getNextPtrFilter(); } } else if ( allLeftFacts ) // n�o tem filtro na regra e todos os fatos verdadeiros leftSide = true; if ( leftSide ) { ptrRulesPattern = ptrRule->getFirstPtrLogicRhs(); while ( ptrRulesPattern != NULL ) { m_ptrFactsBase->addLogicPattern( ptrRulesPattern ); //cout << " pattern RigthSide: "; ptrRulesPattern->print(); if ( ptrRulesPattern->getObject() == "reactive_behavior" ) m_outputMessage = ptrRulesPattern->getValue(); else if ( ptrRulesPattern->getObject() == "local_goal" ) { if ( ptrRulesPattern->getAttribute() == "current" ) m_localGoalCurrent = ptrRulesPattern->getValue(); else if ( ptrRulesPattern->getAttribute() == "status" ) m_localGoalStatus = ptrRulesPattern->getValue(); m_ptrFactsBase->addLogicPattern("local_goal","current",m_localGoalCurrent); m_ptrFactsBase->addLogicPattern("local_goal","status",m_localGoalStatus); } ptrRulesPattern = ptrRule->getNextPtrLogicRhs(); } hasRuleSelected = true; } ptrRule = m_ptrRulesBase->getPtrNextRule(); // pr�xima regra if ( ptrRule != NULL ) { ptrRulesPattern = ptrRule->getFirstPtrLogicLhs(); ptrFilter = ptrRule->getFirstPtrFilter();// cout << " - fim rule -" << endl; } } if ( ! hasRuleSelected ) { m_outputMessage = "no_output_message"; m_ptrFactsBase->addLogicPattern("reactive_behavior","active","none"); m_ptrFactsBase->addLogicPattern("local_goal","current","none"); m_ptrFactsBase->addLogicPattern("local_goal","status","none"); }}/*! Este m�todo � usada para auxiliar no processo de infer�ncia. Cosiste em analisar cada regra sucessivamente. Esta primeira implementa��o � bem simplificada. */bool InferenceEngine::fowardChanig (){ if (( m_ptrRulesBase == NULL) && ( m_ptrFactsBase == NULL )) return false; return true;}/*! Este m�todo ordena as regras */bool InferenceEngine::rankRules () { return false;}/*! Este m�todo solucionas os conflitos */bool InferenceEngine::confictResolution () { return false;}/*float InferenceEngine::Freshness (list<Substituition> substList) {}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -