如何修复'ValueError:检查输入时出错:期望dense_1_input有形状(4,)但是在Python中有错误的形状(1,)数组?

问题描述 投票:0回答:1

我从Spyder控制台得到的错误如下:

runfile('/ Users / ozgeozler / Pygame / rl_game.py',wdir ='/ Users / ozgeozler / Pygame')Episode:1 2019-04-28 23:48:19.057 python [33387:195175] IMKClient Stall检测到,请报告附加捕获问题的spindump(或sysdiagnose)的用户场景 - (imkxpc_attributesForCharacterIndex:reply :)块执行速度非常慢(2070.59秒)。 2019-04-28 23:48:19.057 python [33387:195175]检测到IMKClient失速,请报告附加捕获问题的spindump(或sysdiagnose)的用户场景 - (imkxpc_windowLevelWithReply :)阻止执行非常缓慢(2068.59秒)。 Traceback(最近一次调用最后一次):

文件“”,第1行,在runfile中('/ Users / ozgeozler / Pygame / rl_game.py',wdir ='/ Users / ozgeozler / Pygame')

文件“/anaconda3/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py”,第827行,在runfile execfile中(文件名,命名空间)

文件“/anaconda3/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py”,第110行,在execfile exec中(compile(f.read(),filename,'e​​xec'),命名空间)

在env.run()中输入第331行的文件“/Users/ozgeozler/Pygame/rl_game.py”

文件“/Users/ozgeozler/Pygame/rl_game.py”,第262行,处于运行状态= self.initialStates()

AttributeError:'Env'对象没有属性'initialStates'

runfile('/ Users / ozgeozler / Pygame / rl_game.py',wdir ='/ Users / ozgeozler / Pygame')剧集:1 Traceback(最近一次调用最后一次):

文件“”,第1行,在runfile中('/ Users / ozgeozler / Pygame / rl_game.py',wdir ='/ Users / ozgeozler / Pygame')

文件“/anaconda3/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py”,第827行,在runfile execfile中(文件名,命名空间)

文件“/anaconda3/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py”,第110行,在execfile exec中(compile(f.read(),filename,'e​​xec'),命名空间)

在env.run()中输入第331行的文件“/Users/ozgeozler/Pygame/rl_game.py”

运行self.agent.replay(batch_size)中的文件“/Users/ozgeozler/Pygame/rl_game.py”,第298行

文件“/Users/ozgeozler/Pygame/rl_game.py”,第168行,重放train_target = self.model.predict(state)

文件“/anaconda3/lib/python3.6/site-packages/keras/engine/training.py”,第1149行,预测x,_,_ = self._standardize_user_data(x)

文件“/anaconda3/lib/python3.6/site-packages/keras/engine/training.py”,第751行,_standardize_user_data exception_prefix ='input')

在standardize_input_data str(data_shape)中输入文件“/anaconda3/lib/python3.6/site-packages/keras/engine/training_utils.py”,第138行

ValueError:检查输入时出错:期望dense_5_input具有形状(4,)但是得到了具有形状的数组(1,)

我正在努力完成与Udemy的强化学习相关的课程。基本上,我跟着讲师。我提出了部分火车和结果。

P.s:我是Python和RL的新手。

提前致谢。

    """
RL GAME
"""

#pygame template

import pygame
import random
import numpy as np
from collections import deque
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam
import random

#window size
WIDTH=360
HEIGHT=360
FPS=30  #OYUNUN NE KADAR HIZLI OLACAĞI

#colors
WHITE=(225, 225, 225)
BLACK=(0,0,0)
RED=(250,0,0)
GREEN=(0,225,0)
BLUE=(0,0,225)    


class Player (pygame.sprite.Sprite):
    # sprite for a player
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image=pygame.Surface((20,20))
        self.image.fill(BLUE)
        #parameterenin farklı metodlarına erişim sağlayabilmek için
        self.rect=self.image.get_rect()
        self.radius= 10
        pygame.draw.circle(self.image, RED, self.rect.center,self.radius) #circle i nereye çizmek istiyorsun sorusu ile ilgili
        self.rect.centerx =WIDTH/2
        self.rect.bottom =HEIGHT-1
        self.speedx=0 #0 pixel ilerliyor BAŞLANGİÇTA

    def update(self,action): #buradaki action: sağa git sola git veya hiçbir şey yapma demek.
        self.speedx=0
        #keyboarddan komut alabilmek için pygame kullanılıyor
        keystate=pygame.key.get_pressed()

        if keystate[pygame.K_LEFT] or action == 0:
            self.speedx=-4
        elif keystate[pygame.K_RIGHT] or action == 1:
            self.speedx=4
        else:
            self.speedx=0

    #toplama yapmazsak tuşa bassan da spride hareket etmiyor.
        self.rect.x +=self.speedx

    #bu olmazsa sağ tarafta ekran dışına çıkabilir. Ya da sol tarafta da aynısı olur.    
    #sınır koyuyoruz
        if self.rect.right > WIDTH:
            self.rect.right= WIDTH

        if self.rect.left < 0:
            self.rect.left = 0        

    def getCoordinates(self):
        return(self.rect.x, self.rect.y)


#düşman tanımı için yeni bir class yazılır
class Enemy(pygame.sprite.Sprite):

    def __init__(self): 
        pygame.sprite.Sprite.__init__(self)
        #düşmanlar yaratılıyor
        self.image =pygame.Surface((10,10))
        self.image.fill(RED)
        self.rect=self.image.get_rect() #rectangle ile çevreleyelim ki faydalarını kullanabilelim.
        self.radius= 5
        pygame.draw.circle(self.image, WHITE, self.rect.center,self.radius) #circle i nereye çizmek istiyorsun sorusu ile ilgili
        #ekrana sığındırma yöntemi =WIDTH -self.rect.width
        self.rect.x =random.randrange(0, WIDTH -self.rect.width) 
        self.rect.y =random.randrange(2,6)

        self.speedx =0 #ilerde çapraz olarak hareket ettirmek istersek diye yaratıldı.
        self.speedy=3

    #düşmanların hareket ettirilme kısmı
    def update(self):

        self.rect.x +=self.speedx
        self.rect.y +=self.speedy

        if self.rect.top > HEIGHT +10:
            self.rect.x =random.randrange(0, WIDTH -self.rect.width) 
            self.rect.y =random.randrange(2,6)        
            self.speedy=3

    def getCoordinates(self): # rectangle ın x ve y sini alacak.
        return(self.rect.x, self.rect.y)

class DQLAgent:    
    def __init__(self):
        #parameters/hyperparameters 
        #parametreler yaratılır.
        #Input'a bu kadar nöron koyacaz.
        self.state_size = 4 #distance 
        #[(playerx- m1x),(playery- m1y),(playerx- m2x),(playery- m2y)]
        #Output'a da bu kadar nöron koyacağız.
        self.action_size = 3  # right, left, no move


        self.gamma = 0.95
        self.learning_rate = 0.001

        self.epsilon = 1 #explore rate
        self.epsilon_decay = 0.995
        self.epsilon_min = 0.01
        #deque'yu liste olarak düşün
        self.memory = deque(maxlen=1000) 
        #agentın içindeki NN'yı tanımlayan
        self.model = self.build_model()  


    def build_model(self): 
        #CONSTRUUCTİON OF NN for DQL 
        model= Sequential()
        model.add(Dense(48,input_dim = self.state_size, activation= "relu"))
        model.add(Dense(self.action_size, activation="linear"))
        model.compile(loss="mse", optimizer= Adam(lr= self.learning_rate))
        return model


    def remember(self, state, action, reward, next_state,done): 
        #STORAGE  of state,action,reward,next_state,done
        self.memory.append((state,action,reward,next_state,done))


    def act(self, state): 
        #action belirlenen yerdir

        #önce state bir array e çevriliyor. çünkü bir alt satırdaki 
        #kodlar array olarak istiyor, state olarak kabul etmiyor.
        state=np.array(state)
        if np.random.rand()< self.epsilon:
            return random.randrange(self.action_size) #eski hali ile --> env.action_space.sample()
        act_values= self.model.predict(state)
        return np.argmax(act_values[0]) # q değerimin en yuksek oldugu action ı return et diyorum.



    def replay(self, batch_size): 
        #TRAINING
        #replay memory yeterince dolu (16) olmazsa önceki 
        #tecrübelerinden yararlanamıyor.
        #16 tane state,action,reward,next_state,done yoksa,
        #replay metodunu kullanamıyorsun.
        if len(self.memory) < batch_size:
            return
        minibatch = random.sample(self.memory,batch_size)
        for state,action,reward,next_state,done in minibatch:
            state=np.array(state)
            next_state=np.array(next_state)
            if done:#kırmızı alan için yazıldı bu if else
                target=reward
            else:
                target=reward + self.gamma*np.amax(self.model.predict(next_state)[0]) 
                #amax önce flaten ediyor sonra maxı seçiyor
            train_target = self.model.predict(state) 
            train_target[0][action] = target  
            self.model.fit(state, train_target, verbose=0) 

    def adaptiveEGreedy(self): 
        #CONSTRUCTION OF NN for DQL 
        if self.epsilon > self.epsilon_min:
            self.epsilon *= self.epsilon_decay




class Env(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.all_sprite =pygame.sprite.Group()
        self.enemy= pygame.sprite.Group()
        self.player=Player()
        self.all_sprite.add(self.player)
        self.m1 =Enemy() #1. düşmanı oluşturduk
        self.m2=Enemy()  #2. düşmanı oluşturduk
        self.all_sprite.add(self.m1) # burada oluşturduğum 1. düşmanı sprite in içine ekliyoruz.
        self.all_sprite.add(self.m2) # # burada oluşturduğum 2. düşmanı sprite in içine ekliyoruz.
        self.enemy.add(self.m1)
        self.enemy.add(self.m2)

        self.reward=0
        self.total_reward=0
        self.done=False
        self.agent=DQLAgent()

    def findDistance(self, a,b):
        d=a-b
        return d

    #environmentte action alınınca agentı environment içinde yeni statee taşıyor.
    def step(self, action):
        state_list=[]

        #update enemy
        self.player.update(action)
        self.enemy.update() #enemy ler action almıyorlar çünkü onlar zaten her update de aşağı doğru hızları kadar iniyorlaar.

        # get coordinate of player and enemies
        next_player_state=self.player.getCoordinates()
        next_m1_state=self.m1.getCoordinates()
        next_m2_state=self.m2.getCoordinates()


        #find distance
        state_list.append(self.findDistance(next_player_state[0],next_m1_state[0]))
        state_list.append(self.findDistance(next_player_state[1],next_m1_state[1])  )      
        state_list.append(self.findDistance(next_player_state[0],next_m2_state[0]))
        state_list.append(self.findDistance(next_player_state[1],next_m2_state[1]) )

        return[state_list]

    #reset motodu
    def initialState(self):
        #agent bir bölümü tamamladığında ve başka bir bölüme geçtiğinde environmentde bütün değreleri baştan yaratma için.
        #benim agent im hariç geri kalan herşeyi resetlemek gerek.
        self.all_sprite =pygame.sprite.Group()
        self.enemy= pygame.sprite.Group()
        self.player=Player()
        self.all_sprite.add(self.player)
        self.m1 =Enemy() #1. düşmanı oluşturduk
        self.m2=Enemy()  #2. düşmanı oluşturduk
        self.all_sprite.add(self.m1) # burada oluşturduğum 1. düşmanı sprite in içine ekliyoruz.
        self.all_sprite.add(self.m2) # # burada oluşturduğum 2. düşmanı sprite in içine ekliyoruz.
        self.enemy.add(self.m1)
        self.enemy.add(self.m2)

        self.reward=0
        self.total_reward=0
        self.done=False


        state_list=[]

        # get coordinate of player and enemies
        player_state=self.player.getCoordinates()
        m1_state=self.m1.getCoordinates()
        m2_state=self.m2.getCoordinates()

        #find distance
        state_list.append(self.findDistance(player_state[0],m1_state[0]))
        state_list.append(self.findDistance(player_state[1],m1_state[1])  )      
        state_list.append(self.findDistance(player_state[0],m2_state[0]))
        state_list.append(self.findDistance(player_state[1],m2_state[1]) )

        return[state_list], self

    def run(self):
        #game loop
        state= self.initialState()
        running=True
        batch_size=24

        while running:
            self.reward=2 #kafamdan tasarladığım ödül, her ölmediğinde 2 puan toplayacak
            #keep loop running at the rght speed
            clock.tick(FPS)
            #process input
            #oyundan çıkabilmek için update
            for event in pygame.event.get():
                if event.type==pygame.QUIT:
                    running = False

            #update
            #agent a bir action seçtiriyorum.
            action=self.agent.act(state)
            next_state= self.step(action)
            self.total_reward+=self.reward


            hits = pygame.sprite.spritecollide(self.player,self.enemy,False,pygame.sprite.collide_circle)  
            if hits:
                self.reward= -150
                self.total_reward+=self.reward
                self.done=True
                running = False #GAME LOOPDAN ÇIKIYORSA
                print("Total reward:  ", self.total_reward)

            self.agent.remember(state,action, self.reward, next_state, self.done)   

            #update state /storage

            state=next_state

            #training
            self.agent.replay(batch_size)

            #epsilon greedy
            #bir sonraki bölümde nasıl bir action seçeceğiimize kara verdiğimiz metodumuz.
            self.agent.adaptiveEGreedy()


            #draw and render
            screen.fill(GREEN) 
            self.all_sprite.draw(screen)

            #after drawing flip dislay
            pygame.display.flip()

        pygame.quit() 


if __name__ == "__main__":
    env=Env()
    liste=[]
    t=0
    while True:
        t+=1
        print("Episode: ", t)
        liste.append(env.total_reward)


        #initialize pygame and create window 
        pygame.init()
        screen= pygame.display.set_mode((WIDTH,HEIGHT))
        pygame.display.set_caption("RL GAME")
        clock=pygame.time.Clock()

        env.run()

我期待看到一个游戏屏幕,一个特工试图学习逃离来自上方的敌人。

python neural-network spyder reinforcement-learning
1个回答
0
投票

现在我的代码以我不理解的方式工作,因为我没有完全改变任何东西。这里是。

    """
RL GAME
"""

#pygame template

import pygame
import random
import numpy as np
from collections import deque
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam
import random

#window size
WIDTH=360
HEIGHT=360
FPS=30  #OYUNUN NE KADAR HIZLI OLACAĞI

#colors
WHITE=(225, 225, 225)
BLACK=(0,0,0)
RED=(250,0,0)
GREEN=(0,225,0)
BLUE=(0,0,225)    


class Player (pygame.sprite.Sprite):
    # sprite for a player
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image=pygame.Surface((20,20))
        self.image.fill(BLUE)
        #parameterenin farklı metodlarına erişim sağlayabilmek için
        self.rect=self.image.get_rect()
        self.radius= 10  #kutular arasında boşluğuengellemek için circle çiziminde kullanılacak.
        pygame.draw.circle(self.image, RED, self.rect.center,self.radius) #circle i nereye çizmek istiyorsun sorusu ile ilgili
        self.rect.centerx =WIDTH/2
        self.rect.bottom =HEIGHT-1
        self.speedx=0 #0 pixel ilerliyor BAŞLANGİÇTA

    def update(self,action): #buradaki action: sağa git sola git veya hiçbir şey yapma demek.
        self.speedx=0
        #keyboarddan komut alabilmek için pygame kullanılıyor
        keystate=pygame.key.get_pressed()

        if keystate[pygame.K_LEFT] or action == 0: #kendi environment ımızı tasarladığım için kendimiz değer veriyoruz 0 diye.
            self.speedx=-4
        elif keystate[pygame.K_RIGHT] or action == 1: #kendi environment ımızı tasarladığım için kendimiz değer veriyoruz 1 diye.
            self.speedx=4
        else:
            self.speedx=0

    #toplama yapmazsak tuşa bassan da spride hareket etmiyor.
        self.rect.x +=self.speedx

    #bu olmazsa sağ tarafta ekran dışına çıkabilir. Ya da sol tarafta da aynısı olur.    
    #sınır koyuyoruz
        if self.rect.right > WIDTH:
            self.rect.right= WIDTH

        if self.rect.left < 0:
            self.rect.left = 0        

    def getCoordinates(self):
        return(self.rect.x, self.rect.y)


#düşman tanımı için yeni bir class yazılır
class Enemy(pygame.sprite.Sprite):

    def __init__(self): #image yaratmak için
        pygame.sprite.Sprite.__init__(self)
        #artık düşmanlar yaratılıyor
        self.image =pygame.Surface((10,10)) #10x01 luk dikdörtgen image yaratma kısmı
        self.image.fill(RED) #red yapalım.
        self.rect=self.image.get_rect() #rectangle ile çevreleyelim ki faydalarını kullanabilelim.
        self.radius= 5 #içine 5 lik daire oturtma
        #rastgele bir saldırı gerçekleşmesi için
        pygame.draw.circle(self.image, WHITE, self.rect.center,self.radius) #circle i nereye çizmek istiyorsun sorusu ile ilgili
        #ekrana sığındırma yöntemi =WIDTH -self.rect.width
        #düşman ekran dışından gelmesin diye sığdırma
        self.rect.x =random.randrange(0, WIDTH -self.rect.width) 
        #düşmanın y ekseninden 2-6 sınırları içinden gelmeye başlaması için.
        self.rect.y =random.randrange(2,6)

        self.speedx =0 #ilerde çapraz olarak hareket ettirmek istersek diye yaratıldı.
        self.speedy=3

    #düşmanların hareket ettirilme kısmı
    def update(self):

        self.rect.x +=self.speedx #x ekseninde düz bir şekilde gidecek diye bu şekilde yazıldı.
        self.rect.y +=self.speedy

        if self.rect.top > HEIGHT +10: #eğer enemy ekrandan aşağı fazla inip görünmez olursa 
            #yine bir önceki tanımdaki gibi enemyler ekrana girsin diye.
            self.rect.x =random.randrange(0, WIDTH -self.rect.width) 
            self.rect.y =random.randrange(2,6)      
            self.speedy=3

# =============================================================================
#         if self.rect.left > WIDTH -10:
#             self.rect.x =random.randrange(0, WIDTH -self.rect.width) 
#             self.rect.y =random.randrange(2,6)        
#             self.speedx=2
#             
#         if self.rect.right > WIDTH +10:
#             self.rect.x =random.randrange(0, WIDTH -self.rect.width) 
#             self.rect.y =random.randrange(2,6)        
#             self.speedX=2
#             
# =============================================================================
    def getCoordinates(self): # rectangle ın x ve y sini alacak.
        return(self.rect.x, self.rect.y)

class DQLAgent:    
    def __init__(self):
        #parameters/hyperparameters 
        #parametreler yaratılır.
        #Input'a bu kadar nöron koyacaz.
        self.state_size = 4 #distance 
        #[(playerx- m1x),(playery- m1y),(playerx- m2x),(playery- m2y)]
        #Output'a da bu kadar nöron koyacağız.
        self.action_size = 3  # right, left, no move


        self.gamma = 0.95
        self.learning_rate = 0.001

        self.epsilon = 1 #explore rate
        self.epsilon_decay = 0.995
        self.epsilon_min = 0.01
        #deque'yu liste olarak düşün
        self.memory = deque(maxlen=1000) 
        #agentın içindeki NN'yı tanımlayan
        self.model = self.build_model()  


    def build_model(self): 
        #CONSTRUUCTİON OF NN for DQL 
        model= Sequential()
        model.add(Dense(48,input_dim = self.state_size, activation= "relu"))
        model.add(Dense(self.action_size, activation="linear"))
        model.compile(loss="mse", optimizer= Adam(lr= self.learning_rate))
        return model


    def remember(self, state, action, reward, next_state,done): 
        #STORAGE  of state,action,reward,next_state,done
        self.memory.append((state,action,reward,next_state,done))


    def act(self, state): 
        #action belirlenen yerdir

        #önce state bir array e çevriliyor. çünkü bir alt satırdaki 
        #kodlar array olarak istiyor, state olarak kabul   etmiyor.
        state=np.array(state)
        if np.random.rand()<= self.epsilon:
            return random.randrange(self.action_size)# random bir şekilde haraekt etmek istiyor.
                                                    #eski hali ile --> env.action_space.sample()
        act_values= self.model.predict(state) #state predict edilir.
        return np.argmax(act_values[0]) # pedict'e göre, q değerimin en yuksek oldugu action ı return et diyorum.



    def replay(self, batch_size): 
        #TRAINING
        #replay memory yeterince dolu (16) olmazsa önceki 
        #tecrübelerinden yararlanamıyor.
        #16 tane state,action,reward,next_state,done yoksa,
        #replay metodunu kullanamıyorsun.
        if len(self.memory) < batch_size:
            return
        minibatch = random.sample(self.memory,batch_size)
        for state,action,reward,next_state,done in minibatch:
            state=np.array(state)
            next_state=np.array(next_state)
            if done:#kırmızı alan için yazıldı bu if else
                target=reward
            else:
                target=reward + self.gamma*np.amax(self.model.predict(next_state)[0]) 
                #amax önce flaten ediyor sonra maxı seçiyor
            train_target = self.model.predict(state) 
            train_target[0][action] = target  
            self.model.fit(state, train_target, verbose=0) 

    def adaptiveEGreedy(self): 
        #CONSTRUCTION OF NN for DQL 
        if self.epsilon > self.epsilon_min:
            self.epsilon *= self.epsilon_decay




class Env(pygame.sprite.Sprite):
    def __init__(self):     #initializer
        pygame.sprite.Sprite.__init__(self) #sprite klassına inherit edebilmek için gereken kod kısmı.
        #hepsinin başında self var çünkü bunlar bir class'ın içinde yaratılıyor ve bunlar bizim initial paramtereler.
        self.all_sprite =pygame.sprite.Group()
        self.enemy= pygame.sprite.Group()  #düşamn sprite'ı
        self.player=Player()               #player sprite'ı
        self.all_sprite.add(self.player)   #player'ı sprite'ın içine ekledik. 
        self.m1 =Enemy() #1. düşmanı oluşturduk
        self.m2=Enemy()  #2. düşmanı oluşturduk
        self.all_sprite.add(self.m1) # burada oluşturduğum 1. düşmanı sprite in içine ekliyoruz.
        self.all_sprite.add(self.m2) # # burada oluşturduğum 2. düşmanı sprite in içine ekliyoruz.
        self.enemy.add(self.m1) 
        self.enemy.add(self.m2)

        #diğer önemli parameterelerin tanımlanması.
        self.reward=0
        self.total_reward=0
        self.done=False #bölümümün bitip bitmediği.
        self.agent=DQLAgent()  

    def findDistance(self, a,b):
        d=a-b
        return d 

    #environmentte action alınınca agentı environment içinde yeni statee taşıyor.
    #içine bir action alan step metodu environment içinde agent'i bir sonraki state'e taşıyor.
    def step(self, action):
        state_list=[]

        #update enemy ve player: bu ikisini next state için ekranda bir adım ileri taşıyor. 
        self.player.update(action)  #player için update metodu çağrılır.
        self.enemy.update() #enemy ler action almıyorlar çünkü onlar zaten her update de aşağı doğru hızları kadar iniyorlaar.

        # get coordinate of player and enemies
        next_player_state=self.player.getCoordinates()
        next_m1_state=self.m1.getCoordinates()
        next_m2_state=self.m2.getCoordinates()


        #find distance
        #statelerimi tuttuğum listeye distancelar eklenir.
        state_list.append(self.findDistance(next_player_state[0],next_m1_state[0]))
        state_list.append(self.findDistance(next_player_state[1],next_m1_state[1]))      
        state_list.append(self.findDistance(next_player_state[0],next_m2_state[0]))
        state_list.append(self.findDistance(next_player_state[1],next_m2_state[1]))

        return[state_list]

    #reset motodu
    def initialState(self):
        #agent bir bölümü tamamladığında ve başka bir bölüme geçtiğinde environmentde bütün değreleri baştan yaratma için.
        #benim agent im hariç geri kalan herşeyi resetlemek gerek.
        self.all_sprite =pygame.sprite.Group()
        self.enemy= pygame.sprite.Group()
        self.player=Player()
        self.all_sprite.add(self.player)
        self.m1 =Enemy() #1. düşmanı oluşturduk
        self.m2=Enemy()  #2. düşmanı oluşturduk
        self.all_sprite.add(self.m1) # burada oluşturduğum 1. düşmanı sprite in içine ekliyoruz.
        self.all_sprite.add(self.m2) # # burada oluşturduğum 2. düşmanı sprite in içine ekliyoruz.
        self.enemy.add(self.m1)
        self.enemy.add(self.m2)

        self.reward=0
        self.total_reward=0
        self.done=False


        state_list=[]

        # get coordinate of player and enemies
        player_state=self.player.getCoordinates()
        m1_state=self.m1.getCoordinates()
        m2_state=self.m2.getCoordinates()

        #find distance
        #yukarıdakinin next'leri olmadan hali.
        #next ler yok çinkü demin uodate ettiğim için next stateleri alıyorduk. 
        #ama burada update etmediğim için player ve düşmanlarımın hangi koordinatta olduğunu alırım.
        state_list.append(self.findDistance(player_state[0],m1_state[0]))
        state_list.append(self.findDistance(player_state[1],m1_state[1])  )      
        state_list.append(self.findDistance(player_state[0],m2_state[0]))
        state_list.append(self.findDistance(player_state[1],m2_state[1]) )

        return[state_list]

    def run(self): #tüm dql algoritmasının koşacagı kısım
        #game loop
        state= self.initialState()
        running=True
        batch_size=24

        while running:
            self.reward=2 #kafamdan tasarladığım ödül, her ölmediğinde 2 puan toplayacak
            #keep loop running at the rght speed
            clock.tick(FPS)
            #process input
            #oyundan çıkabilmek için update
            for event in pygame.event.get():
                if event.type==pygame.QUIT:
                    running = False

            #update kısım burada başlıyor.
            #agent a bir action seçtiriyorum.
            action=self.agent.act(state) #act metoduna bir state yolladım ve buradan bir action seçtim.
            next_state= self.step(action)  #bu action a göre step metodu bize ne state döndürecek?
            self.total_reward+=self.reward #total reward hesaplanma kısmı

            #pygame.sprite.collide_circle ile collision tipi belirtilir .   
            hits = pygame.sprite.spritecollide(self.player,self.enemy,False,pygame.sprite.collide_circle)  
            if hits:
                self.reward= -150
                self.total_reward+=self.reward
                self.done=True
                running = False #GAME LOOPDAN ÇIKIYORSA
                print("Total reward:  ", self.total_reward)

            #eğer çarpma olmadıysa
            #hatırlamam lazım.
            #storage    
            self.agent.remember(state,action, self.reward, next_state, self.done)   

            #update state 
            state=next_state

            #training
            self.agent.replay(batch_size)

            #epsilon greedy
            #bir sonraki bölümde nasıl bir action seçeceğiimize kara verdiğimiz metodumuz.
            self.agent.adaptiveEGreedy()


            #draw and render
            screen.fill(GREEN) 
            self.all_sprite.draw(screen) 

            #after drawing flip dislay
            pygame.display.flip()

        pygame.quit() 

#main loop kısmı
if __name__ == "__main__":
    env=Env()
    liste=[] #burada reward larımı tutacağım.
    t=0
    while True:
        t+=1
        print("Episode: ", t)
        liste.append(env.total_reward) # listeden gelen total reward depolanır.


        #initialize pygame and create window 
        pygame.init()
        screen= pygame.display.set_mode((WIDTH,HEIGHT))
        pygame.display.set_caption("RL GAME")
        clock=pygame.time.Clock()

        env.run() #environment'i run eden kod.
© www.soinside.com 2019 - 2024. All rights reserved.