10個與獎勵函數設計相關的關鍵概念、技術或方法,併為每個提供一個簡化的Python代碼片段來幫助理解其思路。

  1. 碰撞懲罰 (Collision Penalty)
    思路: 最基礎的安全獎勵。如果發生碰撞,則給予一個大的負獎勵。
    創新點: 直接且易於實現,強制代理避免事故。
def reward_collision(has_collision):
    if has_collision:
        return -1000  # 大的負獎勵
    else:
        return 0      # 無碰撞則無獎勵

# 示例調用
current_reward = reward_collision(vehicle.crashed)
  1. 基於速度的碰撞懲罰 (Speed-Based Collision Penalty)
    思路: 懲罰不僅取決於是否碰撞,還取決於碰撞時的速度,高速碰撞懲罰更重。
    創新點: 更符合現實,鼓勵代理在高速時更加謹慎。
def reward_speed_based_collision(has_collision, current_speed):
    if has_collision:
        # 懲罰隨速度平方增長
        penalty = -50 * (current_speed ** 2 + 0.5)
        return penalty
    else:
        return 0

# 示例調用
current_reward = reward_speed_based_collision(vehicle.crashed, vehicle.speed)
  1. 時間到碰撞 (Time-to-Collision, TTC)
    思路: 計算與前方障礙物發生碰撞前的剩餘時間,TTC越小,風險越高,應給予負獎勵。
    創新點: 提供了一個連續的、密集的風險信號,而不僅僅是稀疏的碰撞事件。
def calculate_ttc(distance_to_front, ego_speed, front_speed):
    relative_speed = max(ego_speed - front_speed, 0.1)  # 避免除零
    ttc = distance_to_front / relative_speed
    return ttc

def reward_ttc(ttc, threshold=3.0):
    if ttc < threshold:
        # TTC低於閾值時,獎勵為負,且TTC越小,懲罰越大
        return -1 / ttc
    else:
        return 0  # 安全

# 示例調用
ttc = calculate_ttc(dist_front, ego_speed, front_speed)
current_reward += reward_ttc(ttc)
  1. 進展獎勵 (Progress Reward based on Distance)
    思路: 根據車輛在道路上前進的距離給予正獎勵,以激勵代理向目標移動。
    創新點: 解決了目標獎勵延遲的問題,提供了密集的正向反饋。
class ProgressTracker:
    def __init__(self):
        self.last_distance = 0
    
    def reward_progress(self, current_distance_on_route):
        progress_made = current_distance_on_route - self.last_distance
        self.last_distance = current_distance_on_route
        return progress_made * 10  # 每米獎勵10分

# 示例調用
tracker = ProgressTracker()
current_reward += tracker.reward_progress(agent.current_route_distance)
  1. 舒適度獎勵 (Comfort Reward via Jerk Penalty)
    思路: 通過懲罰縱向和橫向加速度的變化率(即“急促度”jerk)來保證乘坐舒適性。
    創新點: 將物理上的舒適度指標量化到獎勵函數中。
def reward_comfort(longitudinal_jerk, lateral_jerk):
    # 對急促度進行懲罰,數值越大懲罰越重
    jerk_penalty = -(longitudinal_jerk**2 + lateral_jerk**2) * 0.1
    return jerk_penalty

# 示例調用
current_reward += reward_comfort(vehicle.long_jerk, vehicle.lat_jerk)
  1. 速度限制懲罰 (Speed Limit Violation Penalty)
    思路: 當車輛速度超過道路限速時,根據超速程度施加懲罰。
    創新點: 鼓勵代理遵守基本交通法規。
def reward_speed_limit(current_speed, speed_limit):
    if current_speed > speed_limit:
        over_speed = current_speed - speed_limit
        return -over_speed * 5  # 每超速1m/s,扣5分
    else:
        return 0  # 不超速則無懲罰

# 示例調用
current_reward += reward_speed_limit(vehicle.speed, road.speed_limit)
  1. 加權求和獎勵聚合 (Weighted Sum Aggregation)
    思路: 將不同類別的獎勵乘以權重後相加,形成最終獎勵。這是最常用的方法。
    創新點: 允許研究者手動調整不同目標的重要性。
def final_reward_weighted_sum(safety_r, progress_r, comfort_r, rules_r):
    w_safety = 10.0
    w_progress = 1.0
    w_comfort = 0.5
    w_rules = 2.0
    
    total_reward = (w_safety * safety_r + 
                    w_progress * progress_r + 
                    w_comfort * comfort_r + 
                    w_rules * rules_r)
    return total_reward

# 示例調用
final_r = final_reward_weighted_sum(rs, rp, rc, rr)
  1. 基於規則書的獎勵 (Rulebook-based Reward)
    思路: 不使用權重,而是定義一個有優先級順序的規則列表(如安全>規則>舒適)。代理必須滿足高優先級規則,再優化低優先級目標。
    創新點: 避免了權重調整的難題,明確表達了目標間的優先級。
class Rulebook:
    def __init__(self):
        self.rules = [
            {"name": "No_Collision", "priority": 1, "check": lambda state: not state.has_collision()},
            {"name": "Obey_Speed_Limit", "priority": 2, "check": lambda state: state.speed <= state.speed_limit},
            {"name": "Smooth_Driving", "priority": 3, "check": lambda state: state.jerk < 5.0}
        ]
    
    def evaluate_action(self, state):
        # 按優先級檢查規則
        for rule in sorted(self.rules, key=lambda x: x["priority"]):
            if not rule["check"](state):
                return -float('inf')  # 違反高優先級規則,獎勵為負無窮
        # 如果所有規則都滿足,則返回一個基於進展的獎勵
        return state.progress_made * 10

# 示例調用
rulebook = Rulebook()
current_reward = rulebook.evaluate_action(current_state)
  1. 獎勵機 (Reward Machines)
    思路: 使用類似有限狀態機的結構,根據當前駕駛情境(如“跟車”、“變道”、“匯入”)切換不同的子獎勵函數。
    創新點: 實現了情境感知的獎勵,使獎勵函數更具適應性和通用性。
class RewardMachine:
    def __init__(self):
        self.state = "NORMAL_DRIVING"
    
    def update_state(self, environment):
        if environment.is_merging_scenario():
            self.state = "MERGING"
        elif environment.is_lane_change_allowed():
            self.state = "LANE_CHANGE"
        else:
            self.state = "NORMAL_DRIVING"
    
    def get_reward(self, state, action):
        self.update_state(state)
        
        if self.state == "MERGING":
            return self._merging_reward(state, action)
        elif self.state == "LANE_CHANGE":
            return self._lane_change_reward(state, action)
        else:
            return self._normal_driving_reward(state, action)

# 每個情境下的具體獎勵函數...
  1. 逆向強化學習 (Inverse Reinforcement Learning, IRL)
    思路: 不手動設計獎勵函數,而是從人類專家的駕駛數據中學習出一個能解釋這些行為的獎勵函數。
    創新點: 可以學習到複雜、難以顯式編程的駕駛偏好。
# 此處僅為概念示意,真實IRL非常複雜
def inverse_rl_learn_reward(human_trajectories):
    """
    偽代碼:從人類軌跡數據中學習獎勵函數
    """
    # 初始化一個參數化的獎勵函數 R(s; θ)
    theta = initialize_parameters()
    
    for trajectory in human_trajectories:
        # 計算在當前θ下,該軌跡的概率
        prob = calculate_trajectory_probability(trajectory, theta)
        # 更新θ以最大化人類軌跡出現的概率
        theta = optimize(theta, prob)
    
    learned_reward_function = lambda s, a: R(s, a; theta)
    return learned_reward_function

# 學習到的獎勵函數可以用於訓練新的RL代理
learned_reward = inverse_rl_learn_reward(expert_demos)
agent.train_with_reward(learned_reward)