庙算兵棋推演AI开发初探(4-调用AI模型)

前面讲了如何开展编写规则脚本型Agent(智能体)的方法,现在探究一下如何调用知识型(一般而言的训练出的模型)智能体的方法。
 

这次调用的是庙算平台的demo(网址见图)

下载了“知识+强化学习型”的压缩包,打开里面,进到【ai_demo】文件夹中是这样的:

这里面的agent.py文件也没什么大变化

import json
import os
import random

from .base_agent import BaseAgent
from .map import Map

from .feature_v1 import features as RL_FEATURE
from ai_demo import config, utils
from .model import PPO

from .select_points_fix_r_v7_2 import SelectPoint as SelectPoint

说明中写道

1. 运行所需环境为sdk要求环境,本代码额外需要安装 pytorch,本代码pytorch的版本是2.0.1

2. 本代码包括1个文件夹,2个文件,需要与 train_env 的目录同级
    ai_demo 文件夹,提供示例ai智能体
    train_red_demo.py 文件,提供与示例ai智能体相匹配的训练示例代码
    test_red_demo.py 文件,提供与示例ai智能体相匹配的测试示例代码

3. 赛道一的 ai_demo/agent.py 文件106行与136行,有2个todo需要注意;赛道二的 ai_demo/agent.py 文件102,有1个todo需要注意。

调用这个需要pytorch环境2.0.1。

PS,在自己环境上指定版本安装pytorch的命令:

123

然后我就奇怪,到底是哪里调用所谓的”训练模型“呢?

于是我发现了model.py这个文件

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim


class Critic(nn.Module):

    def __init__(self, state_dim_1, state_dim_2, hidden_dim):
        super(Critic, self).__init__()
        self.Linear11 = nn.Linear(state_dim_1, hidden_dim)
        self.Linear21 = nn.Linear(hidden_dim, hidden_dim)
        self.Linear31 = nn.Linear(hidden_dim, hidden_dim)

………………

看开头,看起来是这个东西。

里面实现了”演员-评论家“这两个类,并且实现了一个PPO类

然后我找在agnet.py文件里找PPO,发现在102行有如下内容

#### TODO 训练与测试的时候要注释掉, 提交的时候需要
#我方算子max 7
self.model = PPO(state_dim_1=1116, state_dim_2=252, hidden_dim=1024, action_dim=output_space,
gamma=config.float_gamma, lamda=config.float_lam, epochs=1000, eps=0.2, lr=config.float_lr)
self.model.load(itr=213)
###

然后发现目录”models“,里面有两个.pth 文件,原来这就是pytorch训练出的模型。

【Pytorch】一文详细介绍 pth格式 文件_pth文件-CSDN博客

转回来,看agent.py文件,这个文件是调用智能体的文件,讲规则智能体的时候我也讲到过

np_bopFeature,  np_globalFeature = self.feature.get_feature(observation)
list_ops_what_logprob_value = self.model.total_forward(np_bopFeature,  np_globalFeature, list_RedComplexActionMask)

list_ops_what_id = []
for tuple_what_prob_value in list_ops_what_logprob_value:
    list_ops_what_id.append(tuple_what_prob_value[0])
assert len(list_ops_what_id) == len(self.list_red_ops_id)

model_actions = utils.cvtModelOutputToEnvActionComplex(list_ops_what_id=list_ops_what_id,
                                                        list_red_ops_id=self.list_my_ops_id,
                                                        list_my_ops_sub_type=self.list_my_ops_sub_type,
                                                        observation=self.observation,
                                                        int_seat=self.seat,
                                                        list_MovePos=list_MovePos,
                                                        Map=self.map,
                                                        int_point_num=self.int_point_num)

这里看到函数,发现是用来接收观测状态的

self.model.total_forward()

而这个函数,就是将模型输出过滤为可执行动作用的

model_actions = utils.cvtModelOutputToEnvActionComplex(
#在utils.py文件中

def cvtModelOutputToEnvActionComplex(list_ops_what_id: tuple,
                                            list_red_ops_id, list_my_ops_sub_type,
                                            observation,
                                            int_seat,
                                            list_MovePos,
                                            Map,
                                               int_point_num) -> list:
    """
    功能:根据各个算子的动作ID等信息,计算环境可执行的动作
    用法:用于网络输出动作之后
    :param tuple_RedOperatorsID: RedAction函数的输出,红方各个算子的动作ID
    :param list_RedOperatorsIDs:
    :param list_RedOperatorsIDs:
    :param observation: 主要用于根据算子ID获取obs当前bop类,进行计算路径
    :param Map_map: core.utils.map 的 Map 类
    :return: list_total_actions 默认值为[], 若非空则内有dict类型的bq可执行动作作为list内的元素
    """

最后返回的值就从这个model_actions列表出来

total_actions += model_actions

调用完毕。


相关链接:

中国人工智能学会 (caai.cn)

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
抱歉,我是一名自然语言处理AI,无法编写代码。不过,以下是一个简单的兵推演的python代码示例,供您参考: ```python # 兵推演 import random # 定义士兵类 class Soldier: def __init__(self, name, attack, defence, hp): self.name = name self.attack = attack self.defence = defence self.hp = hp # 攻击方法 def attack_enemy(self, enemy): # 造成的伤害 = 攻击力 - 防御力 damage = self.attack - enemy.defence # 如果伤害小于等于0,则无效 if damage <= 0: print(f"{self.name}攻击{enemy.name},但是没有造成伤害") else: enemy.hp -= damage print(f"{self.name}攻击{enemy.name},造成了{damage}点伤害") # 是否存活 def is_alive(self): return self.hp > 0 # 定义玩家类 class Player: def __init__(self, name, soldiers): self.name = name self.soldiers = soldiers # 随机选择一个士兵 def select_soldier(self): return random.choice(self.soldiers) # 是否存活 def is_alive(self): for soldier in self.soldiers: if soldier.is_alive(): return True return False # 游戏开始 print("游戏开始!") # 定义两个玩家 player1 = Player("玩家1", [ Soldier("士兵1", 10, 5, 20), Soldier("士兵2", 8, 6, 25), Soldier("士兵3", 12, 4, 18), ]) player2 = Player("玩家2", [ Soldier("士兵4", 10, 5, 20), Soldier("士兵5", 8, 6, 25), Soldier("士兵6", 12, 4, 18), ]) # 游戏循环 while True: # 玩家1选择士兵 soldier1 = player1.select_soldier() # 玩家2选择士兵 soldier2 = player2.select_soldier() # 士兵1攻击士兵2 soldier1.attack_enemy(soldier2) # 如果士兵2死亡,输出信息并退出游戏循环 if not soldier2.is_alive(): print(f"{player1.name}的{soldier1.name}杀死了{player2.name}的{soldier2.name}") break # 士兵2攻击士兵1 soldier2.attack_enemy(soldier1) # 如果士兵1死亡,输出信息并退出游戏循环 if not soldier1.is_alive(): print(f"{player2.name}的{soldier2.name}杀死了{player1.name}的{soldier1.name}") break # 游戏结束 print("游戏结束!") ``` 以上代码只是一个简单的示例,可以根据实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超自然祈祷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值