如何修复Python中的“ValueError:Error when check input:expected dense\u 1\u input to have shape(4,),but get array with shape(1,)”错误?

2024-04-24 06:31:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我从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 detected, please Report your user scenario attaching a spindump (or sysdiagnose) that captures the problem - (imkxpc_attributesForCharacterIndex:reply:) block performed very slowly (2070.59 secs). 2019-04-28 23:48:19.057 python[33387:195175] IMKClient Stall detected, please Report your user scenario attaching a spindump (or sysdiagnose) that captures the problem - (imkxpc_windowLevelWithReply:) block performed very slowly (2068.59 secs). Traceback (most recent call last):

File "", line 1, in runfile('/Users/ozgeozler/Pygame/rl_game.py', wdir='/Users/ozgeozler/Pygame')

File "/anaconda3/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py", line 827, in runfile execfile(filename, namespace)

File "/anaconda3/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py", line 110, in execfile exec(compile(f.read(), filename, 'exec'), namespace)

File "/Users/ozgeozler/Pygame/rl_game.py", line 331, in env.run()

File "/Users/ozgeozler/Pygame/rl_game.py", line 262, in run state= self.initialStates()

AttributeError: 'Env' object has no attribute 'initialStates'

runfile('/Users/ozgeozler/Pygame/rl_game.py', wdir='/Users/ozgeozler/Pygame') Episode: 1 Traceback (most recent call last):

File "", line 1, in runfile('/Users/ozgeozler/Pygame/rl_game.py', wdir='/Users/ozgeozler/Pygame')

File "/anaconda3/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py", line 827, in runfile execfile(filename, namespace)

File "/anaconda3/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py", line 110, in execfile exec(compile(f.read(), filename, 'exec'), namespace)

File "/Users/ozgeozler/Pygame/rl_game.py", line 331, in env.run()

File "/Users/ozgeozler/Pygame/rl_game.py", line 298, in run self.agent.replay(batch_size)

File "/Users/ozgeozler/Pygame/rl_game.py", line 168, in replay train_target = self.model.predict(state)

File "/anaconda3/lib/python3.6/site-packages/keras/engine/training.py", line 1149, in predict x, _, _ = self._standardize_user_data(x)

File "/anaconda3/lib/python3.6/site-packages/keras/engine/training.py", line 751, in _standardize_user_data exception_prefix='input')

File "/anaconda3/lib/python3.6/site-packages/keras/engine/training_utils.py", line 138, in standardize_input_data str(data_shape))

ValueError: Error when checking input: expected dense_5_input to have shape (4,) but got array with shape (1,)

我想在Udemy上完成一门与强化学习相关的课程。基本上,我是跟着教练的。我住在火车的一部分,结果。你知道吗

附言:我对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()

我希望看到一个游戏屏幕上有一个特工试图学习如何逃离来自上面的敌人。你知道吗


Tags: inpyrectselfdeflineactionpygame
1条回答
网友
1楼 · 发布于 2024-04-24 06:31:04

现在我的代码正在以一种我不明白的方式工作,因为我没有完全改变任何东西。给你。你知道吗

    """
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.

相关问题 更多 >