一、python回顾
- 类与实例
- 类有自己的属性和方法。(例:class Person:)
- 想要调用方法需要创建实例:实例要创建变量,指向类的名字(p1=Person()),调用方法的话在变量的后边句号方法的名字+括号。(p1.greet())
- 如果想把属性进行隐藏,可以把名字前边加两个下划线
- __init__帮助class初始化
- 继承和多态(例:class Animal: class Dog:) 1、继承父类的方法(class Dog(Animal)):
想改变方法的话可以进行重新定义
2、多态
定义def hello(aninmal):
Animal.greet()
Dog=Dog(‘dog’)
Hello(dog)
Cat=Cat(‘cat’)
Hello(cat)
也可直接被调用
二、强化学习之Q-learning
建立Q(s,a)表,来进行动作的选取。
import numpy as np
import pandas as pd
import time
np.random.seed(2)#产生伪随机数列
N_STATES=6#离宝藏的距离有多少步
ACTIONS=['left','right']#有两个可以选的动作
EPSILON=0.9#贪心策略
ALPHA=0.1#学习率
LAMBDA=0.9#折扣率
MAX_EPISODES=13# 玩的回合数
FRESH_TIME=0.01 #f走一步花的时间有多长
#建立Q-table
def build_q_table(n_states,actions):
table=pd.DataFrame(
np.zeros((n_states,len(actions))),#全零进行初始化
columns=actions,)#进行表格创建
# print(table)
return (table)
# build_q_table(N_STATES,ACTIONS)
def choose_action(state,q_table):#选动作
state_actions=q_table.iloc[state,:]#将state所处的行赋值到state_actions
if(np.random.uniform()>EPSILON)or((state_actions==0).all()):#0%进行随机选择(初始值为0也是随机选择),90%选择q-table中最大的值
action_name=np.random.choice(ACTIONS)
else:#act greedy
action_name=state_actions.idxmax()
return action_name
# 环境反馈
def get_env_feedback(S,A):
if A=='right':#move right
if S==N_STATES-2:# -2是因为状态从0开始
S_='terminal'#终止
R=1
else:
S_=S+1
R=0
else:#move left
R=0
if S==0:
S_=S #reach the wall
else:
S_=S-1
return S_,R
# 没必要仔细看下边这个定义的函数
def update_env(S,episode,step_counter):
#This is how environment update
env_list=['-']*(N_STATES-1)+['T']#'------T'our environment
if S=='terminal':
interaction='Episode %s:total_steps=%s'%(episode+1,step_counter)
print('\r{}'.format(interaction),end='')
time.sleep(2)
print('\r ',end='')
else:
env_list[S]='o'
interaction=''.join(env_list)
print('\r{}'.format(interaction),end='')
time.sleep(FRESH_TIME)
# 主循环
def rl():
#main part of RL loop
q_table=build_q_table(N_STATES,ACTIONS)#创建q-table
for episode in range(MAX_EPISODES):
step_counter=0
S=0
is_terminated=False
update_env(S,episode,step_counter)
while not is_terminated:#回合没有结束时
A=choose_action(S,q_table)#根据初始state选择动作
S_,R=get_env_feedback(S,A)#take action&get next state and reward
q_predict=q_table.loc[S,A]#估计值
if S_ !='terminal':
q_target=R+LAMBDA*q_table.iloc[S_,:].max()#next state is not terminal,真实值
else:
q_target=R#next state is teminal
is_terminated=True #terminate this epsispde
q_table.loc[S,A]+=ALPHA*(q_target-q_predict)#update
S=S_#move to next state
#update_env(S,episode,step_counter+1)
update_env(S,episode,step_counter+1)
step_counter+=1
return q_table
if __name__=="__main__":
q_table=rl()
print('\r\nQ-table:\n')
print(q_table)