Helios_base代码导读

agent2d简介

ps:agent2d是指现在最新的版本

  • agent2d是日本的Helios球队开发的底层。

  • agent2d的底层代码很强。在agent2d的3.x版本刚问世的时候,几乎不用怎么改动,就能在国赛或者世界杯上面取得很好的成绩。16年国赛,安徽建筑大学的球队就是用改了一点阵型的底层3-1把16年的季军球队南邮给做掉了。所以不要小看底层队伍。

  • agent2d的代码量很多。我之前,用wc工具统计了它的src和librcsc里面的代码。好像是在10万行左右。

  • agent2d的lib里面封装了很多有用的库。改动比较简单。

agent2d的文件组织

lib-rcsc (最新版本)

rcsc/action         动作类(重点)   
rcsc/ann            人工神经网络类   
rcsc/coach          在线教练类   
rcsc/common         公共的类   
rcsc/formation      一些阵型类(agent2d只使用了DT跑位)   
rcsc/geom           一些几何类   
rcsc/net            一些与server交换数据的类   
rcsc/param          一些参数类   
rcsc/player         一些球员类(重点)   
rcsc/time           时间类(一般用不到)   
rcsc/trainer        一些离线教练类   
rcsc/util           game_mode math  version

agent2d (YuShan_Base)

src/

   以bhv开头的都是在各种情况下的动作执行类(重要)      
   以role开头的都是角色类   
   以sample开头的都是示例,可以模仿其结构修改代码       
   以intertion开头的是意图类       
   以neck开头的是转脖子动作

data/formations-dt

   保存了一些阵型的数据

src/chain_action

   agent2d底层的决策核心(非常重要) 

决策流程


sample_player.cpp (218hang)

 /*!   
 main decision   
 virtual method in super class   
 */

void
SamplePlayer::actionImpl()   
{   

//   
// update strategy and analyzer   
//   

Strategy::instance().update( world() );   //更新决策模型
FieldAnalyzer::instance().update( world() ); //更新评估模型

//
// prepare action chain
//
M_field_evaluator = createFieldEvaluator();  //创建区域评估器
M_action_generator = createActionGenerator();  //创建动作链

ActionChainHolder::instance().setFieldEvaluator( M_field_evaluator );  //设置评估器
ActionChainHolder::instance().setActionGenerator( M_action_generator );   //设置动作链

//
// special situations (tackle, objects accuracy, intention...)       
 //一些特殊的情形  
// check tackle expires
// check self position accuracy
// ball search
// check queued intention
// check simultaneous kick
//
if ( doPreprocess() )
{
    dlog.addText( Logger::TEAM,
                  __FILE__": preprocess done" );
    return;
}

//
// update action chain
//
ActionChainHolder::instance().update( world() );//更新动作链和评估


//
// create current role
//
SoccerRole::Ptr role_ptr;
{
    role_ptr = Strategy::i().createRole( world().self().unum(), world() );//根据球员号码创建角色

    if ( ! role_ptr )
    {
        std::cerr << config().teamName() << ": "
                  << world().self().unum()
                  << " Error. Role is not registerd.\nExit ..."
                  << std::endl;
        M_client->setServerAlive( false );
        return;
    }
}


//
// override execute if role accept
//
if ( role_ptr->acceptExecution( world() ) )
{
    role_ptr->execute( this );//角色动作执行
    return;
}


//
// play_on mode  正常比赛模式
//
if ( world().gameMode().type() == GameMode::PlayOn )
{
    role_ptr->execute( this );
    return;
}


//
// penalty kick mode  点球模式
//
if ( world().gameMode().isPenaltyKickMode() )
{
    dlog.addText( Logger::TEAM,
                  __FILE__": penalty kick" );
    Bhv_PenaltyKick().execute( this );
    return;
}

//
// other set play mode  其它比赛模式
//
Bhv_SetPlay().execute( this );


} 

role_x_x.cpp

bool
RoleCenterBack::execute( PlayerAgent * agent )
{
bool kickable = agent->world().self().isKickable();
if ( agent->world().existKickableTeammate()
     && agent->world().teammatesFromBall().front()->distFromBall()
     < agent->world().ball().distFromSelf() )
{
    kickable = false;
}

if ( kickable )//如果自身可踢球
{
    doKick( agent ); //踢球
}
else
{//不可踢
    doMove( agent );//跑位
}

   return true;
}

agent2d球员角色分配

agent2d把球员角色划分为
中锋(11号)
边锋(9,10号)
边后卫(2,5号)
中后卫(3,4号)
防守型中场(6号)
进攻型中场(7.8号)

具体代码在ROLE_角色名中查看

具体角色划分在strategy.cpp里面

异构球员的顺序在sample_coach.cpp里面

代码执行流程

引用YuShan2011TDP内容

2.1 底层的执行流程
Agent2D底层执行的过程如下:先由Main()函数开始,首先是一些环境变
量设置,启动球员类。进入BasicClient类中,执行Run()函数,RunOnline()
调用PlayerAgent 类的 HandleMessage ()函数处理获得的信息,
HandleMessage () 函数调用在PlayerAgent类中的Action()函数进行动作决
策和Server参数的解析parse()函数。 在Action()函数中依次执行ActionImpl()
函数,DoArmAction()函数,DoViewAction()函数,DoNeckAction()函数
以及CommunicationImpl()函数。 其中ActionImpl()函数是主要的决策函数的
框架。基于球员在场上的角色(Role)以及场上位置(Home_Position),执
行相应的Role策略,这种基于角色的策略增加了球员的灵活性,使不同类型的
球员具有不同的策略,对于球场动态环境具有更强的自适应性。

ps:个人觉得这篇TDP干货很多,很适合入门学习。就放到云里面了。
链接:http://pan.baidu.com/s/1dF2rc0D 密码:gdq7

下周周末,有时间再写如何修改代码。