首页 > 其他分享 >多智能体环境设计(三)

多智能体环境设计(三)

时间:2024-09-02 18:55:32浏览次数:6  
标签:agents self 环境 pos agent 智能 spaces grid 设计

多智能体环境设计:高级主题与实践应用

引言

欢迎来到我们多智能体环境系列的第三篇博客!在前两篇文章中,我们介绍了基础概念和接口设计。今天,我们将深入探讨多智能体环境的高级主题,包括复杂场景设计、智能体交互机制、环境动态性,以及一些实际应用案例。本文旨在帮助初学者更好地理解和应用多智能体环境技术。

1. 复杂场景设计

在实际应用中,多智能体环境通常比简单的网格世界更加复杂。让我们看看如何设计一些更加真实的场景。

1.1 异构智能体环境

在许多实际情况下,环境中的智能体可能具有不同的能力和特征。让我们设计一个包含不同类型机器人的仓库环境:

import numpy as np
from gymnasium import spaces
from pettingzoo import AECEnv
from pettingzoo.utils import agent_selector

class HeterogeneousWarehouseEnv(AECEnv):
    def __init__(self, grid_size=20, n_carriers=3, n_sorters=2, n_shelves=30):
        super().__init__()
        self.grid_size = grid_size
        self.grid = np.zeros((grid_size, grid_size), dtype=int)
        
        self.possible_agents = ([f"carrier_{
     i}" for i in range(n_carriers)] + 
                                [f"sorter_{
     i}" for i in range(n_sorters)])
        self.agent_types = {
   agent: agent.split('_')[0] for agent in self.possible_agents}
        
        self.shelves = self._place_shelves(n_shelves)
        self.sorting_stations = self._place_sorting_stations(n_sorters)
        
        self.action_spaces = {
   agent: spaces.Discrete(5) for agent in self.possible_agents}  # 4个方向 + 停留
        self.observation_spaces = {
   agent: self._get_obs_space() for agent in self.possible_agents}

    def _place_shelves(self, n_shelves):
        shelves = []
        for _ in range(n_shelves):
            pos = self._get_random_empty_position()
            self.grid[pos] = 2  # 2 表示货架
            shelves.append(pos)
        return shelves

    def _place_sorting_stations(self, n_stations):
        stations = []
        for _ in range(n_stations):
            pos = self._get_random_empty_position()
            self.grid[pos] = 3  # 3 表示分拣站
            stations.append(pos)
        return stations

    def _get_obs_space(self):
        return spaces.Dict({
   
            "position": spaces.Box(low=0, high=self.grid_size-1, shape=(2,), dtype=int),
            "grid": spaces.Box(low=0, high=3, shape=(self.grid_size, self.grid_size), dtype=int),
            "carrier_positions": spaces.Dict({
   agent: spaces.Box(low=0, high=self.grid_size-1, shape=(2,), dtype=int) 
                                              for agent in self.possible_agents if 'carrier' in agent}),
            "sorter_positions": spaces.Dict({
   agent: spaces.Box(low=0, high=self.grid_size-1, shape=(2,), dtype=int) 
                                             for agent in self.possible_agents if 'sorter' in agent}),
            "carrying_item": spaces.Discrete(2)  # 0: 没有携带物品, 1: 携带物品
        })

    def reset(self, seed=None, options=None):
        self.agents = self.possible_agents[:]
        self.agent_positions = {
   agent: self._get_random_empty_position() for agent in self.agents}
        self.carrying_items = {
   agent: 0 for agent in self.agents if 'carrier' in agent}
        
        self.agent_selector = agent_selector(self.agents)
        self.agent_selection = self.agent_selector.next()

        observations = {
   agent: self._get_obs(agent) for agent in self.agents}
        return observations, {
   }

    def step(self, action):
        agent = self.agent_selection
        current_pos = self.agent_positions[agent]
        new_pos = self._get_new_position(current_pos, action)

        if self._is_valid_move(agent, new_pos):
            self.agent_positions[agent] = new_pos

        # 处理特定类型智能体的行为
        if self.agent_types[agent] 

标签:agents,self,环境,pos,agent,智能,spaces,grid,设计
From: https://blog.csdn.net/weixin_46246346/article/details/141784446

相关文章

  • 人工智能相关学科的关系
    禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码......
  • 设计模式-工厂方法模式
    ......
  • 设计模式之备忘录模式
    备忘录模式(MementoPattern)官方的定义是这样的:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。它是面向对象的23种设计模式中的一种,属于行为模式的范围。直白点说就是:我们可以在不暴露更多字段的前提下,直接将......
  • 线性表之队列API设计思路
    Java学习手册+面试指南:https://javaxiaobear.cn队列是一种基于先进先出(FIFO)的数据结构,是一种只能在一端进行插入,在另一端进行删除操作的特殊线性表,它按照先进先出的原则存储数据,先进入的数据,在读取数据时先读被读出来。1、队列的API设计类名Queue构造方法Queue():创建Queue对象成......
  • 运营必备:微信智能统计,让您的效率翻倍!
        如今,无论是个人社交还是商业运营,都离不开微信。然而,随着微信账号的增多,数据管理变得越来越复杂。那么如何有效管理多个微信账号的数据呢?今天,我们将分享微信管理系统,能够帮助您轻松实现数据的自动统计和报表生成,让微信运营更加高效!01多号同时登录,聚合管理   ......
  • Java 最小优先队列API设计与实现
    Java学习+面试指南:https://javaxiaobear.cn最小的元素放在数组的索引1处。每个结点的数据总是小于等于它的两个子结点的数据。1、API设计类名MinPriorityQueue构造方法MinPriorityQueue(intcapacity):创建容量为capacity的MinPriorityQueue对象成员方法privatebooleanless(inti......
  • Java 堆的设计,如何用堆进行排序
    Java学习+面试指南:https://javaxiaobear.cn1、堆的定义堆是计算机科学中一类特殊的数据结构的统称,堆通常可以被看做是一棵完全二叉树的数组对象。1、堆的特性它是完全二叉树,除了树的最后一层结点不需要是满的,其它的每一层从左到右都是满的,如果最后一层结点不是满的,那么要求左满右......
  • Java最大优先队列设计与实现
    Java学习+面试指南:https://javaxiaobear.cn1、API设计类名MaxPriorityQueue构造方法MaxPriorityQueue(intcapacity):创建容量为capacity的MaxPriorityQueue对象成员方法privatebooleanless(inti,intj):判断堆中索引i处的元素是否小于索引j处的元素privatevoideach(inti,int......
  • Java索引优先队列设计思路与实现
    Java学习+面试指南:https://javaxiaobear.cn1、实现思路存储数据时,给每一个数据元素关联一个整数,例如insert(intk,Tt),我们可以看做k是t关联的整数,那么我们的实现需要通过k这个值,快速获取到队列中t这个元素,此时有个k这个值需要具有唯一性。最直观的想法就是我们可以用一个T[]ite......
  • 数据结构与算法——符号表API设计及有序符号表设计
    Java学习手册+面试指南:https://javaxiaobear.cn符号表最主要的目的就是将一个键和一个值联系起来,符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据,我们可以根据键来查找对应的值。符号表中,键具有唯一性。符号表的应用:应用查找目的键值字典找出单词的释义单词释义图......