Пример #1
0
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)
Пример #2
0
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
Пример #3
0
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)
Пример #4
0
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
Пример #5
0
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
Пример #6
0
def jump_speed_adjustment(z):
    offtheground = snakeoil.clip(z - .350, 0, 1000)
    jsa = offtheground * -800
    return jsa
Пример #7
0
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