庙算兵棋推演AI开发初探(2-编写策略(上))

开始研读step()函数的编写方法。

这个是图灵网提供了一些基础的ai代码下载(浏览需要注册,下载需要审批)。

AI开发中心-人机对抗智能 (ia.ac.cn)icon-default.png?t=N7T8http://turingai.ia.ac.cn/ai_center/show


一、代码研读(BaseAgent类)

1.step函数

这段代码定义了一个 step 方法,用于根据当前的游戏状态生成行动,并返回一个包含所有行动的列表。

这是社区开发版的step函数代码,还是在注释中写解读。

step函数是RL(强化学习)环境中的一个基本方法,用于在环境中执行一个步骤,并返回相应的观察、奖励和是否结束的布尔值。在这个函数中,self表示当前环境对象,observation是一个字典,包含了当前环境的观察状态。

函数的目的是根据当前的观察状态,生成一个动作,然后将这个动作应用到环境中,得到一个新的观察状态、奖励和是否结束。最后,函数返回这些值。

函数step,主要是部署阶段管部署,其他阶段找活着的、属于自己的、能使用的行动来执行 

    def step(self, observation: dict):# 暂存一些信息#通信相关信息,communication里面找200,201的type的指令?#初始化返回值total_actions = []# observation.time.stage==1-部署阶段# 特殊处理,将"sub_type"是人员2 / 无人战车4 /发射指令if observation["time"]["stage"] == 1:actions = []for item in observation["operators"]:if item["obj_id"] in self.controllable_ops:operator = itemif operator["sub_type"] == 2 or operator["sub_type"] == 4:actions.append({"actor": self.seat,"obj_id": operator["obj_id"],"type": 303,"target_obj_id": operator["launcher"],})actions.append({"actor": self.seat,"type": 333})return actions#这里不再是部署阶段了#这行代码的目的是遍历 observation["valid_actions"] 字典中的每个键值对,#并将键(obj_id)和值(valid_actions)分别赋值给变量 obj_id 和 valid_actions。#找活着的算子for obj_id, valid_actions in observation["valid_actions"].items():#找属于自己的算子if obj_id not in self.controllable_ops:continue#找到能用的行动类型for (action_type) in self.priority:  # 'dict' is order-preserving since Python 3.6if action_type not in valid_actions:continue#====找到基于类型的动作生成方法!要改的就是这里的函数====gen_action = self.priority[action_type]action = gen_action(obj_id, valid_actions[action_type])if action:total_actions.append(action)break  # one action per bop at a timereturn total_actions

1)python语言知识

相对于C的结构体,这里的引用方式大概是这样的:

if observation["time"]["stage"] == 1:

转换为C语言的写法 

if (observation.time.stage == 1)

代码里大量的使用字典代替结构体定义,这个看懂了会很有用。 

1-字典

 observation: dict

声明observation是一个字典

使用方括号[]来获取值,例如my_dict['key']

2-列表

total_actions.append(action)

看起来代码这里一般用来当作队列使用

3-元组

代码里几乎没有用到

2)传入的参数  

1-态势( observation)定义

它接受一个字典类型的参数 observation,表示当前的游戏状态、环境信息或玩家信息等。

以下是态势( observation)最外层的数据结构以及他们代表的含义。

obs = {"actions": list, # 上一步接收到的动作"cities": [], # 各个夺控点的信息"communication": [], # 通信相关信息"jm_points": [], # 间瞄点信息"judge_info": [], # 裁决信息"landmarks": {}, # 地标信息,雷场,路障"operators": [], # 算子信息"passengers": [], # 乘员信息"role_and_grouping_info": {}, # 玩家信息和编组信息"scenario_id": 0, # 想定ID"scores": {}, # 分数"terrain_id": 0, # 地图id"time": {}, # 时间信息"valid_actions": {} # 当前态势下的可做动作信息
}

再下一层的定义在链接的4.1.1开始有说明 

 《庙算 陆战指挥官》兵棋推演平台AI开发指南 (yuque.com)

2-态势说明

将 observation 赋值给 self.observation,以便在后续步骤中使用。

State一般代表环境当前的所有状态。Observation一般情况下代表对于某个智能体可观测的态势。Observation是State的子集。

TrainEnv的step函数返回的state,表示当前环境的所有状态合集。状态合集有红方蓝方绿方态势组成:state[0]代表的是红方态势,state[1]代表的是蓝方态势,state[-1]代表的是绿方态势。

AI代码的step函数接受的参数是就是态势observation,它封装了当前时间,此AI能观测到的所有盘面信息,包括算子信息、裁决信息等。以下是态势最外层的数据结构以及他们代表的含义。

2.与其他基准ai比对

我在上方的图灵网上下载了几个基准AI,对其与默认版进行比较。

用TortiseGit进行代码比对,发现这个基准AI对step函数作了相当多的修改。

要怎么改呢……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/582155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

丰田「退股」电装,传统汽车供应链体系走到十字路口

就在中国市场热衷于车企与零部件厂商的合纵连横之际,本周,传统汽车巨头丰田公司宣布,将出售部分电装(Denso)公司股份,资金用于投入电动化、智能驾驶等新技术研发。 按照计划,丰田汽车拟出售超过…

私有部署ELK,搭建自己的日志中心(二)-- filebeat的介绍与安装

一、背景 在搭建ELK系统之前,你有必要去了解下,为何大家在agent端普遍青睐filebeat,而把logstash放置于更加靠后端。 轻量级的filebeat,作为agent角色,是安装在每台虚拟机上。 filebeat的学习分为两大部分&#xff1…

【Java基础系列】body参数前后端不一致

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次

前言:定时器TIM的详细知识点见我的博文:11.TIM定时中断-CSDN博客 STM32定时器时间计算公式 公式解释: ARR(TIM_Period):自动重装载值,是定时器溢出前的计数值 PSC(TIM_Prescaler&…

Docker自建文件快递柜系统

Docker自建文件快递柜系统。 软件特色: 轻量简洁:FastapiSqlite3Vue2ElementUI 轻松上传:复制粘贴,拖拽选择 多种类型:文本,文件 防止爆破:错误次数限制 防止滥用:IP限制上传次数…

掌握激活函数(一):深度学习的成功之源

文章目录 引言基本概念常用激活函数举例Sigmoid激活函数公式Sigmoid函数的数学特性示例基于NumPy和PyTorch实现Sigmoid函数将Sigmoid函数应用于二分类任务 Sigmoid激活函数的局限性举例 ReLU激活函数公式ReLU函数的数学特性ReLU函数的特点示例基于NumPy和PyTorch实现ReLU函数搭…

软件测试/测试开发丨学习笔记之Python控制流-分支、循环

分支判断 什么是分支判断 一条一条语句顺序执行叫做顺序结构分支结构就是在某个判断条件后,选择一条分支去执行 1. IF if condition_1:statement_block_1 elif condition_2:statement_block_2 else:statement_block_32. if 嵌套 在嵌套 if 语句中,可…

文件过大放不了U盘?三个方法非常简单~

文件过大放不了U盘我们可以从文件过大这个角度来解决一下这个问题,可以借助一些工具把文件压缩后,体积变小后,再放入U盘,使得u盘得到高效的利用,下面是推荐的一些好用的软件。 一、嗨格式压缩大师 是一款可以压缩多种…

数据结构学习 Leetcode474 一和零

关键词:动态规划 01背包 一个套路: 01背包:空间优化之后dp【target1】,遍历的时候要逆序遍历完全背包:空间优化之后dp【target1】,遍历的时候要正序遍历 目录 题目: 思路: 复杂…

BloombergGPT—金融领域大模型

文章目录 背景BloombergGPT数据集金融领域数据集通用数据集分词 模型模型结构模型相关参数训练配置训练过程 模型评估评估任务分布模型对比金融领域评估通用领域评估 背景 GPT-3的发布证明了训练非常大的自回归语言模型(LLM)的强大优势。GPT-3有1750亿个…

《深入理解C++11:C++11新特性解析与应用》笔记四

第四章 新手易学,老兵易用 4.1 右尖括号>的改进 在 C98 中,有一条需要程序员规避的规则:如果在实例化模板的时候出现了连续的两个右尖括号 >,那么它们之间需要一个空格来进行分隔,以避免发生编译时的错误。C98 会将>&g…

ubuntu22下安装minconda

bing 搜索 canda install 找到官方网站 https://docs.conda.io/projects/miniconda/en/latest/ 这里我们安装minconda。 官网有安装方法。 mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh…

【K8S 二进制部署】部署单Master Kurbernetes集群

目录 一、基本架构和系统初始化 1、集群架构: 2、操作系统初始化配置: 2.1、关闭防火墙和安全机制: 2.2、关闭swap 2.3、根据规划设置主机名 2.4、三台主机全部互相映射 2.5、调整内核参数 3、时间同步(所有节点时间必须同…

考研结束,以下事情要抓紧做了!

Hello,大家好,我是 Sunday。 首先恭喜大家考研结束,也在这里祝各位考研的同学们可以 成功上岸 ✿✿ヽ(▽)ノ✿。 不过,考试结束并不是一个终点,而是另外一个新的起点。摆在大家面前的,还有很多新的问题&a…

百度CTO王海峰:飞桨开发者已达1070万

目录 写在前面 飞桨开发者已达1070万 文心一言用户规模破亿,日提问量快速增长 写在前面 “文心一言用户规模突破1亿。”12月28日,百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰在第十届WAVE SUMMIT深度学习开发者大会上宣布。会上&…

【AIGC_MIDJOURNEY】专业提示词+配图分析

prompt : landscape of beautiful forest, lush foliage and water falls, crystal clear lake, fire flies, twinkling lights , rococo, art nouveau, --ar 16:9 这个提示词描述了一个美丽的森林景观,包括茂密的植被和瀑布,清澈见底的湖泊,…

干货!一文详解车间管理的五大基本方法

车间管理是制造型企业生产过程中的重要环节,它直接影响着企业的生产效率、成本控制、产品质量以及员工的士气与工作效率。优秀的车间管理不仅能够提升产品的质量和生产力,还能降低运营成本,从而在激烈的市场竞争中为企业赢得优势。 为了帮助…

vue3-13

token可以是后端api的访问依据,一般绝大多数时候,前端要访问后端的api,后端都要求前端请求需要携带一个有效的token,这个token用于用户的身份校验,通过了校验,后端才会向前端返回数据,进行相应的操作,如果没…

Linux的LVM与磁盘配额

一.LVM 1.什么是LVM Logical Volume Manager 逻辑卷管理 能够在保持现有数据不变的情况下,动态调整磁盘容量,从而提高磁盘管理的灵活性 /boot 分区用于存放引导文件,不能基于LVM创建 解释:就是将多个不同的物理卷组合在一起形…

Python高级用法:迭代器(iter)

迭代器 迭代器是一个实现了迭代器协议的容器对象。它基于以下两个方法。 __ next __:返回容器的下一个元素。 __ iter __:返回迭代器本身 迭代器可以利用内置的iter函数和一个序列来创建, 假设我们的序列为[1, 2, 3],迭代器创建过程如下: i…