示例#1
0
def run_evaluator(drawsurf, circles, gen_evaluator, generation):
    one_seat_space = config.get('Fseat-size') ** 2
    for spec_c, specimen in enumerate(generation):
        for i in xrange(1, config.get('Ipacking-iter')):
            Util.pack(circles, specimen, damping=0.1/i )

        if config.getControl('showing specimen') == 0:
            ds = drawsurf
        else:
            ds = None
        standing, sitting, seats_space, floor_space, stat, cost, comfort, space =\
                process_specimen(ds, specimen, circles, one_seat_space)
        gen_evaluator.addStat(spec_c, stat,( standing, sitting, seats_space, floor_space, stat, cost, comfort, space) )
        yield spec_c, specimen, standing, sitting, seats_space, floor_space, stat, cost, comfort, space
示例#2
0
def run():
    gen_count = 0
    time_now = time_last_tick = time_start = time.clock()
    time_delta = 0
    one_seat_space = config.get('Fseat-size') ** 2
    circles = []
    circles = generate_circles()

    generation = Generation()
    for i in range(0,config.get('Ipopulation')):
        generation.add(get_random_specimen())



    gen_count = 0
    generator = None
    gen_evaluator = None
    gen_count = spec_c = specimen = standing = sitting = seats_space = \
            floor_space = stat = cost = comfort = space = rows = \
            rows_spacing = seat_separator = seats_potential = 0
    bus_w = bus_h = 0
    while True:
        surface.fill((0, 0, 0))
        drawsurf.fill((255, 255, 255))
        if config.getControl('running'):
            try:
                spec_c, specimen, standing, sitting, seats_space, floor_space, stat, cost, comfort, space = \
                        generator.next()
                bus_w = specimen.rect.w
                bus_h = specimen.rect.h
                rows = specimen.rows
                rows_spacing = specimen.rows_spacing
                seat_separator = specimen.seat_separator
                seats_potential = specimen.seats_potential
            except (StopIteration, AttributeError):
                if gen_evaluator:
                    new_specimens = []
                    print('Generation: %d' % gen_count)
                    for s in gen_evaluator.get_elite(config.get('Felitism')):
                        new_specimens.append(s)
                    print 'Elite: ' + str(len(new_specimens))

                    roulettes=[]
                    for s in gen_evaluator.roulette(config.get('Ipopulation') \
                            * config.get('Froulette') - len(new_specimens)):
                        roulettes.append(s)
                    print('Roulette: '+ str(len(roulettes)))
                    breeder = Breeder(roulettes + new_specimens)
                    bred_specimens = \
                            breeder.breed( config.get('Ipopulation') - len(new_specimens) )
                    print 'Bred: ' + str(len(bred_specimens))

                    new_specimens = new_specimens + bred_specimens
                    print 'Next generation: '+str(len(new_specimens))
                    new_generation = Generation()
                    for s in new_specimens:
                        new_generation.add(s)
                    generation = new_generation


                gen_evaluator = GenerationEvaluator(generation)
                generator = run_evaluator(drawsurf, circles, gen_evaluator, generation)
                max_gen = config.get('Imax-generations')
                if max_gen > 0 and gen_count >= max_gen:
                    config.setControl('running', False)
                else:
                    gen_count += 1
            time_now = time.clock()
        else:
            time_now = time.clock()
            time_delta += time_now - time_last_tick
        time_last_tick = time_now

        show_mode = config.getControl('showing specimen')
        if show_mode > 0:
            try:
                if gen_evaluator:
                    best = list(gen_evaluator.get_best(show_mode))
                    spec = best[show_mode-1][1]
                    try:
                        standing, sitting, seats_space, floor_space, stat, cost, comfort, space = best[show_mode-1][2]
                    except:
                        pass
                    #print standing, sitting, seats_space, floor_space, stat, cost, comfort, space
                    spec.update2(drawsurf, None)
                    #standing, sitting, seats_space, floor_space, stat, cost, comfort, space = \
                    #        process_specimen(drawsurf, spec, None, one_seat_space)

                    max_adapt = config.get('Imax-adaptation')
                    if max_adapt > 0 and stat >= max_adapt:
                        config.setControl('running', False)

                    bus_w = spec.rect.w
                    bus_h = spec.rect.h
                    rows = spec.rows
                    rows_spacing = spec.rows_spacing
                    seat_separator = spec.seat_separator
                    seats_potential = spec.seats_potential
                    sitting = len(spec.seats)
            except (IndexError, TypeError):
                config.setControl('showing specimen', 'ERROR')



        overlay.setStat('stat cost effect = ', cost)
        overlay.setStat('stat comfort = ', comfort)
        overlay.setStat('stat passangers = ', space)
        overlay.setStat('stat = ', stat)

        overlay.setTop('time = ', time_now - time_start - time_delta)
        overlay.setTop('generation = ', gen_count)
        overlay.setTop('specimen = ', spec_c)
        overlay.set('standing = ',standing)
        overlay.set('seats = ', sitting)
        overlay.set('seats (potential) = ', seats_potential)
        overlay.set('bus width = ', bus_w)
        overlay.set('bus height = ', bus_h)
        overlay.set('rows spacing = ', rows_spacing)
        overlay.set('seat separator = ', seat_separator)
        overlay.set('seats space = ', seats_space)
        overlay.set('floor space = ', floor_space)


        get_input()
        overlay.draw(drawsurf, config)
        surface.blit(drawsurf, (0, 0))
        pygame.display.flip()