コード例 #1
0
ファイル: Dot.py プロジェクト: Harry32/GeneticDotsExample
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)
コード例 #2
0
ファイル: Dot.py プロジェクト: Szimhead/generic-algorithm
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
コード例 #3
0
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