python单独运⾏查看py⽂件中类⾥⾯的函数功能
在该 .py ⽂件下,⾸先实例化类,然后,根据需要传⼊相对应的参数即可
栗⼦:
在Q_learning中,需要查看别⼈编写的代码功能函数的输出
import numpy as np
import pandas as pd
class QL:
def__init__(self, actions, learning_rate=0.05, reward_decay=0.9, e_greedy=0.9):
self.actions = actions #初始化可以进⾏的各种⾏为,传⼊为列表
self.lr = learning_rate #学习率,⽤于更新Q_table的值
self.gamma = reward_decay #当没有到达终点时,下⼀环境对当前环境的影响
self.epsilon = e_greedy #随机选择概率为1-e_greedy,当处于e_greedy内时,不随机选择。
self.q_table = pd.DataFrame(columns=self.actions, dtype=np.float64)#⽣成q_table,列向量为columns
def choose_action(self,observation):
self.check_observation(observation)#检测是否到达过这个点,如果没到达过,在Q表中增加这个节点
action_list = self.q_table.loc[observation,:]#取出当前observation所在的不同⽅向
if(np.random.uniform()< self.epsilon):#如果在epsilon⼏率内
action = np.random.choice(action_list[action_list == np.max(action_list)].index)#选出当前observation中Q值最⼤的⽅向else:
action = np.random.choice(self.actions)#如果不在epsilon内,则随机选择⼀个动作
return action #返回应当做的action
def learn(self,observation_now,action,score,observation_after,done):
print('查看成功')
self.check_observation(observation_after)#检查是否存在下⼀环境对应的⽅向状态
q_predict = self.q_table.loc[observation_now,action]#获得当前状态下,当前所作动作所对应的预测得分
if done:
q_target = score #如果完成了则q_target为下⼀个环境的实际情况得分,本例⼦中此时score为1
else:
q_target = score + self.gamma * self.q_table.loc[observation_after,:].max()#如果未完成则取下⼀个环境若⼲个动作中的最⼤得分作为这个环境的价值传递给当前环境
#根据所处的当前环境对各个动作的预测得分和下⼀步的环境的实际情况更新当前环境的q表
self.q_table.loc[observation_now, action]+= self.lr *(q_target - q_predict)
def check_observation(self,observation):
if observation not in self.q_table.index:#如果不存在
self.q_table = self.q_table.append(#则通过series函数⽣成新的⼀列
pd.Series(
[0]*len(self.actions),
index=self.actions,
name=observation,)
)
我们需要做的是在该类下添加如下代码,为了验证是否成功,我们在需要查看的函数中添加⼀⾏输出 print('查看成功') :
if __name__ =="__main__":
Q_learning = QL(actions =['right'])
Q_learning.learn(1,'right',1,1,True)
最后结果为
逐项运⾏.py ⽂件,查看代码功能
import numpy as np
import pandas as pd
class QL:
def__init__(self, actions, learning_rate=0.05, reward_decay=0.9, e_greedy=0.9):
self.actions = actions #初始化可以进⾏的各种⾏为,传⼊为列表
self.lr = learning_rate #学习率,⽤于更新Q_table的值
self.gamma = reward_decay #当没有到达终点时,下⼀环境对当前环境的影响
self.epsilon = e_greedy #随机选择概率为1-e_greedy,当处于e_greedy内时,不随机选择。
self.q_table = pd.DataFrame(columns=self.actions, dtype=np.float64)#⽣成q_table,列向量为columns
def choose_action(self,observation):
self.check_observation(observation)#检测是否到达过这个点,如果没到达过,在Q表中增加这个节点
print(self.q_table)
action_list = self.q_table.loc[observation,:]#取出当前observation所在的不同⽅向
print(self.q_table.loc[observation,:])
if(np.random.uniform()< self.epsilon):#如果在epsilon概率内
action = np.random.choice(action_list[action_list == np.max(action_list)].index)#选出当前observation中Q值最⼤的⽅向else:
action = np.random.choice(self.actions)#如果不在epsilon内,则随机选择⼀个动作
return action #返回应当做的action
def learn(self,observation_now,action,score,observation_after,done):
self.check_observation(observation_after)#检查是否存在下⼀环境对应的⽅向状态
q_predict = self.q_table.loc[observation_now,action]#获得当前状态下,当前所作动作所对应的预测得分
if done:
q_target = score #如果完成了则q_target为下⼀个环境的实际情况得分,本例⼦中此时score为1
else:
q_target = score + self.gamma * self.q_table.loc[observation_after,:].max()#如果未完成则取下⼀个环境若⼲个动作中的最⼤得分作为这个环境的价值传递给当前环境
#根据所处的当前环境对各个动作的预测得分和下⼀步的环境的实际情况更新当前环境的q表
self.q_table.loc[observation_now, action]+= self.lr *(q_target - q_predict)
print(self.q_table)
def check_observation(self,observation):
if observation not in self.q_table.index:#如果不存在
self.q_table = self.q_table.append(#则通过series函数⽣成新的⼀列
pd.Series(
[0]*len(self.actions),# ⽣成新的状态动作 [0, 0]
index=self.actions,
name=observation,)python怎么读取py文件
)
if __name__ =="__main__":
Q_learning = QL(actions =['left','right'])# 可以改变动作数量和位置等信息
Q_learning.choose_action(1)
Q_learning.learn(1,'left',-1,2,True)
Q_learning.choose_action(2)
Q_learning.learn(2,'right',1,3,True)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论