[Deep Q Learning] pytorch 从零开始建立一个简单的DQN--走迷宫游戏

在这里插入图片描述
关于DQN的原理我不在这里说明了,如果对DQN的原理不了解可以去看我这个帖子
https://blog.csdn.net/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
  • 20
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值