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

news2025/1/16 2:00:15

开始研读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 = item
                    if 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.6
                if 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 time
        return 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.coloradmin.cn/o/1340756.html

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

相关文章

快速上手makefile自动化构建工具

makefile自动化构建工具 文章目录 makefile自动化构建工具 makefile背景 简单认识makefile 依赖关系与依赖方法 生成项目 清理项目 ACM时间 语法补充 .PHONY修饰 特殊符号替换 Makefile的推导过程 总结 前言: 在windows下,很多东西都是编译器直接帮你做…

Java EasyExcel 导入代码

Java EasyExcel 导入代码 导入方法 /*** 仓库库位导入** param req* param res* param files* throws Exception*/RequestMapping(value {"/import/line_store_locs"}, method {RequestMethod.POST})ResponseBodypublic void importStoreLoc(HttpServletRequest …

关于Redis面试题

前言 之前为了准备面试,收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文:https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv Redis 是什么 全名:远程字典服务。这是一个开源的在内存中的数据结构存…

中职网络安全Web2003-2——Web渗透测试

需要环境或换,有问题可以私信我或加Q 1.通过URL访问http://靶机IP/1,对该页面进行渗透测试,将完成后返回的结果内容作为Flag值提交; FLAGflag{htmlcode} 2.通过URL访问http://靶机IP/2,对该页面进行渗透测试&#xff…

设计模式(4)--对象行为(6)--备忘录

1. 意图 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 这样以后可以将该对象恢复到原先保存的状态。 2. 三种角色 原发器(Originator)、备忘录(Memento)、负责人(Caretaker) 3. 优点 3.1 保持了封装边界。屏蔽了原发器的…

汇编语言学习中的Dosbox自动配置方法

学到期末才发现可以自动配置 一、先找到dosbox的下载/安装路径 二、打开其下的Dosbox *.**(这里是版本号) Options.bat 三、在其打开的文件的最下面输入你经常打开dosbox要输入的内容 例如: mount c e:\masm c:

C++day3作业

#include <iostream>using namespace std;class Person {int *age;string &name; public: // Person() // {// }Person(int a,string &b):age(new int(a)),name(b){cout << "Person的有参构造" << endl;}Person(const Person &am…

关于设计模式、Java基础面试题

前言 之前为了准备面试&#xff0c;收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文&#xff1a;https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv 设计模式 单例共有几种写法&#xff1f; 细分起来就有9种&#xff1a;懒汉&#x…

信号与线性系统翻转课堂笔记15——离散LTI系统模型分析

信号与线性系统翻转课堂笔记15——离散LTI系统模型分析 The Flipped Classroom15 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#xff0c;重点&…

Java 基础学习(十八)多线程进阶、网络编程基础

1 并发工具包 1.1 并发工具包概述 1.1.1 什么是并发工具包 Java并发工具包是指java.util.concurrent&#xff08;简称JUC&#xff09;&#xff0c;在Java 5 版本中添加。JUC中包含了大量在并发应用开发中非常实用的工具类。 行业中说的JUC一般包含java.util.concurrent包、…

C# WPF上位机开发(报表导出)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于在工厂上班的小伙伴来说&#xff0c;导出生产数据、生成报表&#xff0c;这是很习以为常的一个工作。之前的文章中&#xff0c;虽然我们也介绍…

【10】ES6:Promise 对象

一、同步和异步 1、JS 是单线程语言 JavaScript 是一门单线程的语言&#xff0c;因此同一个时间只能做一件事情&#xff0c;这意味着所有任务都需要排队&#xff0c;前一个任务执行完&#xff0c;才会执行下一个任务。但是&#xff0c;如果前一个任务的执行时间很长&#xff…

踩坑RV1106板端部署rknn模型

文章目录 1、交叉编译2、板上跑通3、验证自己模型 1、交叉编译 官方给的一个流程: RKNN 模型推理测试为了避免踩坑在开头提出来 按照官方的流程可以跑通&#xff0c;他自己提供的yolov5s.rknn&#xff08;640*640&#xff09;的模型&#xff0c;但是跑自己的模型的时候加载就会…

SAP VA01 创建带wbs号的销售订单包 CJ067的错误

接口错误提示如下 SAP官方 CJ067 124177 - VA01: CJ067 during WBS acct assgmt with a different business area S4的core 刚好能用上 实施 这个note后成功

「Kafka」生产者篇

「Kafka」生产者篇 生产者发送消息流程 在消息发送的过程中&#xff0c;涉及到了 两个线程 ——main 线程和Sender 线程。 在 main 线程中创建了 一个 双端队列 RecordAccumulator。 main线程将消息发送给RecordAccumulator&#xff0c;Sender线程不断从 RecordAccumulator…

多线程编程(三)互斥量

因为他继承于QObject类所以需要构造函数和析构函数。 有几个人就创建几个线程。

【SAM系列】Auto-Prompting SAM for Mobile Friendly 3D Medical Image Segmentation

论文链接&#xff1a;https://arxiv.org/pdf/2308.14936.pdf 核心&#xff1a; finetune SAM,为了不依赖外部prompt&#xff0c;通过将深层的特征经过一个编-解码器来得到prompt embedding&#xff1b;finetune完之后做蒸馏

Visual Studio Code安装下载及安装自用版

Visual Studio Code安装下载及安装自用版 vscode 我愿称之为最强&#xff0c;赶紧下载吧&#xff0c;用起来再说。微软牛逼。 安装过程也非常简单。 一、下载 Visual Studio Code下载地址 1.选择要下载的客户端的版本&#xff0c;直接下载稳定版的 注意&#xff1a; 下载后&…

OpenEular23.09(欧拉)操作系统为企业搭建独立的K8S集群环境,详细流程+截图

1.环境&#xff1b; win10&#xff0c;vmware16 pro&#xff0c;openeular23.09 集群模式&#xff1a;一主二从 主机硬件配置 主机名IP角色CPU内存硬盘k8s-master01192.168.91.100master4C4G40Gk8s-worker02192.168.91.101worker(node)4C4G40Gk8s-worker03192.168.91.102work…

Matlab:非线性规划

1、语法&#xff1a; xfmincon(fun,x0,A,b) xfmincon(fun,x0,A,b,Aeq,beq) xfmincon(fun,x0,A,b,Aeq,beq,lb,ub) xfmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) xfmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) xfmincon(problem) [x,fval]fmincon(___) [x,fval,exitflag,…