CPT 强化学习(Cumulative Prospect Theory Reinforcement Learning)代码实现 ✅ CPT 强化学习Cumulative Prospect Theory Reinforcement Learning代码实现以下提供实用、可运行的 Python 实现结合Cumulative Prospect Theory (CPT)与强化学习。1. 核心概念回顾在传统 RL 中目标是最大化期望回报Expected Return。在CPT-RL中目标是最大化 CPT 值考虑损失厌恶、概率扭曲、参照点让 Agent 表现出人类-like 的风险偏好风险规避/寻求。2. 完整代码实现简单版CPT-Q Learningimportgymnasiumasgymimportnumpyasnpfromcollectionsimportdefaultdictimportrandom# CPT 核心函数 defcpt_value(x,alpha0.88,beta0.88,lambda_loss2.25):价值函数 v(x)xnp.array(x)returnnp.where(x0,x**alpha,-lambda_loss*(-x)**beta)defcpt_probability_weight(p,gamma_gain0.61,gamma_loss0.69):概率权重函数 w(p)pnp.array(p)# 简单实现不同 gamma 用于收益和损失w_gainp**gamma_gain/(p**gamma_gain(1-p)**gamma_gain)**(1/gamma_gain)w_lossp**gamma_loss/(p**gamma_loss(1-p)**gamma_loss)**(1/gamma_loss)returnnp.where(p0,w_gain,w_loss)# 简化处理defestimate_cpt_value(rewards,alpha0.88,beta0.88,lambda_loss2.25,gamma_gain0.61,gamma_loss0.69,reference0.0):从多条 trajectory 的回报样本估计 CPT 值returnsnp.array(rewards)-reference sorted_returnsnp.sort(returns)nlen(sorted_returns)# 计算决策权重累积形式简化版probsnp.ones(n)/n weightscpt_probability_weight(probs)# 累积权重简化实现cum_weightsnp.cumsum(weights[::-1])[::-1]# 粗略近似valuescpt_value(sorted_returns)cpt_valnp.sum(cum_weights*values)/n# 归一化returncpt_val# CPT-Q Learning classCPTQAgent:def__init__(self,state_size,action_size,alpha0.1,gamma0.99,epsilon0.1,cpt_alpha0.88,cpt_lambda2.25):self.q_tabledefaultdict(lambda:np.zeros(action_size))self.alphaalpha# 学习率self.gammagamma# 折扣因子self.epsilonepsilon# 探索率self.action_sizeaction_size self.cpt_alphacpt_alpha self.cpt_lambdacpt_lambda self.memory[]# 存储 trajectory returns 用于 CPT 估计defchoose_action(self,state):ifrandom.uniform(0,1)self.epsilon:returnrandom.randint(0,self.action_size-1)returnnp.argmax(self.q_table[state])deflearn(self,state,action,reward,next_state,done):# 标准 Q-Learning 更新可替换为 CPT 目标old_valueself.q_table[state][action]next_maxnp.max(self.q_table[next_state])# 传统 TD Targettd_targetrewardself.gamma*next_max*(1-done)self.q_table[state][action]old_valueself.alpha*(td_target-old_value)ifdone:self.memory.append(reward)# 简化记录 episode 回报# 训练示例 deftrain_cpt_rl(env_nameCartPole-v1,episodes500):envgym.make(env_name)state_sizeenv.observation_space.shape[0]# 连续状态需离散化或用近似# 为简单起见这里使用离散环境示例如 FrozenLake# 推荐使用简单离散环境演示envgym.make(FrozenLake-v1,is_slipperyFalse)agentCPTQAgent(state_sizeenv.observation_space.n,action_sizeenv.action_space.n)rewards_history[]forepisodeinrange(episodes):state,_env.reset()total_reward0doneFalsewhilenotdone:actionagent.choose_action(state)next_state,reward,terminated,truncated,_env.step(action)doneterminatedortruncated agent.learn(state,action,reward,next_state,done)statenext_state total_rewardreward rewards_history.append(total_reward)ifepisode%1000:print(fEpisode{episode}, Total Reward:{total_reward})# 演示 CPT 值估计sample_returnsrewards_history[-50:]# 最近50个 episodecpt_valestimate_cpt_value(sample_returns)print(f\n最后50个episode的 CPT 值估计:{cpt_val:.4f})returnagent,rewards_historyif__name____main__:agent,historytrain_cpt_rl(episodes1000)3. 进阶Policy Gradient CPT概念代码defcpt_policy_gradient_loss(returns,baseline0.0):CPT 目标下的 Policy Gradient Lossadvantagesnp.array(returns)-baseline valuescpt_value(advantages)# 在实际 PG 中用 values 替代 advantages 进行梯度更新return-np.mean(values)# 最大化 CPT 值4. 使用建议与扩展离散 vs 连续上面代码适合离散环境如 FrozenLake、Taxi。连续环境如 CartPole建议结合 Actor-Critic CPT 价值估计。更精确的 CPT 估计参考 Prashanth et al. (2016) 的分位数方法或累积权重精确计算。框架推荐Stable-Baselines3 / CleanRL 自定义 Reward ShapingPyTorch/TensorFlow 实现 Policy Gradient 版本2024 论文有最新 PG 定理参数调优lambda_loss2.25→ 更强的损失厌恶gamma_gain 1→ 概率扭曲想让我继续提供完整 PyTorch Actor-Critic CPT 版本推荐生产级特定论文算法复现如 CPT-SPSA 或 Policy Gradient在 Gymnasium 连续控制任务上的实现与标准 RL 的对比实验代码