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

2024-01-02 02:12

本文主要是介绍庙算兵棋推演AI开发初探(3-编写策略(下)),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这回从解读step函数中的这两句代码开始,返回的action是真正做出的行为

gen_action = self.priority[action_type]
action = gen_action(obj_id, valid_actions[action_type])

追到self.priority 结果是一套定义

        self.priority = {ActionType.Occupy: self.gen_occupy,ActionType.Shoot: self.gen_shoot,ActionType.GuideShoot: self.gen_guide_shoot,ActionType.JMPlan: self.gen_jm_plan,ActionType.LayMine: self.gen_lay_mine,ActionType.ActivateRadar: self.gen_activate_radar,ActionType.ChangeAltitude: self.gen_change_altitude,ActionType.GetOn: self.gen_get_on,ActionType.GetOff: self.gen_get_off,ActionType.Fork: self.gen_fork,ActionType.Union: self.gen_union,ActionType.EnterFort: self.gen_enter_fort,ActionType.ExitFort: self.gen_exit_fort,ActionType.Move: self.gen_move,ActionType.RemoveKeep: self.gen_remove_keep,ActionType.ChangeState: self.gen_change_state,ActionType.StopMove: self.gen_stop_move,ActionType.WeaponLock: self.gen_WeaponLock,ActionType.WeaponUnFold: self.gen_WeaponUnFold,ActionType.CancelJMPlan: self.gen_cancel_JM_plan}  # choose action by priority

仔细看一下,原来是类似于函数指针的写法,将一堆变量指向了一堆函数,然后在代码里定义了诸多的函数。

比如……gen_move函数,就是得到一个路径列表的返回值。

    def gen_move(self, obj_id, candidate):"""Generate move action to a random city."""bop = self.get_bop(obj_id)if bop["sub_type"] == 3:returndestination = random.choice([city["coord"] for city in self.observation["cities"]])if self.my_direction:destination = self.my_direction["info"]["target_pos"]if bop and bop["cur_hex"] != destination:move_type = self.get_move_type(bop)route = self.map.gen_move_route(bop["cur_hex"], destination, move_type)return {"actor": self.seat,"obj_id": obj_id,"type": ActionType.Move,"move_path": route,}
  1. 获取实体的当前位置(bop)。
  2. 如果实体的子类型为3,则直接返回一个空操作,因为该实体无法执行移动操作。
  3. 随机选择一个城市作为目的地。
  4. 如果机器人和目的地之间存在路径,则生成一个移动操作,其中actor表示执行该操作的实体(即self.seat),obj_id表示执行该操作的实体ID,type表示动作类型为ActionType.Movemove_path表示实体的移动路径。

这里map.gen_move_route函数和self.get_move_type函数又引用自其他地方编写的。

——

上一篇已经写了,调用起来就是遍历单位、找到合理的动作,再去使用编写的获取具体哪个动作的函数。

        # loop all bops and their valid actionsfor obj_id, valid_actions in observation["valid_actions"].items():if obj_id not in self.controllable_ops:continuefor (action_type) in self.priority:  # 'dict' is order-preserving since Python 3.6if action_type not in valid_actions:continue# find the action generation method based on typegen_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# if total_actions:#     print(#         f'{self.color} actions at step: {observation["time"]["cur_step"]}', end='\n\t')#     print(total_actions)return total_actions

就是上面这段,重点是本篇博文开始时提到的那两行。


基本流程至此都看明白了,那么如何编写一个策略呢?

这篇关于庙算兵棋推演AI开发初探(3-编写策略(下))的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/561062

相关文章

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的