import numpy as np import random #状态转移概率矩阵 #很显然,状态4(第5行)就是重点了,要进入状态4,只能从状态2,3进入(状态2,3对于完成此项任务价值很大) P = np.array([ [0.5, 0.5, 0.0, 0.0, 0.0], [0.5, 0.0, 0.5, 0.0, 0.0], [0.0, 0.0, 0.0, 0.5, 0.5], [0.0, 0.1, 0.2, 0.2, 0.5], [0.0, 0.0, 0.0, 0.0, 0.0], ]) #反馈矩阵,-100的位置是不可能走到的。奖励 R = np.array([ [-1.0, 0.0, -100.0, -100.0, -100.0], [-1.0, -100.0, -2.0, -100.0, -100.0], [-100.0, -100.0, -100.0, -2.0, 0.0], [-100.0, 1.0, 1.0, 1.0, 10.0], [-100.0, -100.0, -100.0, -100.0, -100.0], ]) P, R # 生成一个chain(采样生成样本) def get_chain(max_lens): states = [] rewards = [] # 随机选取一个状态作为起点(非4) s = random.choice(range(4)) states.append(s) for _ in range(max_lens): # 依据P的概率分布,找到下一个状态 s_next = np.random.choice(np.arange(5), p=P[s]) # 得到对应的奖励 r = R[s, s_next] # 更新状态,继续循环 s = s_next states.append(s) rewards.append(r) if s==4: break return states, rewards # 生成N个链 def get_chains(N, max_lens): states, rewards = [], [] for _ in range(N): s, r = get_chain(max_lens) states.append(s) rewards.append(r) return states, rewards # 给定一条链,计算回报 def get_values(rewards): V = 0 for i, r in enumerate(rewards): # 折扣回报,随着步数衰减,权重越来越低 V += 0.9**i*r return V # 蒙特卡洛方法评估每个状态的价值 def get_values_by_monte_carlo(states, rewards): # 记录5个不同开头的价值 values = [[] for i in range(5)] for s, r in zip(states, rewards): # 计算不同开头的价值 values[s[0]].append(get_values(r)) # 每个开头的平均价值即时该状态的价值评估 return [np.mean(e) for e in values] get_values_by_monte_carlo(*get_chains(1000, 20)) """ [-2.26601097881321, -1.5128666270632725, 2.094763097612923, 6.982357335671139, nan] """
计算出状态2,3对于完成目标意义重大
原文地址:http://www.cnblogs.com/demo-deng/p/16871225.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性