双涡旋流场机器人导航Q-learning能耗奖励函数集成方案咨询
双涡旋流场Q-learning导航奖励函数优化方案
核心思路
要平衡路径效率(时间步)和能耗,奖励函数需包含三部分:终点奖励、时间步惩罚、能耗关联奖励。能耗量化基于智能体移动方向与流场速度矢量的夹角——顺流时能耗低给予正向奖励,逆流时能耗高给予负向惩罚,垂直流场则按基础能耗处理。
能耗量化逻辑
流场中每个网格点对应速度矢量(U, V),智能体动作对应固定方向矢量:
- up:
(0, 1) - down:
(0, -1) - right:
(1, 0) - left:
(-1, 0)
通过计算动作方向矢量与流场速度矢量的点积判断顺逆流:
- 点积>0:动作与流场同向(顺流),能耗低,奖励与点积正相关
- 点积<0:动作与流场反向(逆流),能耗高,惩罚与点积负相关
- 点积=0:垂直流场,无额外能耗奖励/惩罚
调整后的奖励函数实现
需注意流场随时间t变化,需根据当前episode的时间步匹配对应流场数据,代码实现如下:
# 定义动作对应的方向矢量 action_dirs = { 0: (0, 1), # up 1: (0, -1), # down 2: (1, 0), # right 3: (-1, 0) # left } def get_reward(state, action, current_t_step): # 1. 终点奖励:保持高优先级引导智能体到达目标 if state == end_point: return 100 # 2. 时间步惩罚:避免智能体无意义绕路,保障路径效率 step_penalty = -1 # 3. 能耗关联奖励 x_idx, y_idx = state # 获取当前时间步的流场速度数据 current_flow = VEC[current_t_step % t_incr] # 循环复用流场时间序列 u = current_flow['U'][y_idx, x_idx] v = current_flow['V'][y_idx, x_idx] flow_vec = np.array([u, v]) # 获取当前动作的方向矢量 action_vec = np.array(action_dirs[action]) # 归一化点积,避免流场绝对速度影响奖励幅度 flow_norm = np.linalg.norm(flow_vec) if np.linalg.norm(flow_vec) != 0 else 1 action_norm = np.linalg.norm(action_vec) dot_product = np.dot(flow_vec, action_vec) / (flow_norm * action_norm) # 能耗奖励权重:可根据需求调整平衡程度 energy_weight = 5.0 energy_reward = dot_product * energy_weight # 总奖励计算 total_reward = step_penalty + energy_reward return total_reward
平衡效率与能耗的调参建议
- 终点奖励(100):保持较大值,确保智能体以到达终点为核心目标
- 时间步惩罚(-1):固定小惩罚,防止智能体过度绕路
- 能耗权重(5.0):若更侧重能耗最小化,可增大权重;若更看重路径速度,可减小权重
- UCB探索参数c:训练初期适当增大
c,让智能体充分探索不同能耗的路径;后期减小c,聚焦利用最优路径
注意事项
- 流场时间序列复用:当单episode步数超过
t_incr时,用current_t_step % t_incr循环调用流场数据 - 零流场处理:代码中已针对静止流场(U=V=0)做归一化除零判断,避免计算错误
内容的提问来源于stack exchange,提问作者hmlkd
相关产品推荐
相关产品推荐

