RoboCup2d学习——动作链

RoboCup2d学习——动作链

动作链
产生–评估–优化–执行–更新
1.sample_player.cpp
2116 createActionGenerator() 创建动作产生器
//****************
shoot
strict check pass
Cross
direct pass
short dribble
self pass (long dribble)
simple dribble
*******************//不同的动作
通过调用addGenerator() 函数,将创建的动作压入容器中,最后返回存储动作的容器
PS:产生一系列的动作放入容器中,为接下来的动作执行做准备

2.action_chain_graph.cpp
146 calculateResultChain()计算出结果
doSearch()
294 calculateResultBestFirstSearch()
(1)初始化,定义最好带球分数和最好传球分数,将vector容器清空;
(2)创建一个优先队列;
(3)检测当前状态,将储存最好结果的容器设置为empty_path,将储存最优评估的容器置为当前的评估结果;
结果放入队列;
(4)无限循环:
获取最有价值的动作链,当优先队列为空时跳出循环;
series 储存优先队列的第一个元素的first;(queue.top().first
存疑,first?)
获取候选的状态:若series为空,状态就为当前的状态,否则就是series的最后一个元素的状态;
产生候选的动作;
对每个候选动作进行评估并放入优先队列:(循环–超过最大的评估量时跳出)
double ev 储存评估的结果,每次对最好的结果进行更新;
PS:获得最好的结果,即最优的动作,产生最优的动作链

3.action_chain_holder.cpp
120 update() 更新动作链

4.sample_field_evaluator.cpp
对球场上不同的情况进行评估
evaluate_state() 评估函数 该函数的返回值是double类型的值,可根据返回值的数值大小对动作链进行调整

5.bhv_chain_action.cpp
205 execute() 执行函数

总结:球员通过动作链完成一系列动作,动作链是在不断地更新中的,通过不同的动作链的得分情况来对球员的动作链进行及时的调整以获得最高的比分。动作链的优化和评估紧密结合,通过一系列的函数调用获得最好的动作链,获得最高的比分。(可对评估函数进行调整优化)

疑问:
1.action_chain_graph.cpp
335 std::vector< ActionStatePair > series = queue.top().first;
其中的first不知是什么
2.场上每个球员(除守门员外)的初始动作链是否一致?比赛最开始如何确定执行的动作链?

PS:本文档仅为个人学习总结,其中有些自己的疑问,也有不完整的地方,或许会有错误,望指正!

猜你喜欢

转载自blog.csdn.net/qq_45800517/article/details/108026464
今日推荐