instintive.cpp.svn-base

来自「一个巴西大学编写的2D仿真组足球机器人程序」· SVN-BASE 代码 · 共 1,358 行 · 第 1/4 页

SVN-BASE
1,358
字号
/* *  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. */#include "Instintive.h"Instintive::Instintive(){   mInferenceEngine.loadFacts(&mFactsBase);   mInferenceEngine.loadRules(&mRulesBase);   mFactsBase.addLogicPattern("player","ball_kickable","false");   mFactsBase.addLogicPattern("player","localization","AREA_DEFENSE");   mFactsBase.addLogicPattern("player","fastest_to_ball","false");   mFactsBase.addLogicPattern("opponent","close_to_player","false");   mFactsBase.addLogicPattern("reactive_behavior","active","none");   mFactsBase.addLogicPattern("ball","position","unknown");   mFactsBase.addLogicPattern("teammate","has_ball","false");   mFactsBase.addLogicPattern("close_opponent","has_ball","false");   mFactsBase.addLogicPattern("game","mode","PM_BEFORE_KICK_OFF");	   mFactsBase.addLogicPattern("player","bestOptionKick","none");   mFactsBase.addLogicPattern("player","confidence_for_kick","false");   //mFactsBase.addLogicPattern("ball","atuation_zone","false");   mFactsBase.addLogicPattern("player", "pass_ball", "teammate_10");   mFactsBase.addLogicPattern("player","front_space","free");   mFactsBase.addLogicPattern("player","next_line_r","false");   mFactsBase.addLogicPattern("player","next_line_of_deep","false");   mFactsBase.addLogicPattern("midplayers","has_ball","false");   mFactsBase.addLogicPattern("attackplayers","has_ball","false");   mFactsBase.addLogicPattern("dead_ball","situation","none");   mFactsBase.addLogicPattern("player", "back_goalie", "false");   mFactsBase.addLogicPattern("player", "distance_to_goalie", "dont_small");   /*mFactsBase.addLogicPattern("pass_condition","teammate_three","false");   mFactsBase.addLogicPattern("pass_condition","teammate_four","false");   mFactsBase.addLogicPattern("pass_condition","teammate_five","false");*/   mFactsBase.addLogicPattern("pass_condition","teammate_six","false");   mFactsBase.addLogicPattern("pass_condition","teammate_seven","false");   mFactsBase.addLogicPattern("pass_condition","teammate_eight","false");   mFactsBase.addLogicPattern("pass_condition","teammate_nine","false");   mFactsBase.addLogicPattern("pass_condition","teammate_ten","false");   mFactsBase.addLogicPattern("pass_condition","teammate_eleven","false");   mFactsBase.addLogicPattern("player","sick","false");   mFactsBase.addLogicPattern("ball","orientationLR","left");   mFactsBase.addLogicPattern("ball","orientationNS","south");   mFactsBase.addLogicPattern("player","orientationLR","left");   mFactsBase.addLogicPattern("player","orientationNS","south");   mFactsBase.addLogicPattern("opponent","localization","left");   WM = WorldModel::getInstance();   PS = PlayerSettings::getInstance();   SS = ServerSettings::getInstance();   pastAgentNextLineOfDeep = false;   pastConfidenceToPass3 = false;   pastConfidenceToPass4 = false;   pastConfidenceToPass5 = false;   pastConfidenceToPass6 = false;   pastConfidenceToPass7 = false;   pastConfidenceToPass8 = false;   pastConfidenceToPass9 = false;   pastConfidenceToPass10 = false;   pastConfidenceToPass11 = false;   pastConfidenceForKick = false;   pastPlayMode = false;   pastAgentFrontFreeSpace = false;   pastBallKickable = false;   pastBallOurPossesion = false;   pastFastestToBall = false;   pastCloseToPlayer = false;   pastBallPositonKnown = false;   //pastBallAtuationZone = false;   pastAgentNextLineR = false;   pastBallMidplayerPossesion = false;    pastBallAttackplayerPossesion = false;    pastTeammateSick = false;   //pastPositionOpponent1;   pastBestOptionKick = "none";   pastDeadBall = "none";   pastChoosePass9 = OBJECT_ILLEGAL;   pastChoosePass2 = OBJECT_ILLEGAL;   pastChoosePass5 = OBJECT_ILLEGAL;   pastChoosePass3 = OBJECT_ILLEGAL;   pastChoosePass4 = OBJECT_ILLEGAL;   pastChoosePass6 = OBJECT_ILLEGAL;   pastChoosePass7 = OBJECT_ILLEGAL;   pastChoosePass8 = OBJECT_ILLEGAL;   pastPlayerLocalization = AREA_ILLEGAL;   pastBallLocalization = AREA_ILLEGAL;   pastBackGoalie = false;   pastDistanceToGoalie = 50.0;   pastBallLeftPosition = true;   pastBallSouthPosition = true;   pastPlayerLeftPosition = true;   pastPlayerSouthPosition = true;   pastOpponentLocalization = "left";   pastBallPossesionOpponent = false;   cout << "inicializacao do instintivo" << endl;}void Instintive::loadRulesBase(){   string fileName;   // convertendo inteiro em string com strigstream   stringstream ss;   string playerNumber;   ss << WM->getPlayerNumber();   ss >> playerNumber;   fileName = RulesBase::RulesPath + "instintive" + playerNumber + ".rules";   cout <<"instintive rules file: "<< fileName << endl;   mRulesBase.loadRulesFile( (char*)fileName.c_str() );}string Instintive::makeInference(){   // gera mensagem para escolha do comportamento   /*if( updateFactsBase() )   {      if ( WM->getPlayerNumber() == 9 )         mFactsBase.print();   }*/   updateFactsBase();   mInferenceEngine.inference();   m_localGoal.current = mInferenceEngine.getLocalGoalCurrent();   if ( m_localGoal.current.empty() )      m_localGoal.current = "none";   m_localGoal.status = mInferenceEngine.getLocalGoalStatus();   if ( m_localGoal.status.empty() )      m_localGoal.status = "none";   return  mInferenceEngine.getOutputMessage();}/*!Esta funcao envia localizacao da bola para o cognitivo*/string Instintive::getBallLocalization(){   return getLocalizationString( WM->getGlobalPosition( OBJECT_BALL ) );}LocalGoal Instintive::getLocalGoal(){   return m_localGoal;}bool Instintive::updateFactsBase(){   bool              bNovaMsg = false;   PlayerPositionT   playerLocalization = getLocalization( WM->getAgentGlobalPosition() );   PlayerPositionT   ballLocalization = getLocalization( WM->getGlobalPosition(OBJECT_BALL) );   PlayModeT         playMode = WM->getPlayMode();   ObjectT           opponent = WM->getClosestInSetTo(OBJECT_SET_OPPONENTS,WM->getAgentObjectType());   VecPosition       posOpon = WM->getGlobalPosition(opponent);   VecPosition       posAgent = WM->getAgentGlobalPosition();   bool agentNextLineR = false;     // proximo a linha de fundo   if ( posAgent.getX() > 34 )       agentNextLineR = true;   bool agentNextLineOfDeep = false;   // muito proximo a linha de fundo   if ( posAgent.getX() > 42 )      agentNextLineOfDeep = true;   bool agentFrontFreeSpace = false;    // agente esta com espaco livre em volta dele.   list<ObjectT> listCloseOpp = getListCloseOpponents(posAgent,4.0,1.5);   if ( listCloseOpp.size() == 0 )      agentFrontFreeSpace = true;   // agente esta com dominio de bola   bool boolKickable = WM->isBallKickable();   // nosso time esta com a bola   bool ballOurPossesion = WM->isBallInOurPossesion();   //A bola está na posse do jogador mais proximo   bool ballPossesionOpponent = closeOpponentHasBall();   // jogadores de meio campo estao com a bola   bool ballMidplayerPossesion = isBallInMidplayerPossesion();    // jogadores de ataque estao com a bola   bool ballAttackplayerPossesion = isBallInAttackplayersPossesion();    // jogador eh o mais rapido a chega na bola   bool fastestToBall = ( WM->getFastestInSetTo( OBJECT_SET_TEAMMATES, OBJECT_BALL)         == WM->getAgentObjectType() );   // jogador marcado    bool closeToPlayer = ( posOpon.getDistanceTo(posAgent) < 8.0 );   // bola numa posicao desconhecida   bool ballPositonKnown = ( WM->getConfidence( OBJECT_BALL ) > PS->getBallConfThr());   //Zona de atuação   //bool ballAtuationZone = atuationZone( WM->getBallPos() );   //Jogaodor cansado   bool teammateSick = teammateIsSick();   // boa condicao de passe de bola para os jogadores de 3 a 11   /*bool confidenceToPass3 = confidenceToPass(OBJECT_TEAMMATE_3);    bool confidenceToPass4 = confidenceToPass(OBJECT_TEAMMATE_4);    bool confidenceToPass5 = confidenceToPass(OBJECT_TEAMMATE_5);*/   bool confidenceToPass6 = confidenceToPass(OBJECT_TEAMMATE_6);    bool confidenceToPass7 = confidenceToPass(OBJECT_TEAMMATE_7);    bool confidenceToPass8 = confidenceToPass(OBJECT_TEAMMATE_8);    bool confidenceToPass9 = confidenceToPass(OBJECT_TEAMMATE_9);    bool confidenceToPass10 = confidenceToPass(OBJECT_TEAMMATE_10);    bool confidenceToPass11 = confidenceToPass(OBJECT_TEAMMATE_11);   bool confidenceForKick = confidenceToKick( );   string bestOptionKick = bestOptionForKick( );   string deadBall = ModeUsOrThem();   //string positionOpponent1 = getPositionYOpponent1();   ObjectT choosePass9 = objectTeammateCloser( OBJECT_TEAMMATE_11, OBJECT_TEAMMATE_10 );   ObjectT choosePass2 = objectTeammateCloser( OBJECT_TEAMMATE_7,OBJECT_TEAMMATE_10);   ObjectT choosePass5 = objectTeammateCloser( OBJECT_TEAMMATE_8,OBJECT_TEAMMATE_11);   ObjectT choosePass3 = objectTeammateCloser( OBJECT_TEAMMATE_6,OBJECT_TEAMMATE_7 );   ObjectT choosePass4 = objectTeammateCloser( OBJECT_TEAMMATE_8,OBJECT_TEAMMATE_6 );   ObjectT choosePass6 = objectTeammateCloser( OBJECT_TEAMMATE_8,OBJECT_TEAMMATE_7 );   ObjectT choosePass7 = objectTeammateCloser( OBJECT_TEAMMATE_9,OBJECT_TEAMMATE_10 );   ObjectT choosePass8 = objectTeammateCloser( OBJECT_TEAMMATE_9,OBJECT_TEAMMATE_11 );   string opponentLocalization = getOpponentLocalization();   //Localização da bola (esquerda, direita, norte, sul)   bool ballLeftPosition;   if( WM->getGlobalPosition( OBJECT_BALL ).getY() > 0 )      ballLeftPosition = false;   else      ballLeftPosition = true;   bool ballSouthPosition;   if( WM->getGlobalPosition( OBJECT_BALL ).getX() > 0 )      ballSouthPosition = false;   else      ballSouthPosition = true;   //Localização do agente (esquerda, direita, norte, sul)   bool playerLeftPosition;   if( WM->getAgentGlobalPosition().getY() > 0 )      playerLeftPosition = false;   else      playerLeftPosition = true;   bool playerSouthPosition;   if( WM->getAgentGlobalPosition().getX() > 0 )      playerSouthPosition = false;   else      playerSouthPosition = true;   //No caso de goleiros que não saem da pequena área, carregar mais a bola, antes de chutar.   bool backGoalie;   if( WM->getGlobalPosition( OBJECT_OPPONENT_1 ).getX() > 48 )      backGoalie = true;   else      backGoalie = false;   double distanceToGoalie = WM->getRelativeDistance( OBJECT_OPPONENT_1 );   if(WM->getPlayerNumber() == 9 )   {      if ( choosePass9 != pastChoosePass9 )      {         if ( choosePass9 == OBJECT_TEAMMATE_11 )            mFactsBase.addLogicPattern("player", "pass_ball", "teammate_11");         else            mFactsBase.addLogicPattern("player", "pass_ball", "teammate_10");         pastChoosePass9 = choosePass9;         bNovaMsg = true;      }   }   else if(WM->getPlayerNumber() == 2 )   {      if ( choosePass2 != pastChoosePass2 )      {         if ( choosePass2 == OBJECT_TEAMMATE_10 )            mFactsBase.addLogicPattern("player", "pass_ball", "teammate_10");         else            mFactsBase.addLogicPattern("player", "pass_ball", "teammate_7");         pastChoosePass2 = choosePass2;         bNovaMsg = true;      }   }   else if(WM->getPlayerNumber() == 5 )   {      if ( choosePass5 != pastChoosePass5 )      {         if ( choosePass5 == OBJECT_TEAMMATE_8 )            mFactsBase.addLogicPattern("player", "pass_ball", "teammate_8");         else            mFactsBase.addLogicPattern("player", "pass_ball", "teammate_11");         pastChoosePass5 = choosePass5;         bNovaMsg = true;      }   }   else if(WM->getPlayerNumber() == 3 )   {      if ( choosePass3 != pastChoosePass3 )      {         if ( choosePass3 == OBJECT_TEAMMATE_6 )            mFactsBase.addLogicPattern("player", "pass_ball", "teammate_6");         else            mFactsBase.addLogicPattern("player", "pass_ball", "teammate_7");         pastChoosePass3 = choosePass3;         bNovaMsg = true;      }   }   else if(WM->getPlayerNumber() == 4 )   {      if ( choosePass4 != pastChoosePass4 )      {         if ( choosePass4 == OBJECT_TEAMMATE_8 )            mFactsBase.addLogicPattern("player", "pass_ball", "teammate_8");         else            mFactsBase.addLogicPattern("player", "pass_ball", "teammate_6");         pastChoosePass4 = choosePass4;         bNovaMsg = true;      }   }   else if(WM->getPlayerNumber() == 6 )   {      if ( choosePass6 != pastChoosePass6 )      {         if ( choosePass6 == OBJECT_TEAMMATE_8 )            mFactsBase.addLogicPattern("player", "pass_ball", "teammate_8");         else            mFactsBase.addLogicPattern("player", "pass_ball", "teammate_7");         pastChoosePass6 = choosePass6;         bNovaMsg = true;      }   }   else if(WM->getPlayerNumber() == 7 )   {      if ( choosePass7 != pastChoosePass7 )      {         if ( choosePass7 == OBJECT_TEAMMATE_9 )            mFactsBase.addLogicPattern("player", "pass_ball", "teammate_9");         else            mFactsBase.addLogicPattern("player", "pass_ball", "teammate_10");         pastChoosePass7 = choosePass7;         bNovaMsg = true;      }   }   else if(WM->getPlayerNumber() == 8 )   {      if ( choosePass8 != pastChoosePass8 )      {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?