from kaiwu_agent.utils.common_func import create_cls, attached
SampleData = create_cls("SampleData", state=None, action=None, reward=None)
ObsData = create_cls("ObsData", feature=None)
ActData = create_cls("ActData", act=None)
@attached
def observation_process(raw_obs):
# 默认仅使用位置信息作为特征, 如进行额外特征处理, 则需要对算法的Policy结构, predict, exploit, learn进行相应的改动
# pos = int(raw_obs[0])
# treasure_status = [int(item) for item in raw_obs[-10:]]
# state = 1024 * pos + sum([treasure_status[i] * (2**i) for i in range(10)])
# return ObsData(feature=int(state))
return ObsData(feature=int(raw_obs[0]))
@attached
def action_process(act_data):
return act_data.act
@attached
def sample_process(list_game_data):
return [SampleData(**i.__dict__) for i in list_game_data]
def reward_shaping(frame_no, score, terminated, truncated, obs):
reward = 0
# Using the environment's score as the reward
# 奖励1. 使用环境的得分作为奖励
reward += score
# Penalty for the number of steps
# 奖励2. 步数惩罚
if not terminated:
reward += -1
# The reward for being close to the finish line
# 奖励3. 靠近终点的奖励:
# The reward for being close to the treasure chest (considering only the nearest one)
# 奖励4. 靠近宝箱的奖励(只考虑最近的那个宝箱)
return reward
这是一段我在实现特征处理和样本处理的代码,接下来将完善和优化它
优化算法可以从几个方面入手:特征工程,设计回报,模型架构(卷积神经网络),选择优化器,算法剪枝等等。
1.补充reward回报
def reward_shaping(frame_no, score, terminated, truncated, obs, config=REWARDS_CONFIG):
reward = 0
# 使用环境的得分作为奖励
reward += score * config['score_weight']
# 步数惩罚
if not terminated:
reward += config['step_penalty_weight']
# 靠近终点的奖励,假设终点的位置是100
distance_to_finish = 100 - obs[0] if obs[0] < 100 else 0
reward += distance_to_finish * config['close_to_finish_bonus']
# 靠近宝箱的奖励,假设宝箱位置存储在obs的最后几个元素中
treasure_positions = obs[-10:] # 假设最后10个元素是宝箱位置
if treasure_positions: # 确保有宝箱位置数据
closest_treasure_distance = min(treasure_positions, key=lambda pos: abs(pos - obs[0]))
reward += (1 / abs(obs[0] - closest_treasure_distance)) * config['close_to_treasure_bonus']
return reward
2.特征工程的优化
特征选择:你目前使用的位置信息作为特征。考虑是否需要加入其他信息,比如速度、加速度、与目标的距离等,来提供更丰富的环境状态表示。
特征转换:考虑使用非线性变换来增强模型的表达能力,例如对特征进行对数变换、平方或开方等。
特征组合:尝试组合不同的特征来形成新的特征,例如,将位置和速度组合起来可能表示智能体的移动方向。
特征缩放:如果使用梯度下降算法,确保特征在一个合适的范围内,以避免数值稳定性问题。
特征归一化:将特征缩放到0到1之间或均值为0,标准差为1,以加快学习速度并提高模型性能。
特征编码:如果特征中包含类别数据,考虑使用独热编码或标签编码。
特征重要性评估:使用特征重要性分析来识别哪些特征对模型预测最为重要,这可以帮助去除冗余特征。
动态特征:考虑环境状态随时间变化的特性,可以设计一些基于时间序列的特征。
环境交互特征:考虑智能体与环境的交互,例如智能体的行为对环境的影响。
奖励塑形:你已经实现了奖励塑形,但可以进一步优化,比如根据智能体的行为或环境状态动态调整奖励权重。
# 特征转换函数:归一化
def normalize_feature(feature):
return (feature - np.min(feature)) / (np.max(feature) - np.min(feature))
# 特征组合示例:位置和速度的组合
def combine_features(position, velocity):
return np.array([position, velocity])
今日就先优化那么点。
标签:特征,treasure,feature,笔记,奖励,算法,蒙特卡洛,reward,obs From: https://blog.csdn.net/yyyy2711/article/details/140892880