OpenAI Gym 中级教程——多智能体系统

Python OpenAI Gym 中级教程:多智能体系统

在强化学习中,多智能体系统涉及到多个智能体相互作用的情况。在本篇博客中,我们将介绍如何在 OpenAI Gym 中构建和训练多智能体系统,并使用 Multi-Agent Deep Deterministic Policy Gradients(MADDPG)算法进行协同训练。

1. 安装依赖

首先,确保你已经安装了 OpenAI Gym 和其他必要的依赖:

pip install gym
pip install numpy
pip install tensorflow
pip install matplotlib

2. 多智能体环境

我们将以一个简单的多智能体环境为例,该环境称为 MultiAgentEnv,其中包含两个智能体,它们分别控制两辆小车,目标是使两辆小车在一个二维平面上协同移动,避免相互碰撞。

import gym
from gym import spaces
import numpy as npclass MultiAgentEnv(gym.Env):def __init__(self):super(MultiAgentEnv, self).__init__()# 定义动作空间和观察空间self.action_space = spaces.Discrete(5)  # 5个离散动作self.observation_space = spaces.Box(low=0, high=1, shape=(4,), dtype=np.float32)  # 连续观察空间,包含4个状态# 初始化两辆小车的状态self.agent1_state = np.array([0.2, 0.5, 0.0, 0.0])self.agent2_state = np.array([0.8, 0.5, 0.0, 0.0])def reset(self):# 重置环境,将两辆小车放置在初始位置self.agent1_state = np.array([0.2, 0.5, 0.0, 0.0])self.agent2_state = np.array([0.8, 0.5, 0.0, 0.0])return np.concatenate([self.agent1_state, self.agent2_state])def step(self, actions):# 执行动作,更新两辆小车的状态并返回奖励和观察结果self.agent1_state[0] += 0.1 * (actions[0] - 2)self.agent1_state[1] += 0.1 * (actions[1] - 2)self.agent2_state[0] += 0.1 * (actions[2] - 2)self.agent2_state[1] += 0.1 * (actions[3] - 2)# 规定状态范围在 [0, 1] 之间self.agent1_state[:2] = np.clip(self.agent1_state[:2], 0, 1)self.agent2_state[:2] = np.clip(self.agent2_state[:2], 0, 1)# 计算奖励reward1 = -np.linalg.norm(self.agent1_state[:2] - self.agent2_state[:2])reward2 = -np.linalg.norm(self.agent2_state[:2] - self.agent1_state[:2])# 返回观察结果、奖励、是否终止和其他信息return np.concatenate([self.agent1_state, self.agent2_state]), [reward1, reward2], False, {}

3. MADDPG 算法

接下来,我们将实现 MADDPG 算法。为了简化,我们将只实现两个智能体的情况。

import tensorflow as tf
from tensorflow.keras import layersclass ActorCritic(tf.keras.Model):def __init__(self, num_actions):super(ActorCritic, self).__init__()# 定义Actor网络self.actor_fc1 = layers.Dense(64, activation='relu')self.actor_fc2 = layers.Dense(64, activation='relu')self.actor_output = layers.Dense(num_actions, activation='softmax')# 定义Critic网络self.critic_fc1 = layers.Dense(64, activation='relu')self.critic_fc2 = layers.Dense(64, activation='relu')self.critic_output = layers.Dense(1, activation='linear')def call(self, state):# Actor网络输出动作概率actor_x = self.actor_fc1(state)actor_x = self.actor_fc2(actor_x)action_probs = self.actor_output(actor_x)# Critic网络输出状态值critic_x = self.critic_fc1(state)critic_x = self.critic_fc2(critic_x)state_value = self.critic_output(critic_x)return action_probs, state_value

4. 训练多智能体系统

现在,我们将使用 MADDPG 算法来训练多智能体系统。

def train_maddpg(env, model1, model2, optimizer1, optimizer2, num_episodes=1000, gamma=0.99):for episode in range(num_episodes):state = env.reset()state = tf.convert_to_tensor(state, dtype=tf.float32)total_reward1 = 0total_reward2 = 0with tf.GradientTape() as tape1, tf.GradientTape() as tape2:for t in range(1000):  # 最多运行1000个时间步action_probs1, state_value1 = model1(state[None, :])action1 = tf.random.categorical(tf.math.log(action_probs1), 1)[0, 0]action_probs2, state_value2 = model2(state[None, :])action2 = tf.random.categorical(tf.math.log(action_probs2), 1)[0, 0]next_state, rewards, done, _ = env.step([action1.numpy(), action2.numpy()])next_state = tf.convert_to_tensor(next_state, dtype=tf.float32)total_reward1 += rewards[0]total_reward2 += rewards[1]action_probs1_next, _ = model1(next_state[None, :])action_probs2_next, _ = model2(next_state[None, :])# 计算Advantage和Targetadvantage1 = rewards[0] + gamma * tf.reduce_max(action_probs1_next) - state_value1advantage2 = rewards[1] + gamma * tf.reduce_max(action_probs2_next) - state_value2target1 = rewards[0] + gamma * tf.reduce_max(action_probs1_next)target2 = rewards[1] + gamma * tf.reduce_max(action_probs2_next)# 计算Actor和Critic的损失loss_actor1 = -tf.math.log(action_probs1[0, action1]) * advantage1loss_actor2 = -tf.math.log(action_probs2[0, action2]) * advantage2loss_critic1 = tf.square(target1 - state_value1)loss_critic2 = tf.square(target2 - state_value2)# 计算总损失total_loss1 = loss_actor1 + loss_critic1total_loss2 = loss_actor2 + loss_critic2# 更新参数gradients1 = tape1.gradient(total_loss1, model1.trainable_variables)optimizer1.apply_gradients(zip(gradients1, model1.trainable_variables))gradients2 = tape2.gradient(total_loss2, model2.trainable_variables)optimizer2.apply_gradients(zip(gradients2, model2.trainable_variables))if episode % 10 == 0:print(f"Episode: {episode}, Total Reward Agent 1: {total_reward1}, Total Reward Agent 2: {total_reward2}")

5. 主函数

最后,我们将定义一个主函数来运行我们的多智能体系统。

if __name__ == "__main__":# 创建多智能体环境和模型env = MultiAgentEnv()model1 = ActorCritic(num_actions=5)model2 = ActorCritic(num_actions=5)# 创建优化器optimizer1 = tf.optimizers.Adam(learning_rate=0.001)optimizer2 = tf.optimizers.Adam(learning_rate=0.001)# 训练多智能体系统train_maddpg(env, model1, model2, optimizer1, optimizer2, num_episodes=500)

通过这个示例,我们演示了如何在 OpenAI Gym 中构建一个简单的多智能体环境,并使用 MADDPG 算法对多智能体系统进行协同训练。这个示例可以作为入门多智能体强化学习的起点,同时展示了 TensorFlow 和 OpenAI Gym 在多智能体环境中的基本应用。希望这篇博客对你理解和应用多智能体系统有所帮助。

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

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

相关文章

Unity_Shader

Unity_Shader 目录 Unity_Shader 带着问题开始: Shader Graph 开始吧!

【NLP冲吖~】一、朴素贝叶斯(Naive Bayes)

0、朴素贝叶斯法 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入输出的联合概率分布,然后基于此模型,对给定的输入 x x x,利用贝叶斯定理求出后验概率最大的…

【Spring Boot 3】应用启动执行特定逻辑

【Spring Boot 3】应用启动执行特定逻辑 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花…

element-ui button 仿写 demo

基于上篇 button 源码分享写了一个简单 demo&#xff0c;在写 demo 的过程中&#xff0c;又发现了一个小细节&#xff0c;分享一下&#xff1a; 1、组件部分&#xff1a; <template><buttonclass"yss-button"click"handleClick":class"[ty…

STM32目录结构

之前一直头疼的32目录&#xff0c;比51复杂&#xff0c;又没有C规律&#xff0c;也不像python脚本文件关联不强&#xff0c;也不像工整的FPGA工程&#xff0c;编的时候到处放&#xff0c;爆出的错千奇百怪。短暂整理了一个&#xff0c;还是没有理得很轻。 startup_stm32f10x_m…

基于python+django,我开发了一款药店信息管理系统

功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 功能包括&#xff1a;药品管理、分类管理、顾客管理、用户管理、日志管理、系统信息模块。 代码结构 server目录是后端代码web目录是前端代码 部署运行…

2024年1月29日-2月4日(全面进行+收集虚幻商城免费资源)

从上周发现&#xff0c;一轮轮推就行&#xff0c;每轮多个时间片&#xff0c;每个时间片一门。周一到周五一轮&#xff0c;周六日多轮&#xff08;比如上下午各一轮&#xff09;。 周一&#xff1a; 7&#xff1a;09–9&#xff1a;20卫星导航定位&#xff08;p3&#xff09;&a…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(十六)

商家端订单管理模块 1. 订单搜索1.1 需求分析和设计1.2 代码实现1.2.1 admin/OrderController1.2.2 OrderService1.2.3 OrderServiceImpl 2. 各个状态的订单数量统计2.1 需求分析和设计2.2 代码实现2.2.1 admin/OrderController2.2.2 OrderService2.2.3 OrderServiceImpl2.2.4 …

浅谈UI自动化测试

为了让对自动化技术感兴趣的朋友们有真实案例的支持&#xff0c;今天我们给大家带来一期适合新手的UI自动化测试介绍。我们的目标是让大家能够轻松理解UI自动化测试的概念&#xff0c;并且能够亲自动手去实践。通过这个介绍&#xff0c;大家能够对UI自动化测试有一个整体的理解…

Python:列表、元组和字典

3.1 序列简介 所谓序列&#xff0c;指的就是一种包含多项数据的数据结构&#xff0c;序列包含的多个数据项&#xff08;也叫成员&#xff09;按顺序排列&#xff0c;可通过索引来访问成员。 3.1.1 python的序列 python的常见序列类型包括字符串、列表 和元组等。 列表和元组…

HTML 相关知识点记录

<div> </div> DIV标签详细介绍-CSDN博客 div 是 division 的简写&#xff0c;division 意为分割、区域、分组。比方说&#xff0c;当你将一系列的链接组合在一起&#xff0c;就形成了文档的一个 division。 <p>标签&#xff1a;定义段落

【Linux C | I/O模型】Unix / Linux系统的5种IO模型 | 图文详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

2016年苏州大学837复试机试C/C++

2016年苏州大学复试机试 第一题 题目 公鸡5元一只&#xff0c;母鸡3元一只&#xff0c;幼鸡1元3只。若100元钱买了100只鸡&#xff0c;问其中公鸡、母鸡、幼鸡各多少只&#xff1f; 博主注&#xff1a;此题经典百元买百鸡问题&#xff0c;出自&#xff1a;公元5世纪末&#…

2024数学建模美赛选题建议及各题思路来了

大家好呀&#xff0c;美赛数学建模开始了&#xff0c;来说一下初步的选题建议吧&#xff1a; 首先定下主基调&#xff0c;本次亚太杯推荐选择C题/F题。 ABD题较为硬核&#xff0c;仅推荐有相关专业背景的人选择&#xff0c;E题需要搜集的数据以及对于数据的要求极高&#xff…

模拟钉钉官网动画

实现思路&#xff1a;利用粘性定位sticky&#xff0c;以及滚动事件实现。首先我们应该设置滚动动画开始位置和结束位置 &#xff0c;然后根据位置计算透明度或者transform&#xff0c;scale的值。 首先根据上述图线计算属性值&#xff0c;代码如下&#xff1a; function creat…

PHP漏洞查询

CVE - Search CVE List (mitre.org) 美国国家漏洞数据库&#xff08;需要梯子&#xff09; NATIONAL VULNERABILITY DATABASE NVD - Search and Statistics (nist.gov) 基本都能查询到&#xff0c;传结果详情页里面会有一些解决方案的连接 PHP的官方网站 PHP :: Bugs :: Se…

C语言探索:水仙花数的奥秘与计算

摘要&#xff1a; 水仙花数&#xff0c;一种特殊的三位数&#xff0c;其各位数字的立方和等于该数本身。本文将详细介绍水仙花数的定义、性质&#xff0c;以及如何使用C语言来寻找100至999范围内的水仙花数。 目录 一、水仙花数的定义与性质 二、用C语言寻找100至999范围内的…

Camunda 流程引擎API介绍

&#x1f496;专栏简介 ✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。 ✔️文章中只包含演示核心代码及测试数据&#xff0c;完整代码可查看作者的开源项目snail-camunda ✔️请给snail-camunda 点颗星吧&#x1f618; &#x1f496;Services …

病历管理系统

技术架构&#xff1a; StrutsSpringHibernate 有需要该项目的小伙伴可以私信我你的Q。 功能描述&#xff1a; 企业财务管理系统主要用于电子病历来提高医院各项工作的效率和质量&#xff0c;促进医学科研、教学&#xff1b;减轻各类事务性工作的劳动强度&#xff0c;使他们…

2024美赛数学建模E题思路代码分析

美赛思路已更新&#xff0c;文末名片可以获取更多思路。并且领取资料 E题思路 这个题目就是去开发一个模型来帮助保险公司决定是否在极端天气事件增多的地区承保。他的背景就是在极端天气事件越来越频繁的背景下&#xff0c;房产保险的可持续性。这个问题不仅关系到保险公司的…