Q-learning简单描述就是通过建立一种S,A之间的Q表,通过设定奖励(reward)机制不断训练,最终训练出一个能够自己向着设定的奖励(reward)以相对来说较为高效的方式行动,最终有效的得到奖励的程序
井字棋规则
三字连珠即为胜利,下满整个棋盘双方都没有三字连珠即为平局
以下为使用python简写的Q-learning简易版
import random
import numpy as np
import pandas as pd
import time
dictkv = {
"ooooooooo0":0,
"ooooooooo1":0,
"ooooooooo2":0,
"ooooooooo3":0,
"ooooooooo4":0,
"ooooooooo5":0,
"ooooooooo6":0,
"ooooooooo7":0,
"ooooooooo8":0
}
#dictkv中dict意为字典,kv表示键值对,这个字典是Q表的初始化,开始到底用二维列表表示棋盘的状态还是直接用一个字符串纠结了,最后还是用字符串比较好操作,键值对中key为一个字符串,前9位表示棋盘状态,第十位表示下一步下在哪,键值对中value表示Q值
EPSILON = 0.9
MAX = 100
ALPHA = 0.1
GAMMA = 0.9
#以上参数分别是更新Q表示时的参数
def replace_char(old_string, char, index):
old_string = str(old_string)
new_string = old_string[:index] + char + old_string[index+1:]
return new_string
#将字符串指定位置的字符换成目标字符(下棋时改变棋盘状态有用)
def winx(str):
#x为Q-learning目标训练的先手,赢了返回1,o为空位
flag = 0
for i in range(3):
if str[i] == str[i+3] and str[i+3] == str[i+6]:
if str[i] == 'x':
flag = 1
for i in range(0,7,3):
if str[i] == str[i+1] and str[i+1] == str[i+2]:
if str[i] == 'x':
flag = 1
if str[0] == str[4] and str[4] == str