关于DQN的原理我不在这里说明了,如果对DQN的原理不了解可以去看我这个帖子
https://blog.youkuaiyun.com/mahuatengmmp/article/details/100627005
对DQN的伪代码做了翻译和分析
环境:
pytorch
opencv
numpy
首先建立一个游戏环境
我是拿opencv做的显示效果,也可以不用opencv,具体因人而异
场景
首先需要建立一个游戏和网络能互相互交的场景,我使用的是一个数组
对应上面的图片:
[[1,0,0,0,0],
[0,0,0,3,0],
[0,0,0,0,0],
[0,3,0,0,0],
[0,0,0,0,2],]
1是棋子位置,2是终点位置,3是坑的位置
动作
总共有4个动作,分别为上下左右,分别用数字代表0,1,2,3
奖励值
再就是设置奖励值
我将奖励值设为棋子到达红点会获得-1的奖励值返回失败,绿点会获得1的奖励值返回胜利,碰壁会获得-0.5的奖励
返回胜利或者失败时,游戏会重置
(奖励值这一点我试过很多,发现奖励值规则设置的越复杂,那么神经网络将会学习的更加好)
代码部分
game.py
import cv2
import numpy as np
import random
import time
class Env():
def __init__(self):
super(Env, self).__init__()
self.action_space = ['u', 'd', 'l', 'r']
self.n_actions = len(self.action_space)
#建立虚拟环境
def start_env(self):
self.migong=[[1,0,0,0,0],
[0,0,0,3,0],
[0,0,0,0,0],
[0,3,0,0,0],
[0,0,0,0,2],]
self.x1,self.y1=0,0
self.end_game=0
return self.migong
def display(self):
self.display1=np.ones((300,300,3),dtype=np.uint8)
self.display1=np.array(np.where(self.display1==1,255,0),dtype=np.uint8)
for i in range(5):
cv2.line(self.display1,(i*60,0),(i*60,300),(0,0,0),1)
cv2.line(self.display1,(0,i*60),(300,i*60),(0,0,0),1)
for x in range(5):
for y in range(5):
if self.migong[y][x]==1:
cv2.circle(self.display1,(x*60+30,y*60+30),25,(255,0,0),-1)
if self.migong[y][x]==2:
cv2.circle(self.display1,(x*60+30,y*60+30),25,(0,255,0),-1)
if self.migong[y][x]==3:
cv2.circle(self.display1,(x*60+30,y*60+30),25,(0,0,255),-1)
cv2.imshow('1',self.display1)
cv2.waitKey(1)
def step(self, action):
r=0
#['u'0, 'd'1, 'l'2, 'r'3]
if action==0:
if self.y1==0:
r=-0.5
else:
self.migong[self.y1][self.x1]=0
self.migong[self.y1-1