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,)
            )

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)

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值