强化学习深度解析:Q学习与SARSA算法应用实例

版权申诉
0 下载量 129 浏览量 更新于2024-12-15 收藏 24KB RAR 举报
资源摘要信息:"本章节主要探讨强化学习中的两种重要算法:Q学习和SARSA。在介绍这两种算法之前,首先需要了解强化学习的基础概念。强化学习是机器学习的一个分支,它涉及到智能体如何在环境中采取行动,以最大化某种累积奖励。Q学习(Q-learning)和SARSA都是基于时间差分学习(Temporal Difference Learning, TD Learning)的无模型算法,它们通过与环境的交互来学习策略。 Q学习是一种离策略学习方法,它试图直接学习最优动作值函数Q*,即在给定状态下采取最佳动作并遵循最优策略的价值。Q学习算法的核心是更新规则,该规则使用贝尔曼优化方程来迭代地改进Q值估计。其更新公式为: Q(s, a) ← Q(s, a) + α [r + γ max Q(s', a') - Q(s, a)] 其中,s表示当前状态,a是当前动作,s'和a'分别是下一步的状态和动作,α是学习率,r是立即奖励,γ是折扣因子,max Q(s', a')表示在状态s'下的最佳动作价值。 与Q学习不同,SARSA是一种在策略学习方法,它在学习过程中同时更新策略和动作价值函数。SARSA的更新规则与Q学习类似,但其下一个动作a'是根据当前策略选择的,而不是最优动作。其更新公式如下: Q(s, a) ← Q(s, a) + α [r + γ Q(s', a') - Q(s, a)] SARSA算法考虑了当前策略的选择,因此在探索和利用之间更平衡。在实际应用中,这可能会导致更稳定的性能,但有时也会比Q学习收敛得慢。 本章节通过对Q学习和SARSA算法的学习,旨在帮助读者理解这两种算法的原理和实现方式。为了加深理解,会通过具体实例详细讲解如何运用这些学习方法。例如,可以构建一个迷宫寻路问题,其中智能体必须学习从起点到终点的最佳路径。通过不断的尝试和调整动作选择策略,智能体能够学会在不同状态下采取最佳动作,最终达到目标。 本章的学习目标是掌握Q学习和SARSA的理论基础,并能够通过实例应用这些方法。理解它们之间的区别和适用场景对于选择合适的强化学习算法至关重要。通过本章的学习,读者应该能够对强化学习有更深入的理解,并能够将这些算法应用于解决实际问题。" 知识点梳理: 1. 强化学习基础 强化学习是一类机器学习方法,其中智能体在环境的状态下采取动作,并根据这些动作获得的反馈(奖励或惩罚)来学习如何最大化未来可能获得的累积奖励。强化学习的核心在于评估和改进策略,即智能体行为的规则。 2. 时间差分学习(TD Learning) TD学习是一种强化学习方法,它结合了蒙特卡洛方法和动态规划的优点。TD方法不需要知道环境的完整模型,而是通过观察和行动来学习价值函数。其主要思想是利用当前的估计值和未来的一次观察值来改进预测。 3. Q学习(Q-Learning) Q学习是TD学习中的一种算法,它试图学习动作值函数Q(s, a),即在给定状态下采取特定动作的价值。Q学习的目标是学习到一个最优的Q函数Q*,它表示在任何状态下采取任何动作的最大期望回报。Q学习是离策略学习方法,意味着它不需要遵循当前策略来选择动作,而是寻求最优动作值函数。 4. SARSA算法 SARSA是另一种基于TD学习的算法,它的名称来自它在更新时考虑的五个变量:状态(State)、动作(Action)、奖励(Reward)、下一个状态(State)和下一个动作(Action)。与Q学习不同,SARSA是策略内学习方法,它在更新动作值时会考虑当前策略下可能会采取的下一个动作。 5. Q学习与SARSA的区别 Q学习和SARSA之间的主要区别在于它们如何更新动作值函数。Q学习在更新时假设智能体将会采取最优动作,而SARSA则使用在当前策略下实际可能会采取的动作。因此,Q学习是离策略算法,SARSA是在策略算法。这种差别影响了它们在探索新动作和利用已知动作之间的平衡。 6. 实例应用 本章通过具体的强化学习实例,如迷宫寻路问题,来展示Q学习和SARSA算法的应用。通过这些实例,读者可以更好地理解算法的工作原理,并学会如何将理论应用到具体问题中。 7. 理解选择合适算法的重要性 读者需要理解不同算法适用于不同类型的强化学习问题。Q学习适用于需要快速找到最优策略的场景,而SARSA则适合那些需要更稳定的探索和利用权衡的场景。通过实例的学习,读者应该能够根据具体问题选择合适的算法。 通过以上知识点的梳理,本章期望读者能够掌握Q学习和SARSA算法的理论与实践,以及如何在不同的应用场景中做出合理的选择。

SELECT PIS.SHOW_FLT_DETAIL AS SHOW_FLT_DETAIL -- new , PIS.SHOW_AWB_DETAIL AS SHOW_AWB_DETAIL -- new , PIS.DISPLAY_AIRLINE_CODE AS CARRIER_CODE , DECODE(PIS.REVERT_FLOW,'N',PIS.FLOW_TYPE,DECODE(PIS.FLOW_TYPE,'I','E','I')) AS FLOW_TYPE , PIS.SHIP_TO_LOCATION AS SHIP_TO_LOCATION , PIS.INVOICE_SEQUENCE AS INVOICE_SEQUENCE , PFT.FLIGHT_DATE AS FLIGHT_DATE , PFT.FLIGHT_CARRIER_CODE AS FLIGHT_CARRIER_CODE , PFT.FLIGHT_SERIAL_NUMBER AS FLIGHT_SERIAL_NUMBER , PFT.FLOW_TYPE AS AIRCRAFT_FLOW , FAST.AIRCRAFT_SERVICE_TYPE AS AIRCRAFT_SERVICE_TYPE , PPT.AWB_NUMBER AS AWB_NUMBER , PPT.WEIGHT AS WEIGHT , PPT.CARGO_HANDLING_OPERATOR AS CARGO_HANDLING_OPERATOR , PPT.SHIPMENT_PACKING_TYPE AS SHIPMENT_PACKING_TYPE , PPT.SHIPMENT_FLOW_TYPE AS SHIPMENT_FLOW_TYPE , PPT.SHIPMENT_BUILD_TYPE AS SHIPMENT_BUILD_TYPE , PPT.SHIPMENT_CARGO_TYPE AS SHIPMENT_CARGO_TYPE , PPT.REVENUE_TYPE AS REVENUE_TYPE , PFT.JV_FLIGHT_CARRIER_CODE AS JV_FLIGHT_CARRIER_CODE , PPT.PORT_TONNAGE_UID AS PORT_TONNAGE_UID , PPT.AWB_UID AS AWB_UID , PIS.INVOICE_SEPARATION_UID AS INVOICE_SEPARATION_UID , PFT.FLIGHT_TONNAGE_UID AS FLIGHT_TONNAGE_UID FROM PN_FLT_TONNAGES PFT , FZ_AIRLINES FA , PN_TONNAGE_FLT_PORTS PTFP , PN_PORT_TONNAGES PPT , FF_AIRCRAFT_SERVICE_TYPES FAST , SR_PN_INVOICE_SEPARATIONS PIS --new , SR_PN_INVOICE_SEP_DETAILS PISD--new , SR_PN_INV_SEP_PORT_TONNAGES PISPT --new WHERE PFT.FLIGHT_OPERATION_DATE >= trunc( CASE :rundate WHEN TO_DATE('01/01/1900', 'DD/MM/YYYY') THEN ADD_MONTHS(SYSDATE,-1) ELSE ADD_MONTHS(:rundate,-1) END, 'MON') AND PFT.FLIGHT_OPERATION_DATE < trunc( CASE :rundate WHEN TO_DATE('01/01/1900', 'DD/MM/YYYY') THEN TRUNC(SYSDATE) ELSE TRUNC(:rundate) END, 'MON') AND PFT.TYPE IN ('C', 'F') AND PFT.RECORD_TYPE = 'M' AND (PFT.TERMINAL_OPERATOR NOT IN ('X', 'A') OR (PFT.TERMINAL_OPERATOR <> 'X' AND FA.CARRIER_CODE IN (SELECT * FROM SPECIAL_HANDLING_AIRLINE) AND PPT.REVENUE_TYPE IN (SELECT * FROM SPECIAL_REVENUE_TYPE) AND PPT.SHIPMENT_FLOW_TYPE IN (SELECT * FROM SPECIAL_SHIPMENT_FLOW_TYPE) AND PFT.FLIGHT_OPERATION_DATE >= (select EFF_DATE from SPECIAL_HANDLING_EFF_DATE) )) AND PFT.DELETING_DATETIME IS NULL AND FA.AIRLINE_UID = PFT.AIRLINE_UID AND FA.DELETING_DATETIME IS NULL AND PTFP.FLIGHT_TONNAGE_UID = PFT.FLIGHT_TONNAGE_UID AND PTFP.RECORD_TYPE = 'M' AND PTFP.DELETING_DATETIME IS NULL AND PPT.TONNAGE_FLIGHT_PORT_UID (+)= PTFP.TONNAGE_FLIGHT_PORT_UID AND PPT.RECORD_TYPE (+)= 'M' AND PPT.DISCREPANCY_TYPE (+)= 'NONE' AND PPT.ADJUSTMENT_INC_FLAG (+)= 'Y' AND PPT.DELETING_DATETIME (+) IS NULL AND FAST.AIRCRAFT_SERVICE_TYPE_UID = PFT.AIRCRAFT_SERVICE_TYPE_UID AND FAST.DELETING_DATETIME IS NULL AND PIS.TEMPORAL_NAME = TO_CHAR((CASE :rundate --new WHEN TO_DATE('01/01/1900', 'DD/MM/YYYY') THEN TRUNC(SYSDATE) ELSE TRUNC(:rundate) END ), 'YYYYMM') || '00' AND PIS.INVOICE_SEPARATION_UID = PISD.INVOICE_SEPARATION_UID --new AND PISD.INVOICE_SEP_DETAIL_UID = PISPT.INVOICE_SEP_DETAIL_UID --new AND PISPT.PORT_TONNAGE_UID = PPT.PORT_TONNAGE_UID --new AND PIS.PRINT_SUPPORTING_DOC = 'Y';上面是oracle的写法,请转成spark SQL的写法。

2023-06-02 上传

def get_parser(): parser = argparse.ArgumentParser(description='Face detection and classification for politicians in Japanese TV.') # Important configuration variables parser.add_argument('--dataset', type=str, default='mot17', help='Mode name for saving files.') parser.add_argument('--mode', default='train', type=str, help='train or test.') parser.add_argument('--detector', type=str, default='YOLOX', help='Detector to be used. FRCNN, SDP, Bresee, SGT, YOLOX, GT.') parser.add_argument('--reid', type=str, default=None, help='Reidentification model to be used. SBS, MGN.') parser.add_argument('--mod', type=str, default=None, help='Tracker name modifier to do testing of features.') # Paths parser.add_argument('--datapath', type=str, default='datasets/MOT17Det', help='Dataset path with frames inside.') parser.add_argument('--feat', type=str, default='feats', help='Features files path.') # Tracking-specific configuration variables parser.add_argument('--max_iou_th', type=float, default=0.15, help='Max value to multiply the distance of two close objects.') parser.add_argument('--w_tracklet', type=int, default=10, help='Window size per tracklet') parser.add_argument('--w_fuse', type=int, default=3, help='Window size per fusion in hierarchy') parser.add_argument('--max_prop', type=int, default=10000, help='Difficult the fusion when the frame difference is larger than this value.') parser.add_argument('--fps_ratio', type=int, default=1, help='Use lower fps dataset if lower than 1.') # Flags parser.add_argument('--save_feats', action='store_true', help='Save tracking + feature vectors as pkl file for analysis.') parser.add_argument('--iou', action='store_true', help='Add IoU distance to further improve the tracker.') parser.add_argument('--temp', action='store_true', help='Use temporal distance to further improve the tracker.') parser.add_argument('--spatial', action='store_true', help='Use spatial distance to further improve the tracker.') parser.add_argument('--motion', action='store_true', help='Add motion estimation to further improve the tracker.') parser.add_argument('--randorder', action='store_true', help='Random order of lifted frames for testing.') parser.add_argument('--noncont', action='store_true', help='Do not enforce continuous clustering. Allow all tracklets to cluster with whoever they want.') return parser

2023-06-01 上传