def steer_reactive(P, sti, tp, a, t, sx, infleX, infleA, str8ness): if abs(a) > .6: return steer_centeralign(P, sti, tp, a) maxsen = max(t) ttp = 0 aadj = a if maxsen > 0 and abs(tp) < .99: MaxSensorPos = t.index(maxsen) MaxSensorAng = sangsrad[MaxSensorPos] sensangF = -.9 aadj = MaxSensorAng * sensangF if maxsen < 40: ttp = MaxSensorAng * -P['s2sen'] / maxsen else: if str8ness < P['str8thresh'] and abs(infleA) > P['ignoreinfleA']: ttp = -abs(infleA) / infleA aadj = 0 else: ttp = 0 senslimF = .031 ttp = snakeoil.clip(ttp, tp - senslimF, tp + senslimF) else: aadj = a if tp: ttp = .94 * abs(tp) / tp else: ttp = 0 sto = steer_centeralign(P, sti, tp, aadj, ttp) return speed_appropriate_steer(P, sto, sx)
def throttle_control(P, ai, ts, sx, sl, sy, ang, steer): ao = ai if ts < 0: tooslow = sx - ts else: if steer > P['fullstis']: ts = P['fullstmaxsx'] else: okmaxspeed4steer = P['stst'] * steer * steer - P['st'] * steer + P[ 'stC'] ts = min(ts, okmaxspeed4steer) tooslow = ts - sx try: ao = 2 / (1 + math.exp(-tooslow)) - 1 except: print "exp overflow:", -tooslow ao = -1 ao -= abs(sl) * P['slipdec'] spincut = P['spincutint'] - P['spincutslp'] * abs(sy) spincut = snakeoil.clip(spincut, P['spincutclip'], 1) ao *= spincut ww = abs(ang) / P['wwlim'] wwcut = min(ww, .1) if ts > 0 and sx > 5: ao -= wwcut if ao > .8: ao = 1 return ao
def speed_appropriate_steer(P, sto, sx): if sx > 0: stmax = max( P['sxappropriatest1'] / math.sqrt(sx) - P['sxappropriatest2'], P['safeatanyspeed']) else: stmax = 1 return snakeoil.clip(sto, -stmax, stmax)
def traffic_speed_adjustment(os, sx, ts, tsen): global opHistory if not opHistory: opHistory = os return 0 tsa = 0 mpn = 0 sn = min(os[17], os[18]) if sn > tsen[9] and tsen[9] > 0: return 0 if sn < 15: sn = min(sn, os[16], os[19]) if sn < 8: sn = min(sn, os[15], os[20]) sn -= 5 if sn < 3: opHistory = os return -ts opn = mpn + sn mpp = mpn - sx / 180 sp = min(opHistory[17], opHistory[18]) if sp < 15: sp = min(sp, os[16], os[19]) if sp < 8: sp = min(sn, os[15], os[20]) sp -= 5 opHistory = os opp = mpp + sp osx = (opn - opp) * 180 osx = snakeoil.clip(osx, 0, 300) if osx - sx > 0: return 0 max_tsa = osx - ts max_worry = 80 full_serious = 20 if sn > max_worry: seriousness = 0 elif sn < full_serious: seriousness = 1 else: seriousness = (max_worry - sn) / (max_worry - full_serious) tsa = max_tsa * seriousness tsa = snakeoil.clip(tsa, -ts, 0) return tsa
def drive(c, tick): S, R, P = c.S.d, c.R.d, c.P print(P) global target_speed global lap global prev_distance_from_start global learn_final global badness badness = S['damage'] - badness skid = skid_severity(P, S['wheelSpinVel'], S['speedX']) if skid > 1: badness += 15 if car_might_be_stuck(S['speedX'], S['angle'], S['trackPos']): S['stucktimer'] = (S['stucktimer'] % 400) + 1 if car_is_stuck(S['speedX'], S['stucktimer'], S['angle'], S['trackPos'], S['track'][9], target_speed): badness += 100 R['brake'] = 0 if target_speed > 0: target_speed = -40 else: target_speed = 40 else: S['stucktimer'] = 0 if S['z'] > 4: badness += 20 infleX, infleA, straightness = track_sensor_analysis( S['track'], S['angle']) if target_speed > 0: if c.stage: if not S['stucktimer']: target_speed = speed_planning(P, S['distFromStart'], S['track'], S['trackPos'], S['speedX'], S['speedY'], R['steer'], S['angle'], infleX, infleA) target_speed += jump_speed_adjustment(S['z']) if c.stage > 1: target_speed += traffic_speed_adjustment( S['opponents'], S['speedX'], target_speed, S['track']) target_speed *= damage_speed_adjustment(S['damage']) else: if lap > 1 and T.usable_model: target_speed = speed_planning(P, S['distFromStart'], S['track'], S['trackPos'], S['speedX'], S['speedY'], R['steer'], S['angle'], infleX, infleA) target_speed *= damage_speed_adjustment(S['damage']) else: target_speed = 50 target_speed = min(target_speed, 333) caution = 1 if T.usable_model: snow = T.section_in_now(S['distFromStart']) snext = T.section_ahead(S['distFromStart']) if snow: if snow.badness > 100: caution = .80 if snow.badness > 1000: caution = .65 if snow.badness > 10000: caution = .4 if snext: if snow.end - S['distFromStart'] < 200: if snext.badness > 100: caution = .90 if snext.badness > 1000: caution = .75 if snext.badness > 10000: caution = .5 target_speed *= caution if T.usable_model or c.stage > 1: if abs(S['trackPos']) > 1: s = steer_centeralign(P, R['steer'], S['trackPos'], S['angle']) badness += 1 else: s = steer_reactive(P, R['steer'], S['trackPos'], S['angle'], S['track'], S['speedX'], infleX, infleA, straightness) else: s = steer_centeralign(P, R['steer'], S['trackPos'], S['angle']) R['steer'] = s if S['stucktimer'] and S['distRaced'] > 20: if target_speed < 0: R['steer'] = -S['angle'] if c.stage > 1: if target_speed < 0: target_speed *= snakeoil.clip(S['opponents'][0] / 20, .1, 1) target_speed *= snakeoil.clip(S['opponents'][35] / 20, .1, 1) else: R['steer'] = speed_appropriate_steer( P, traffic_navigation(S['opponents'], R['steer']), S['speedX'] + 50) if not S['stucktimer']: target_speed = abs(target_speed) slip = find_slip(S['wheelSpinVel']) R['accel'] = throttle_control(P, R['accel'], target_speed, S['speedX'], slip, S['speedY'], S['angle'], R['steer']) if R['accel'] < .01: R['brake'] = brake_control(P, R['brake'], S['speedX'], S['speedY'], target_speed, skid) else: R['brake'] = 0 R['gear'], R['clutch'] = automatic_transimission(P, S['rpm'], S['gear'], R['clutch'], S['rpm'], S['speedX'], target_speed, tick) R['clutch'] = clutch_control(P, R['clutch'], slip, S['speedX'], S['speedY'], S['gear']) if S['distRaced'] < S['distFromStart']: lap = 0 if prev_distance_from_start > S['distFromStart'] and abs(S['angle']) < .1: lap += 1 prev_distance_from_start = S['distFromStart'] if not lap: T.laplength = max(S['distFromStart'], T.laplength) elif lap == 1 and not T.usable_model: learn_track(R['steer'], S['angle'], S['track'], S['distFromStart']) elif c.stage == 3: pass else: if not learn_final: learn_track_final(T.laplength) T.post_process_track() learn_final = True if T.laplength: properlap = S['distRaced'] / T.laplength else: properlap = 0 if c.stage == 0 and lap < 4: T.record_badness(badness, S['distFromStart']) S['targetSpeed'] = target_speed target_speed = 70 badness = S['damage'] return
def jump_speed_adjustment(z): offtheground = snakeoil.clip(z - .350, 0, 1000) jsa = offtheground * -800 return jsa
def drive(c, genoma=None): S = c.S.d R = c.R.d # S: {'angle': 0.0467207, 'curLapTime': 2.468, 'damage': 0.0, 'distFromStart': 2047.54, 'distRaced': 14.9774, # 'fuel': 94.0, 'gear': 1.0, 'lastLapTime': 0.0, # 'opponents': [200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, # 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, # 4.85916, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 10.4405], 'racePos': 1.0, 'rpm': 5792.73, # 'speedX': 48.7787, 'speedY': 0.743483, 'speedZ': 0.0274631, # 'track': [5.37889, 5.66359, 6.49984, 8.44336, 14.2813, 29.5085, 65.08, 200.0, 100.793, 54.695, 37.7275, 28.963, # 23.649, 20.1121, 15.7716, 12.4104, 10.6624, 9.82549, 9.63669], 'trackPos': 0.283664, # 'wheelSpinVel': [41.4835, 40.4579, 43.3378, 42.535], 'z': 0.344934, 'focus': [-1.0, -1.0, -1.0, -1.0, -1.0]} # R: {'accel': 0.5600000000000006, 'brake': 0, 'clutch': 0, 'gear': 1, 'steer': 0.12010916050557581, # 'focus': [-90, -45, 0, 45, 90], 'meta': 0} # # Damage Control # target_speed-= S['damage'] * .05 # if target_speed < 25: target_speed= 25 # # # Steer To Corner # R['steer']= S['angle']*10 / PI # # Steer To Center # R['steer']-= S['trackPos']*.10 # R['steer']= clip(R['steer'],-1,1) # # Throttle Control # if S['speedX'] < target_speed - (R['steer']*50): # R['accel']+= .01 # else: # R['accel']-= .01 # if S['speedX']<10: # R['accel']+= 1/(S['speedX']+.1) target_speed = 100 # Steer To Corner R['steer'] = S['angle'] * 10 / PI # Steer To Center R['steer'] -= S['trackPos'] * .10 # Throttle Control if S['speedX'] < target_speed - (R['steer'] * 50): R['accel'] += .01 else: R['accel'] -= .01 if S['speedX'] < 10: R['accel'] += 1 / (S['speedX'] + .1) winner_net = neat.nn.FeedForwardNetwork.create(genoma, config) improved_frontal = max(S['track'][8], S['track'][9], S['track'][10]) inputs = [ S['angle'], S['speedX'], S['speedY'], S['speedZ'], S['trackPos'], S['track'][0], S['track'][3], S['track'][6], improved_frontal, S['track'][12], S['track'][15], S['track'][18] ] delta_accel, delta_brake, delta_steer = winner_net.activate(inputs) R['accel'] += delta_accel R['brake'] += delta_brake R['steer'] += delta_steer # Traction Control System if ((S['wheelSpinVel'][2] + S['wheelSpinVel'][3]) - (S['wheelSpinVel'][0] + S['wheelSpinVel'][1]) > 5): R['accel'] -= .2 R['accel'] = clip(R['accel'], 0, 1) # Automatic Transmission R['gear'] = 1 if S['speedX'] > 50: R['gear'] = 2 if S['speedX'] > 80: R['gear'] = 3 if S['speedX'] > 110: R['gear'] = 4 if S['speedX'] > 140: R['gear'] = 5 if S['speedX'] > 170: R['gear'] = 6 #print("R: ", R) return