gpt4 book ai didi

python - 强化学习中如何应对不同的状态空间大小?

转载 作者:行者123 更新时间:2023-12-03 09:32:44 25 4
gpt4 key购买 nike

我正在 A2C 强化学习中工作,在该学习中,我的环境中的代理人数正在增加和减少。由于代理数量的增加和减少,状态空间也将发生变化。我试图解决以这种方式更改状态空间的问题:

  • 如果状态空间超过所选的最大状态空间
    作为n_input,多余的状态空间将由np.random.choice,其中随机选择提供了一种在将状态空间转换为概率后从状态空间创建随机样本的方法。
  • 如果状态空间小于最大状态,则填充状态
    零的空间。
    def get_state_new(state):
    n_features = n_input-len(get_state(env))
    # print("state",len(get_state(env)))
    p = np.array(state)
    p = np.exp(p)
    if p.sum() != 1.0:
    p = p * (1. / p.sum())
    if len(get_state(env)) > n_input:
    statappend = np.random.choice(state, size=n_input, p=p)
    # print(statappend)
    else:
    statappend = np.zeros(n_input)
    statappend[:state.shape[0]] = state
    return statappend

  • 它可以工作,但结果不符合预期,我不知道这是否正确。
    我的问题
    是否有任何有关此类问题的引用文件以及如何应对状态空间的变化?

    最佳答案

    对于本文,我将提供与other post中相同的引用:
    Benchmarks for reinforcement learning minmixed-autonomy traffic
    实际上,在这种方法中,预先确定了预期数量的代理(预计随时会出现在模拟中)。在运行期间,然后将模拟中存在的代理的观测值检索并压缩到固定大小的容器(张量)中(称为整体观测容器),该容器可以包含(预期来自单个代理的)观察者数量与预期数量一样多的观察值(来自单个代理)。随时随地出现在模拟中只是要清楚:size(overall observation container) = expected number of agents * individual observation size。由于模拟中存在的实际代理数可能随时间步长而变化,因此适用以下规则:

  • 如果环境中存在的代理数量少于预期数量,因此提供的观测数量少于整个观测容器所能容纳的数量,则可以使用零填充填充空白的观测插槽。
  • 如果代理人数超过预期的代理人数,则仅使用提供的观察值的一个子集。因此,仅从可用代理的随机选择子集中,将观察结果放入固定大小的整个观察容器中。仅对于选定的代理, Controller 将计算要执行的 Action ,而在仿真中将“多余的代理”视为非受控代理。

  • 回到您的示例代码,有几件事我会做不同的事情。
    首先,我想知道为什么同时拥有变量 state(传递给函数 get_state_new)和调用 get_state(env),因为我希望 get_state(env)返回的信息与已存储在变量 state中的信息相同。提示,如果您可以尝试仅使用 state变量(如果变量和函数调用确实提供了相同的信息),它将使代码更易于阅读。
    我要做的第二件事是如何处理状态: p = np.exp(p)p = p * (1. / p.sum())。这通过所有单独观察中存在的所有指数值的总和来标准化整个观察容器。相反,我将单独对每个观察值进行归一化。
    这有以下原因:如果您提供少量观察值,则与包含大量单独观察值的指数值之和相比,可以预期所有单独观察值中包含的指数值的总和要小。总和中的这些差异随后用于归一化,将导致归一化值的大小不同(大致而言,它是单个观测值数量的函数)。考虑以下示例:
    import numpy as np

    # Less state representations
    state = np.array([1,1,1])
    state = state/state.sum()
    state
    # Output: array([0.33333333, 0.33333333, 0.33333333])

    # More state representations
    state = np.array([1,1,1,1,1])
    state = state/state.sum()
    state
    # Output: array([0.2, 0.2, 0.2, 0.2, 0.2])
    实际上,由单个代理获得的相同输入状态表示,在归一化之后始终将导致相同的输出状态表示,而不管模拟中当前存在的代理数量如何。因此,请确保自行对所有观测值进行归一化。我将在下面举一个例子。
    另外,请确保跟踪将哪些座席的观察(以及按什么顺序)压缩到您的变量 statappend中。这很重要,原因如下。
    如果存在代理 A1A5,但是整个观察容器只能进行三个观察,那么将随机选择五分之三的状态表示形式。假设从以下代理商以下列顺序随机抽取的观测数据被压缩到整个观测容器中: A2, A5, A1。然后,这些特工的观察将严格按照此顺序压缩到整个观察容器中。首先观察 A2,然后观察 A5,最后观察 A1。相应地,给定上述总体观察容器,您的Reinforcement Learning Controller 预测的三个 Action 将分别对应于代理 A2A5A1(顺序!)。换句话说,代理在输入侧的顺序还指示预测 Action 在输出侧对应于哪些代理。
    我会提出如下建议:
    import numpy as np

    def get_overall_observation(observations, expected_observations=5):
    # Return value:
    # order_agents: The returned observations stem from this ordered set of agents (in sequence)

    # Get some info
    n_observations = observations.shape[0] # Actual nr of observations
    observation_size = list(observations.shape[1:]) # Shape of an agent's individual observation

    # Normalitze individual observations
    for i in range(n_observations):
    # TODO: handle possible 0-divisions
    observations[i,:] = observations[i,:] / observations[i,:].max()

    if n_observations == expected_observations:
    # Return (normalized) observations as they are & sequence of agents in order (i.e. no randomization)
    order_agents = np.arange(n_observations)
    return observations, order_agents
    if n_observations < expected_observations:
    # Return padded observations as they are & padded sequence of agents in order (i.e. no randomization)
    padded_observations = np.zeros([expected_observations]+observation_size)
    padded_observations[0:n_observations,:] = observations
    order_agents = list(range(n_observations))+[-1]*(expected_observations-n_observations) # -1 == agent absent
    return padded_observations, order_agents
    if n_observations > expected_observations:
    # Return random selection of observations in random order
    order_agents = np.random.choice(range(n_observations), size=expected_observations, replace=False)
    selected_observations = np.zeros([expected_observations] + observation_size)
    for i_selected, i_given_observations in enumerate(order_agents):
    selected_observations[i_selected,:] = observations[i_given_observations,:]
    return selected_observations, order_agents


    # Example usage
    n_observations = 5 # Number of actual observations
    width = height = 2 # Observation dimension
    state = np.random.random(size=[n_observations,height,width]) # Random state
    print(state)
    print(get_overall_observation(state))

    关于python - 强化学习中如何应对不同的状态空间大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63728800/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com