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

📄 usetrees.c

📁 足球机器人仿真组CMU97的源码
💻 C
字号:
/* usetrees.c * CMUnited-97 (soccer client for Robocup-97) * Peter Stone <pstone@cs.cmu.edu> * Computer Science Department * Carnegie Mellon University * Copyright (C) 1997 Peter Stone * * CMUnited-97 was created by Peter Stone and Manuela Veloso * * You may copy and distribute this program freely as long as you retain this notice. * If you make any changes or have any comments we would appreciate a message. */#include "global.h"#include "trees/consult.h"#include "trees/getnames.h"#include "trees/trees.h"#include "trees/userint.h"#include "trees/defns.i"#define CLOSEST_COMPARE 0#define TREE_DEBUG      0/*****************************************************************/int ChooseReceiverRandom(){    int teammates[TEAM_SIZE];  int NumOpen = Mem->FindTeammatesWithStatus(OPEN_STAT, teammates);  if ( NumOpen == 0 )    return FALSE;  if ( NumOpen < 3 ) /* HACK for testing pass3.tree: wait for 3 open receivers */    return FALSE;  for (int i=0; i<NumOpen; i++){  /* Some aren't visible */    if ( !Mem->PlayerDistanceValid(Mem->MySide,teammates[i]) ||	 Mem->GetPlayerDistance(Mem->MySide,teammates[i]) < 10 ){      FACETEAMMATE(teammates[i]);      return FALSE;    }  }  int receiver = teammates[int_random(NumOpen)];  /* Choose one randomly */  if ( receiver > 0 &&   /* This is redundant now */       Mem->PlayerDistanceValid(Mem->MySide,receiver) &&       Mem->GetPlayerDistance(Mem->MySide,receiver) < 10){      /* Ignore players who are too close */    Mem->SetStatus(Mem->MySide,receiver,BLANK_STAT);    receiver = ChooseReceiverRandom();  }  return receiver;}/*****************************************************************/int ChooseReceiverClosest(){    int teammates[TEAM_SIZE];  int NumOpen = Mem->FindTeammatesWithStatus(OPEN_STAT, teammates);  if ( NumOpen == 0 )    return FALSE;  if ( NumOpen < 3 ) /* HACK for testing pass3.tree: wait for 3 open receivers */    return FALSE;  for (int i=0; i<NumOpen; i++){  /* Some aren't visible */    if ( !Mem->PlayerDistanceValid(Mem->MySide,teammates[i]) ||	 Mem->GetPlayerDistance(Mem->MySide,teammates[i]) < 10 ){      FACETEAMMATE(teammates[i]);      return FALSE;    }  }  int receiver = teammates[0];    for (int i=1; i<NumOpen; i++){    if ( Mem->GetPlayerDistance(Mem->MySide,teammates[i]) <	 Mem->GetPlayerDistance(Mem->MySide,receiver) ){      receiver = teammates[i];    }  }  if ( receiver > 0 &&       Mem->PlayerDistanceValid(Mem->MySide,receiver) &&       Mem->GetPlayerDistance(Mem->MySide,receiver) < 10){      /* Ignore players who are too close */    Mem->SetStatus(Mem->MySide,receiver,BLANK_STAT);    receiver = ChooseReceiverRandom();  }  for (int i=0; i<3; i++)    printf("Receiver %d: %f\n",teammates[i],Mem->GetPlayerDistance(Mem->MySide,teammates[i]));  printf(">> Passing to %d\n",receiver);  return receiver;}/*****************************************************************/void FillAttributes(int receiver){  if ( !Mem->TeammateAngleValid(receiver) )    printf("%d: Need to know player (%d) angle to get tree stats!!\n",	   Mem->MyNumber,receiver);  float angle = Mem->GetTeammateAngle(receiver);  float distance;  if ( !Mem->TeammateDistanceValid(receiver) )    distance = 0;  else     distance = Mem->GetTeammateDistance(receiver);    FillAttributes(distance,angle,Mem->GetData(receiver));}/* Can be used for points, not just markers */void FillAttributes(float receiverDist, float receiverAng, char *receiverData){  /* go through all of RangeDesc[a]'s, setting values as in userint.c */  /* Gonna have to convert from strings */  char dataStream[MAXMESG];  GetPassData(dataStream,receiverDist,receiverAng,'a');  if ( !strcmp(receiverData,BLANK_DAT) ){    /* This can be used to see what happens without communication */    int len = strlen(dataStream);    for (int j=0; j<87; j++){      dataStream[len + 2*j] = '?';      dataStream[len + 2*j+1] = ',';    }  }  else     /* Now copy in receiver data */    strcpy(&dataStream[strlen(dataStream)],receiverData);  int i = 0;  for (int att=0; att<=MaxAtt; ++att){    while (dataStream[i] == ' ') i++;    if (dataStream[i] == '?'){      RangeDesc[att].Known = FALSE;    }    else if ( MaxAttVal[att] )      my_error(" Can't handle discrete attributes here yet. ");    else{ /* It's a continuous attribute */      /* sscanf(&dataStream[i], "%lf", &(RangeDesc[att].LowerBound) ); */      RangeDesc[att].LowerBound = get_double(&dataStream[i]);       /* Not handling ranges here--just single values. See userint.c */      RangeDesc[att].UpperBound = RangeDesc[att].LowerBound;      RangeDesc[att].Known = TRUE;    }    RangeDesc[att].Asked = TRUE; /* Set it to known */    /* IF CORE DUMPING HERE, CHECK MESG LENGTH (NEED > 512 for DTs) */    while (dataStream[i] != ',') i++; /* Advance to next attribute */    i++; /* Advance past comma */  }/*  my_error("FillAttributes");*/}/*****************************************************************/#if DETAILED_PASS_STATSchar  _PredictedClass_;float _PredictedProb_;#endifint FindTreeConfidences(int NumTeammates, int *teammates, float *Confidences){  int types[NumTeammates];  for (int i=0; i<NumTeammates; i++)    types[i] = RL_PASS_ACTION;  return FindTreeConfidences(NumTeammates,teammates,types,Confidences);}int FindTreeConfidences(int NumActions, int *actions, int *action_types, float *Confidences){  static int FIRST_TIME = TRUE;  int a;  if (FIRST_TIME){        /* Initialize the tree */    FileName = TREE_STEM;       printf("%s\n",TREE_STEM);    GetNames();    DecisionTree = GetTree(".tree");      RangeDesc = new ValRange[MaxAtt+1];    ForEach(a, 0, MaxAtt){	if ( MaxAttVal[a] ){	    RangeDesc[a].Probability = new double[MaxAttVal[a]+1];	}    }     FIRST_TIME = FALSE;  }  float HighConf = -1;  int   HighTeammateIndex = -1;  for (int i=0; i<NumActions; i++){ /* Cycle through open teammates       */    Clear();     if (action_types[i] == RL_PASS_ACTION)      FillAttributes(actions[i]);   /* Set the teammate for whom checking */    else /* A Knock action */      FillAttributes(MIN(40,Mem->GetMarkerDistance(actions[i])),		     Mem->GetMarkerAngle(actions[i]),		     BLANK_DAT);      /* Set the marker for whom checking */    int TreeClass = InterpretTree(&Confidences[i]);     /* Store confidence */#if TREE_DEBUG    printf("%d: %s with conf %.2f\n",actions[i],ClassName[TreeClass],Confidences[i]);#endif    if ( !strcmp(ClassName[TreeClass],"F") ){      Confidences[i] = -Confidences[i];   /* Failures with low conf, better */    }    if ( !strcmp(ClassName[TreeClass],"M") ){      Confidences[i] = 0;                /* Misses better than failures    */    }    if ( Confidences[i] > HighConf ||    /* Possibly reset if they're =    */	 (Confidences[i] == HighConf && int_random(2)) ){        HighTeammateIndex = i;         /* Reset best values                  */      HighConf = Confidences[i];#if DETAILED_PASS_STATS      _PredictedClass_ = *ClassName[TreeClass];      _PredictedProb_  = HighConf;      if (_PredictedClass_ == 'F')  /* Turn it back to positive           */	_PredictedProb_ *= -1;#endif    }  }  return HighTeammateIndex;}/*****************************************************************/int ChooseReceiverTree(){  int teammates[TEAM_SIZE];  int NumOpen = Mem->FindTeammatesWithStatus(OPEN_STAT, teammates);  float confidence[NumOpen];  /* Array to keep confidence that pass will succeed */  if ( NumOpen == 0 )    return FALSE;#if SAVE_PASS_DATA  if ( NumOpen < 3 ) /* HACK for testing pass3.tree: wait for 3 open receivers */    return FALSE;#endif#if SAVE_PASS_DATA  /* Only if you want to be sure the data's current */  for (int i=0; i<NumOpen; i++){  /* Some aren't visible */    if ( !Mem->PlayerDistanceValid(Mem->MySide,teammates[i]) ||	 Mem->GetPlayerDistance(Mem->MySide,teammates[i]) < 10 ){      FACETEAMMATE(teammates[i]);      return FALSE;    }  }#endif  int WaitForData = FALSE;  for (int j=0; j<NumOpen; j++){    if ( !strcmp(Mem->GetData(teammates[j]),BLANK_DAT) ){      SAYTO(teammates[j],GIVE_DATA_MSG);    /* Ping the individual for data */      WaitForData = TRUE;    }  }  if ( WaitForData )      /* waiting for data:  don't bother evaluating yet */    return FALSE;#if 0  if ( !Mem->BallValid() || Mem->GetBallDistance() > KICK_DISTANCE ) /* can't kick yet */    return Mem->MyNumber; /* But when, there I can pass, so send my number as a holder */#endif  int HighTeammateIndex = FindTreeConfidences(NumOpen, teammates, confidence);  int receiver;  if ( HighTeammateIndex < 0 )      /* Success predicted for nobody       */    receiver = ChooseReceiverRandom(); /* Choose randomly    */  else    receiver = teammates[HighTeammateIndex];        /* Take best choice   */#if CLOSEST_COMPARE  int close_receiver = ChooseReceiverClosest();/*  if (close_receiver == receiver){    _PredictedClass_ = 'F';    _PredictedProb_  = 1.0;  }  else */  receiver = close_receiver;#endif    printf(">>>Passing to %d\n",receiver);  return receiver;}

⌨️ 快捷键说明

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