Код: Выделить всё
import sys
import math
import random
POPULATION_SIZE=10
GENE_LENGTH=10
MUTATION_RATE=.1
ELITISM=.1
ELITISM_IDX=int (ELITISM*POPULATION_SIZE)
GENERATIONS=20
MAX_ANGLE_CHANGE=18
FRICTION=.85
WIDTH=16000
HEIGHT=9000
MIN_FITNESS=0
MAX_FITNESS=100000
def distance(ax, ay, bx, by):
return math.sqrt(pow(ax-bx,2)+pow(ay-by,2))
def validate_angle(cur_angle,desired_angle):
angle_diff=(desired_angle-cur_angle+360)%360
if angle_diff>180:
angle_diff-=360
angle_change=max(-MAX_ANGLE_CHANGE,min(angle_diff,MAX_ANGLE_CHANGE))
new_angle=(cur_angle+angle_change)%360
return int(new_angle)
def validate_position(x,y,vx,vy,angle,thrust):
rad_angle=math.radians(angle)
vx+=int(math.cos(rad_angle)*thrust)
vy+=int(math.sin(rad_angle)*thrust)
x+=vx; y+=vy
vx=int(vx*FRICTION); vy=int(vy*FRICTION)
return x,y,vx,vy
def generate_individual():
chromosome=[]
x,y,vx,vy,angle=init_x,init_y,init_vx,init_vy,init_angle
for _ in range(GENE_LENGTH):
desired_angle=angle+random.uniform(-MAX_ANGLE_CHANGE,MAX_ANGLE_CHANGE)
angle=validate_angle(angle,desired_angle)
thrust=random.randint(0,200)
x,y,vx,vy=validate_position(x,y,vx,vy,angle,thrust)
chromosome.append((int(angle),int(thrust)))
return chromosome
def generate_population():
return [generate_individual() for _ in range(POPULATION_SIZE)]
def simulate(chromosome):
x,y,vx,vy,angle=init_x,init_y,init_vx,init_vy,init_angle
for gene in chromosome:
desired_angle,thrust=gene
angle=validate_angle(angle,desired_angle)
x,y,vx,vy=validate_position(x,y,vx,vy,angle,thrust)
if distance(x,y,*checkpoint)HEIGHT or yWIDTH or x
Подробнее здесь: [url]https://stackoverflow.com/questions/78825525/genetic-algorithm-car-trajectory[/url]