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 + -
显示快捷键?