# eTL-python **Repository Path**: furtherbank/e-tl-python ## Basic Information - **Project Name**: eTL-python - **Description**: 足球场强化学习环境。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-06-12 - **Last Updated**: 2023-10-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目介绍 该项目是能够适应动态环境的多智能体系统的进化迁移强化学习框架(eTL)在足球场(Playground)中的实现。 需要将代码引入一个Python解释器的环境,然后运行 `Game.py` 这样模拟器就可以直接运行,而不需要修改接口或源代码中的参数。 # 项目前端开发 使用pyqt5进行配置。如果需要编辑前端,需要使用外部工具: 1. 打开 PyCharm 的设置 2. 找到 Tools -> External Tools 3. 点击 + -> Create Tool 接下来创建三个工具。参数列表: 1. Qt Designer ![image-20220128170854732](README.assets/image-20220128170854732.png) `D:\Anaconda3\Lib\site-packages\qt5_applications\Qt\bin\designer.exe` `$FileDir$` 2. PyUIC ![image-20220128170924589](README.assets/image-20220128170924589.png) `D:\Anaconda3\python.exe`,`-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py`,`$FileDir$` 3. Pyrcc ![image-20220128171013233](README.assets/image-20220128171013233.png) `D:\Anaconda3\Scripts\pyrcc5.exe`;`$FileName$ -o $FileNameWithoutExtension$_rc.py`;`$FileDir$` 然后,打开 qt designer 就可以编辑ui文件了,然后用PyUIC转成代码文件执行即可 # 环境 Playground 相关说明 ## Unit ### state [球门相对位移,球位移,ballowner,球相对位移,队友和敌人相对位移] - last_action是上一步的动作,如果上一步做错了而中断,会置零 - getfrom是得到球的回合,上一个球主人的uid。如果该局是赢了,发球者的id会被广播到这个变量上。进入state时会转换为相对id ### 相对id 各自智能体看**队友**别的智能体,转换成相对id `o_id` 0 ~~1~~ 2 3 `r_id` 3 0 1 2 `a_id` 2 = 0 1 `o2r`:`(id-self.id) % m_num` `o2a`:`(id-self.id-1) % m_num` `a2o`:`(id+self.id+1) % m_num` ### valid_actions 在决策阶段,所有`last_state`更新完毕之后进行设置。 - 使用了自己的`last_state` - 如果使用随机策略,必须要使用由`last_state`决定的伪随机 - 如果做了不在`valid_actions`内的动作,会被当作0动作处理没有效果 ### 球转移 1. 发球 踢球条件:离球门最近格距离平方<=50 踢球目标:离球门最近格 2. 传球 入选条件:距离平方<=37 优先条件:在前方,最近 传球目标:目标移动后位置 > 详细处理: > 后方:not f_ok and dis < min_dis > 前方:not f_ok or dis < min_dis 3. 捡球 如果发球路径碰到其它单位的**碰撞箱**,**离起点最近**的单位即会捡到球。 **碰撞箱**宽1格,高2格,自身位置为中心。 4. 抢夺 可以抢夺敌方单位的球。 抢夺条件:0<=相对x<=1,-1<=相对y<=1 自己无球权但可抢夺敌方球时,如果满足距离条件,可以从**敌方单位坐标**开始发球或传球。 如果有敌方单位可以抢夺自己球,此时无法发球或传球。 > 注:1v1模式下抢夺发球无距离限制,否则防守方无法获胜。 # GAME `feature`自动实验 - 自动训练,可重复实验 - 通过`save/temp`下模板格式,自动输出保存实验报告 - 代码出错即时回放,方便调试 `feature`展示 - 自动播放一局 `feature`保存/读取 - 保存实验所有智能体/记忆/预测模型 ### 随机策略 目前贴一下2v2的随机情况: 1. 正常规则 ![](README.assets/0113-174734.jpg) 2. 取消默认策略的virtual_perform ![](README.assets/0113-173220.jpg) 3. 取消劫球发球的距离限制 ![](README.assets/0113-174437.jpg) 根据目前的情况来看,劫球发球赢的局比例稍高,而不是正常射进球门。 胜率一般很低。不到百分之十。 ## 实验报告 [实验报告模板](./save/temp/temp.md) 模板是md文件和硬编码的杂糅。详情请看`game.py`中`do_auto`这一部分 ### changelog v 0.0.3 1/20:加入最初版本,以及mbp的信息展示 todo: 暂无 # Agent(Double DQN) 智能体按照 DQN 框架进行训练。 - 带权重经验回放(PBR) - Double DQN `feature`模因外演 - 选择教师智能体,并概率选择动作执行 - 模因变异 - 多智能体迁移学习(内置入教师`select_action`中) `feature`预测网络 - 各代理保存若干预测网络,学习敌人动作 - `vitural_perform`过滤错误动作 ## virtual_perform 根据预测模型,得出敌人下一步的动作,然后以此排除失败的动作。 ### 效果绘图 每一个单位需要画一个`virtual_perform`效果图,图包括: 进行`virtual_perform`出现失败动作的时候,根据**敌人动作正确预测的数量**,再加上**总出现次数**画散点图。 折线图坐标是(轮数,步数) ## top-k 经过简单推导,可以得知,划分完$P_i$之后, $m_{t}$的$\mathcal{F}\left(M^{K} \bigcup m_{t}\right)-\mathcal{F}\left(M^{K}\right)$最大,也就是下式最大: $$ \sqrt{\sum_{m_{j} \in M} \left(1-\prod_{m_{i} \in (P_{f}\cap M^K)}\left[1-\sigma\left(m_{i}, m_{j}\right)\right]*(1-\sigma (m_t,m_j))\right)}-\sqrt{\sum_{m_{j} \in M} \left(1-\prod_{m_{i} \in (P_{f}\cap M^K)}\left[1-\sigma\left(m_{i}, m_{j}\right)\right]\right)} $$ 其中$f$为$m_t\in P_f$ 这里面$\prod_{m_{i} \in (P_{f}\cap M^K)}\left[1-\sigma\left(m_{i}, m_{j}\right)\right]$可以计算后缓存,俩式子都可以用 ## memory [state, action, reward, nextstate, done] # DQN 大家族 Nature DQN: 相比最基础DQN加了一个目标网络 Double DQN: 损失函数更新改动 Dueling DQN: 网络改动,改为 v+a(尝试过,发现效果不好) 目前使用 Double DQN + PBR ## 坑集合 1. 随机策略请使用完全随机策略。即使有些动作不可用也不可使用可用动作的完全随机。 否则,一些动作的样本比例很少,然后因为DQN的自举高估问题,这个动作Q会跟不上其它的高估,很难被使用 2. # pytorch 使用规范 1. 在只推理不学习的时候使用`@torch.no_grad()` 2. 原来的时候,用`.cuda`把张量放到gpu里。 - 以前的时候是一个Variable方法套一个tensor(400轮326s) - 现在直接`to.device('cuda')`,更快速(400轮313s...) # 运行结果 ## 单智能体 ### 2021/10/25 ``` Episode - 101: Win rate - 0.03 Avg score - 0.03 : 0.06 Avg reward - -0.27 Episode - 201: Win rate - 0.10 Avg score - 0.10 : 0.02 Avg reward - -0.16 Time(s):62 # 测试 Episode - 302: Win rate - 0.44 Avg score - 0.44 : 0.04 Avg reward - 0.31 Time(s):5 展示结束,奖励 -0.330000 Episode - 403: Win rate - 0.45 Avg score - 0.45 : 0.10 Avg reward - 0.28 Time(s):23 展示结束,奖励 -0.904000 # c Episode - 503: Win rate - 0.58 Avg score - 0.58 : 0.10 Avg reward - 0.52 Time(s):4 ``` - 纯运行时间:4s/100e - 练习运行时间:31s/100e ### 2021/12/23加入pbr - 练习运行时间:70s/100e 但是训练的效果好很多 ## 2智能体 ### 2022/1/13 做了一个奇怪的实验: 2v2取消掉一个智能体的策略,然后训练。大概训练一千多论,智能体效果很不错,很会给会的人递球。 ![](README.assets/0113-194855.jpg) 然后进行第一遍测试: ![](README.assets/0113-195408.jpg) 哎呀!全错了!没关系,再来400轮! ![](README.assets/0113-195734.jpg) 再试试看: ![](README.assets/0113-200432.jpg) 似乎好了一点,再试试,练上两百轮: ![](README.assets/0113-200926.jpg) 效果确实好了,又好像没怎么好: ![](README.assets/0113-200955.jpg) #### 放开0动作的效果 具体措施:将错误动作还是0化,且无奖励损失,然后将0动作的使用权限放开,观察0使用权限是否放开,以及随机策略有效化或者随意的效果。 - 用1v1 1*1200 ms50? 的训练图作为评分标准 1. 不把0动作放开,错误动作-1.2结束的1v1 1000 轮训练的效果,稳中求进: ![](README.assets/0113-175712.jpg) 2. 错误动作直接当0且无损失的方式,但不放开0的权限: ![](README.assets/0113-211352.jpg) ![](README.assets/0113-211548.jpg) > 跑了1200轮。发现效果真心不错!训练正常进行! 3. 错误动作直接当0而且放开了0动作的使用权限: ![](README.assets/0113-212851.jpg) > 排除偶然性的情况,感觉这样效果还要好一点! 4. 直接把0放到了valid里面,然后使用了完全随机策略(可以带not valid的策略): ![](README.assets/0113-214934.jpg) > emmm效果差不多,好像非随机更好一点?没有太大的差别 #### 禁止敌人发球的训练效果 先探索这个可能性:多智能体训练不出来是否是网络训练而非环境的问题。 - 禁掉敌人的发球能力,保证我方不会输,然后进行尝试 进行实验: 2v2 *1200 禁掉敌人的发球能力(但犯傻时还会发球) ![](README.assets/0114-083703.jpg) 2v2 *1200 完全禁掉敌人的发球能力,但是全局奖励 ![](README.assets/0114-095815.jpg) > 探索两个可能性: > > 1. 多智能体训练失败是否是因为两个网络同时训练的问题,抛弃掉1个单元的网络,看看是否能够训练出正常策略。 > 2. 多智能体训练不出来是否是网络训练而非环境的问题,禁掉敌人的发球能力,保证我方不会输,然后进行尝试 #### 奖励设置的训练效果 在MRP问题中,奖励R是由当前状态S所完全确定的。 我们尝试一下不同R设置的效果。 1. 完全规则R设置,包括转移球奖励,靠近球门奖励。 - 结果请看 [放开0动作的效果(3)](#放开0动作的效果) 。该实验基于这个配置测试。 2. 只设置胜利奖励1,失败奖励-0.5 ![](README.assets/0117-180214.jpg) > 只看单智能体,感觉效果比原来要差一些。 多智能体合作任务的奖励设置,尤其是共同完成一个任务目标,但是最后完成目标的是个人的时候,应该是怎样的设置?是把奖励给个人还是整个的团队?目前认为应该是给团队比较好。 但是因为目前多智能体没练出来过,目前还是给的个人 #### 最大步数对随机胜率的影响 > 做出一个假设:记忆中成功的部分越多,训练出成功策略的概率就越高。 > > 最大步数提高可以些许提高一些随机策略胜率。但是多余的步数也是在花费计算资源。 > 这里认为,分辨多步数好,还是少步数好,可以测一下多步数花费的时间以及胜率的关系,就可以大致得到胜利 1. 5*500 2v2 maxstep 50:49s。 胜率几乎很低。只能在1%左右。 ![](README.assets/0115-170402.jpg) ![image-20220115171720036](README.assets/image-20220115171720036.png) 2. 5*500 2v2 maxstep 500:156s。 胜率在5%~6%左右 ![](README.assets/0115-171221.jpg) ![image-20220115171510713](README.assets/image-20220115171510713.png) ​ 这是一个1*500的maxstep500结果。这个情况下,平局概率非常低。 ![](README.assets/0115-171812.jpg) > 实验结果: > 500步胜率依旧很低啊,不过大约3倍多的时间赢得了将近5~6倍的胜率,很明显成功的记忆比重更大。 > 没有关心到可能的效率问题。 > > 就这个比例来看,每轮还是选择500步。。。让他多练练先。。。 > 千万不要做步数长了扣分的傻事啊,R必须只和S相关!不然马尔可夫性都不满足你谈什么练网络呢! ### 2022/1/22 [多智能体vs随机策略](./save/0122-102309.md) 第一次跑成功。 [多智能体vs随机策略 无greedy测试](./save/0122-103816.md) 效果比较完美 [多智能体vs随机策略 greedy测试](./save/0122-103838.md) 效果很差,出现动作次数少就bug的现象 #### 奇招:发球传球不可用当作向右处理 没有十年练不出来的情况真的想不出这么脑溢血的招数。 2v2情况下,随机胜率都可以到达10%左右,真是神了! [1v1 5*500](0122-205251.md) [2v2 5*500](save/0122-203336.md) [2v2胜利情况大多是直接发球,劫球成功较少](save/0122-205359.md) ### 2022/1/23 #### 奇招直接对战默认策略失败 250步的时候对战随机策略是成功的。[2v2 800trial 250step random](save/0123-213114.md) 500步对战默认策略不行。[2v2 1600trial 500step default](save/0123-185725.md) 起初以为赢得太快认为是学习次数不够 然后增加了epsilon和学习轮数训练,仍然失败[2v2 3200trial 500step default](save/0124-094022.md) md,就差直接对阵默认策略成功了。为什么就成功不了呢? ## 5智能体 ``` Episode - 101: Win rate - 0.00 Avg score - 0.00 : 0.01 Avg reward - -0.23 Episode - 201: Win rate - 0.06 Avg score - 0.06 : 0.07 Avg reward - -0.21 Time(s):348 # 测试 Episode - 301: Win rate - 0.04 Avg score - 0.04 : 0.08 Avg reward - -0.25 Time(s):43 ``` # 后续代码完善计划 ## 实验结果 - [x] 将实验结果本身保存在pth文件中(目前还需要源目标存档才可复现) ### 尚未利用的参考 ## 预测模型 - 实现预测模型多线程训练,提高速度 - 完成预测模型最终的实验测试规划 ### 尚未利用的参考 https://blog.csdn.net/DD_PP_JJ/article/details/103068650?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-1-103068650.pc_agg_new_rank&utm_term=python%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%AE%AD%E7%BB%83%E6%A8%A1%E5%9E%8B&spm=1000.2123.3001.4430 # 后续实验计划 ## 2022/1/27 ### 虚拟演示测试 - [x] 先等我写完代码在这打上勾,在开始测试 #### virtual_perform有效性 按照单智能体正常配置进行virtual_perform的测试。 其中: `mbp_param.real_act = True`,然后按照`dqn_param.mbp`分别为T/F跑2*1000轮,看实验图像 - [ ] 测试完成(实验结果 [参数备注,右边⚪括号写文件链接/使用vp](save/time.md) ) #### 预测模型有效性(未设计完成) 我们可以直接这样认为:预测模型只要预测正确,就是有效。 有效性因为网络着实有正确率所以有保证,主要是出图 带着4个模型跑一下,开启迁移学习 #### top-k有效性 这次带上16个网络去测试,每个网络学习1200轮,筛选2个 ### 迁移学习测试 首先设置迁移学习的有效性 #### 有效性测试 其中`mbp_param.real_act = True`,然后按照`dqn_param.trans`分别为T/F跑 2v2 2*4000 轮,看实验图像 - [ ] 测试完成(实验结果 [参数备注,右边⚪括号写文件链接/使用vp](save/time.md) ) #### 不知道欸嘿嘿