class Dot: def __init__(self, position, goalPosition, baby=False): self.brain = Brain(400, baby) self.dead = False self.reachedGoal = False self.fitness = 0 self.goalPosition = goalPosition self.position = position self.velocity = (0, 0) self.acceleration = () self.color = (0, 0, 0) def show(self, container): pygame.draw.circle(container, self.color, self.position, 3) def move(self, obstacles=[]): if not self.dead and not self.reachedGoal: self.acceleration = self.brain.getNextDirection() if self.acceleration is None: self.dead = True else: self.__updateVelocity() self.__updatePosition(obstacles) def calculateFitness(self): if self.reachedGoal: self.fitness = 1.0 / 16 + 1000 / (self.brain.step**2) else: distance = math.hypot((self.position[0] - self.goalPosition[0]), (self.position[1] - self.goalPosition[1])) if distance == 0: distance = 1 self.fitness = 1.0 / (distance**2) def getFitness(self): return self.fitness def gimmeBaby(self, position): baby = Dot(position, self.goalPosition, True) baby.brain = self.brain.clone() return baby def setColor(self, color): self.color = color def __updateVelocity(self): vx = self.velocity[0] + self.acceleration[0] vy = self.velocity[1] + self.acceleration[1] if vx > 5: vx = 5 if vy > 5: vy = 5 self.velocity = (vx, vy) def __updatePosition(self, obstacles=[]): px = self.position[0] + self.velocity[0] py = self.position[1] + self.velocity[1] distance = math.hypot((px - self.goalPosition[0]), (py - self.goalPosition[1])) if distance < 6: self.reachedGoal = True else: for obstacle in obstacles: if obstacle.checkColision(px, py): self.dead = True if px < 0: px = 0 self.dead = True elif px > 800: px = 800 self.dead = True if py < 0: py = 0 self.dead = True elif py > 800: py = 800 self.dead = True self.position = (px, py)
class Dot: def __init__(self): self.brain = Brain(110) self.pos = (main.WIDTH / 2, main.HEIGHT - 200) self.vel = (0, 0) self.acc = (0, 0) self.dead = False self.reachedGoal = False self.fitness = 0 self.isBest = False self.checkpointsReached = 0 self.checkpoints = [] def show(self): if self.isBest: dot = pygame.Rect(self.pos[0], self.pos[1], 8, 8) pygame.draw.rect(main.WIN, main.GREEN, dot) else: dot = pygame.Rect(self.pos[0], self.pos[1], 4, 4) pygame.draw.rect(main.WIN, main.YELLOW, dot) def move(self): if len(self.brain.directions) > self.brain.step: self.acc = self.brain.directions[self.brain.step] self.brain.step += 1 else: self.dead = True self.vel = np.add(self.vel, self.acc) if self.vel[0] > 5: self.vel[0] = 5 elif self.vel[0] < -5: self.vel[0] = -5 if self.vel[1] > 5: self.vel[1] = 5 elif self.vel[1] < -5: self.vel[1] = -5 self.pos = np.add(self.vel, self.pos) def update(self, obstacles, checkpoints): if not self.dead and not self.reachedGoal: self.move() if self.pos[0] < 10 or self.pos[1] < 10 or self.pos[ 0] > main.WIDTH - 10 or self.pos[1] > main.HEIGHT - 10: self.dead = True elif math.sqrt(((self.pos[0] - main.goal.center[0])**2) + ((self.pos[1] - main.goal.center[1])**2)) < 10: self.reachedGoal = True for obs in obstacles: if obs.colliderect(pygame.Rect(self.pos[0], self.pos[1], 8, 8)): self.dead = True for check in checkpoints: if check.colliderect( pygame.Rect(self.pos[0], self.pos[1], 8, 8)) and check not in self.checkpoints: self.checkpointsReached += 1 self.checkpoints.append(check) def calculateFitness(self): if self.reachedGoal: self.fitness = 1.0 / 8.0 + 1000.0 / (self.brain.step * self.brain.step) else: distanceToGoal = math.sqrt(( (self.pos[0] - main.goal.center[0])**2) + ( (self.pos[1] - main.goal.center[1])**2)) self.fitness = 1.0 / (distanceToGoal * distanceToGoal) self.fitness += (self.checkpointsReached * self.checkpointsReached) / 1000 def getBaby(self): baby = Dot() baby.brain = self.brain.clone() return baby
class Dot(object): def __init__(self, goal, screen, steps, pos=PVector(10, 10)): self.screen = screen width = screen[0] height = screen[1] self.pos = pos.copy() self.startpos = pos.copy() self.vel = PVector(0, 0) self.acc = PVector(0, 0) self.brain = Brain(steps) self.radius = 2 self.color = (0, 0, 0) self.dead = False self.goal = goal self.fitness = 0.0 self.reachedGoal = False self.isBest = False def getGenome(self): genome = [] for i in self.brain.directions: genome.append(PVector(i.x, i.y)) return genome def show(self, surface): if self.isBest: circle(surface, (0, 255, 0), (int(self.pos.x), int(self.pos.y)), self.radius * 4) else: circle(surface, self.color, (int(self.pos.x), int(self.pos.y)), self.radius) def move(self): if self.brain.step < len(self.brain.directions): self.acc = self.brain.directions[self.brain.step] self.brain.step += 1 else: self.dead = True self.vel += self.acc self.pos += self.vel self.vel.limit(5) def update(self, obstacles): width = self.screen[0] height = self.screen[1] if not self.dead and not self.reachedGoal: self.move() for i in obstacles: if i.isIn(self.pos): self.dead = True if self.pos.x < self.radius or self.pos.y < self.radius or self.pos.x > width - self.radius or self.pos.y > height - self.radius: self.dead = True elif dist(self.pos.x, self.pos.y, self.goal.x, self.goal.y) < 5: self.reachedGoal = True self.dead = True def calculateFitness(self): distanceToGoal = dist(self.pos.x, self.pos.y, self.goal.x, self.goal.y) if self.reachedGoal: self.fitness = 1.0 / 16.0 + 10000.0 / (self.brain.step**2) else: self.fitness = 1.0 / (distanceToGoal**2) def gimmieBaby(self, newSteps, newPos): baby = Dot(self.goal, self.screen, newSteps, newPos) baby.brain = self.brain.clone() if newSteps > len(self.brain.directions): baby.brain.addSteps(newSteps - len(self.brain.directions)) if len(baby.brain.directions) > newSteps: for i in range(len(baby.brain.directions) - newSteps): baby.brain.directions.pop() return baby