From 51f719184d70f6568c5b38b7794a950632b8ed1d Mon Sep 17 00:00:00 2001 From: alexandre Date: Tue, 29 Oct 2019 10:13:29 +0100 Subject: [PATCH] working , rc release ! --- car.py | 22 +++++++++++++++++----- main.py | 12 ++++++++---- maps.py | 14 ++++++++++---- params.py | 3 ++- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/car.py b/car.py index bb342b3..4cf6a2e 100644 --- a/car.py +++ b/car.py @@ -1,3 +1,4 @@ +import datetime import math import numpy as np import random @@ -10,6 +11,7 @@ from params import ( CAR_MAX_FITNESS, CAR_SIZE, CAR_STEERING_FACTOR, + MAX_RUN_TIME, VISION_LENGTH, VISION_SPAN, THROTTLE_POWER, @@ -59,6 +61,7 @@ class Car(pygame.sprite.Sprite): self.probe_brain() self.run = True self.distance_run = 0 + self.creation_dt = datetime.datetime.now() def reset_car_pos(self): self.rect.center = ( @@ -107,7 +110,9 @@ class Car(pygame.sprite.Sprite): ) self.update_sensors() self.distance_run += int(distance(old_center, self.rect.center)) - self.brain.fitness = int(math.sqrt(self.distance_run)) + self.brain.fitness = int( + math.sqrt(self.distance_run) + ) # - 2 # penalize jittering def probe_lines_proximity(self, lines): # print(self.center_sensor, lines[0]) @@ -123,7 +128,7 @@ class Car(pygame.sprite.Sprite): pygame.draw.circle(screen, (125, 125, 255), ip, 4, 2) dist = int(distance(ip, self.rect.center)) self.probes[idx] = min(dist, self.probes[idx]) - if dist < 1.2 * self.speed or self.speed < 0.01: + if dist < 1 * self.speed or self.speed < 0.01: self.run = False self.speed = 0 # print(f'Car {id(self)} crashed') @@ -135,8 +140,8 @@ class Car(pygame.sprite.Sprite): def probe_brain(self): res = self.brain.predict(np.array(self.probes)) - self.heading_change = res[0] * 15 - self.throttle = res[1] * 10 + self.heading_change = res[0] * 30 + self.throttle = res[1] * 5 def update(self): # rotate @@ -145,7 +150,14 @@ class Car(pygame.sprite.Sprite): self.rect = self.image.get_rect() self.rect.center = old_center self.update_position() - if self.speed < 0.01 or self.brain.fitness > CAR_MAX_FITNESS: + run_time = (datetime.datetime.now() - self.creation_dt).seconds + if run_time > MAX_RUN_TIME: + print("RUNTIME EXCEEDED") + if ( + self.speed < 0.01 + or self.brain.fitness > CAR_MAX_FITNESS + or run_time > MAX_RUN_TIME + ): self.run = False print(f"Car {id(self)} crashed") # print( diff --git a/main.py b/main.py index 218e69e..3f2cfd4 100755 --- a/main.py +++ b/main.py @@ -7,12 +7,12 @@ import time from car import Car from genetics import genetic_selection, genetic_reproduction from maps import map1 -from params import CELL_COLOR, screen +from params import CELL_COLOR, GX, GY, screen # https://medium.com/intel-student-ambassadors/demystifying-genetic-algorithms-to-enhance-neural-networks-cde902384b6e clock = pygame.time.Clock() - +font = pygame.font.SysFont("hack", 24) map_lines = map1 @@ -40,6 +40,8 @@ def run_round(all_cars): for line in map_lines: pygame.draw.line(screen, (255, 255, 255), line[0], line[1]) + text = font.render(f"Generation {loop}", True, (128, 128, 128)) + screen.blit(text, (GX - 50 - text.get_width(), text.get_height() // 2)) pygame.display.flip() clock.tick(48) @@ -66,7 +68,9 @@ def run_round(all_cars): pygame.display.flip() +loop = 0 while True: + loop += 1 run_round(all_cars) - pygame.display.flip() - clock.tick(24) + # pygame.display.flip() + # clock.tick(24) diff --git a/maps.py b/maps.py index b3875f6..b3693aa 100644 --- a/maps.py +++ b/maps.py @@ -5,15 +5,18 @@ def generate_map_1(): path = [ (25, int(GY - 25)), (int(GX / 2), int(GY - 25)), - (int(GX / 2 + 75), int(GY - 150)), + (int(GX / 2 + 75), int(GY - 130)), (int(GX / 2 + 150), int(GY - 150)), (int(GX - 75), int(GY / 2)), (int(GX - 100), int(GY / 2 - 75)), (int(GX - 100), int(GY / 2 - 150)), (int(GX - 50), int(GY / 4)), (int(3 * GX / 4 - 50), int(50)), - (int(50), int(50)), + (int(150), int(75)), + (int(50), int(150)), (int(100), int(GY / 2)), + (int(120), int(GY / 2) + 75), + (25, int(GY - 150)), (25, int(GY - 25)), ] @@ -21,14 +24,17 @@ def generate_map_1(): (100, int(GY - 85)), (int(GX / 2 - 50), int(GY - 85)), (int(GX / 2 + 50), int(GY - 210)), - (int(GX / 2 + 110), int(GY - 210)), + (int(GX / 2 + 110), int(GY - 220)), (int(GX - 170), int(GY / 2 + 30)), (int(GX - 200), int(GY / 2 - 20)), (int(GX - 200), int(GY / 2 - 200)), (int(GX - 170), int(GY / 4 - 20)), (int(3 * GX / 4 - 100), int(120)), - (int(120), int(120)), + (int(180), int(140)), + (int(120), int(180)), (int(175), int(GY / 2)), + (int(220), int(GY / 2) + 100), + (100, int(GY - 120)), (100, int(GY - 85)), ] diff --git a/params.py b/params.py index fff0245..5e66a82 100644 --- a/params.py +++ b/params.py @@ -10,7 +10,8 @@ CAR_SIZE = 20 CAR_MAX_SPEED = 100 CAR_MAX_FITNESS = 100 CAR_STEERING_FACTOR = 10 -VISION_LENGTH = 60 +MAX_RUN_TIME = 60 +VISION_LENGTH = 100 VISION_SPAN = 35 # degrees THROTTLE_POWER = 3