我为 PPO 代理初始化了环境,但遇到了此错误。
AssertionError: The algorithm only supports (<class 'gymnasium.spaces.box.Box'>, <class 'gymnasium.spaces.discrete.Discrete'>, <class 'gymnasium.spaces.multi_discrete.MultiDiscrete'>, <class 'gymnasium.spaces.multi_binary.MultiBinary'>) as action spaces but Discrete(3) was provided.
这是错误部分中的另一条语句。是空间离散引起的问题吗?
这是代码:
class CustomEnv(gymnasium.Env):
def __init__(self, dataset, columns):
super(CustomEnv, self).__init__()
if dataset is None:
raise ValueError("The dataset must be provided.")
if columns is None:
raise ValueError("The columns must be provided.")
self.dataset = dataset
self.columns = columns
if not isinstance(dataset, pd.DataFrame):
raise ValueError("The dataset must be a DataFrame.")
self.dataset = dataset
self.initial_balance = 10000 # Initial balance for trading
self.current_step = 0 # Current step in the dataset
self.balance = self.initial_balance
self.holding = 0 # Number of units of the asset held by the agent
# Use "MPN5P" as the price column
self.price_column = "MPN5P"
self.current_price = self.dataset[self.price_column].iloc[self.current_step] # Current price of the asset
self.action_space = spaces.Discrete(3) # Three actions: 0 = buy, 1 = sell, 2 = hold
self.observation_space = spaces.Box(low=0, high=1, shape=(1,), dtype=np.float32)
self.columns = columns
我期待环境能够正确初始化和训练。但它要么导致 NaN 错误,要么导致 AssertionError。
我相信这应该是 Gymnasium 版本的问题。
查看他们的网站,他们以同样的方式定义了一个离散的动作空间根据这个,用
spaces.Discrete(3)
。'gymnasium.spaces.discrete.Discrete'
是您的操作空间的正确类,暗示您应该使用 spaces.discrete.Discrete(3)
来代替。您可以尝试一下,根据错误它应该起作用。令人惊讶的是,here您也可以看到,根据文档,您不必将“离散”部分放在中间,所以我猜您有一个过时的版本。在其他情况下,请检查您的 Gymnasium 版本(不是 OpenAI Gym),看看它是否太旧。
否则,我只能想到 OpenAI Gym 和 Farama's Gymnasium 都存在的一些错误,并导致它们之间的差异导致一些问题(但我发现这不太可能)。