⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inferenceengine.cpp.svn-base

📁 一个巴西大学编写的2D仿真组足球机器人程序
💻 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 + -