Exemplo n.º 1
0
class EAGui(tk.Tk):
    def __init__(self, delay, nr_of_runs=1, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.delay = delay
        self.nr_of_runs = nr_of_runs
        self.current_run = 0
        self.current_generation = 0
        self.fitness_log_average = []
        self.fitness_log_best = []
        self.standard_deviation_log = []
        self.center_window()
        self.beertracker_worlds = None
        self.ea = None
        self.build_parameter_menu()

    def center_window(self):
        ws = self.winfo_screenwidth()  # width of the screen
        hs = self.winfo_screenheight()  # height of the screen
        w = 1000
        h = 900
        x = (ws/2) - (w/2)
        y = (hs/2) - (h/2)
        self.geometry('%dx%d+%d+%d' % (w, h, x, y))

    def build_parameter_menu(self):
        self.horizontal_slider_1 = tk.Scale(self, length=1000, from_=2, to=1000, orient=tk.HORIZONTAL,
                                            label="Genotype Pool Size", resolution=2,
                                            command=self.control_pool_size_genotype)
        self.horizontal_slider_1.set(GENOTYPE_POOL_SIZE)
        self.horizontal_slider_1.pack()
        self.horizontal_slider_2 = tk.Scale(self, length=1000, from_=2, to=1000, orient=tk.HORIZONTAL,
                                            label="Adult Pool Size", resolution=2, command=self.control_pool_size_adult)
        self.horizontal_slider_2.set(ADULT_POOL_SIZE)
        self.horizontal_slider_2.pack()
        self.horizontal_slider_3 = tk.Scale(self, length=1000, from_=0, to=1000, orient=tk.HORIZONTAL,
                                            label="Elitism", resolution=1, command=self.control_pool_size_adult)
        self.horizontal_slider_3.set(ELITISM)
        self.horizontal_slider_3.pack()

        ann_entry_group = tk.Frame(self)
        tk.Label(ann_entry_group, text="Hidden layers:").pack(side=tk.LEFT)
        self.hidden_layers = tk.StringVar()
        self.hidden_layers.set("3")
        tk.Entry(ann_entry_group, textvariable=self.hidden_layers).pack(side=tk.LEFT)
        tk.Label(ann_entry_group, text="Activation functions (0:Sigmoid, 1:Hyperbolic tangent, 2:Rectify, 3:Softmax):",
                 padx=20).pack(side=tk.LEFT)
        self.activation_functions = tk.StringVar()
        self.activation_functions.set("0, 0")
        tk.Entry(ann_entry_group, textvariable=self.activation_functions).pack(side=tk.LEFT)
        ann_entry_group.pack(anchor=tk.W)

        crossover_slider_group = tk.Frame(self)
        self.horizontal_slider_4 = tk.Scale(crossover_slider_group, length=500, from_=0.0, to=1.0, resolution=-1,
                                            orient=tk.HORIZONTAL, label="Crossover Rate")
        self.horizontal_slider_4.set(CROSSOVER_RATE)
        self.horizontal_slider_4.pack(side=tk.LEFT)
        self.horizontal_slider_5 = tk.Scale(self, length=1000, from_=0, to=1, resolution=-1, orient=tk.HORIZONTAL,
                                            label="Mutation Rate")
        self.horizontal_slider_5.set(MUTATION_RATE)
        self.horizontal_slider_5.pack()
        self.horizontal_slider_6 = tk.Scale(crossover_slider_group, length=500, from_=1, to=100, orient=tk.HORIZONTAL,
                                            label="Points of Crossover")
        self.horizontal_slider_6.set(POINTS_OF_CROSSOVER)
        self.horizontal_slider_6.pack(side=tk.LEFT)
        crossover_slider_group.pack(anchor=tk.W)

        self.horizontal_slider_7 = tk.Scale(self, length=1000, from_=1, to=10000, orient=tk.HORIZONTAL,
                                            label="Symbol Set Size")
        self.horizontal_slider_7.set(SYMBOL_SET_SIZE)
        self.horizontal_slider_7.pack(anchor=tk.W)

        tournament_slider_group = tk.Frame(self)
        self.horizontal_slider_8 = tk.Scale(tournament_slider_group, length=500, from_=3, to=500, orient=tk.HORIZONTAL,
                                            label="Tournament Size")
        self.horizontal_slider_8.set(TOURNAMENT_SIZE)
        self.horizontal_slider_8.pack(side=tk.LEFT)
        self.horizontal_slider_9 = tk.Scale(tournament_slider_group, length=500, from_=0, to=1, resolution=-1,
                                            orient=tk.HORIZONTAL, label="Tournament Slip-through Probability")
        self.horizontal_slider_9.set(TOURNAMENT_SLIP_THROUGH_PROBABILITY)
        self.horizontal_slider_9.pack(side=tk.LEFT)
        tournament_slider_group.pack(anchor=tk.W)

        self.horizontal_slider_10 = tk.Scale(self, length=1000, from_=1, to=1000, orient=tk.HORIZONTAL,
                                             label="Initial Temperature")
        self.horizontal_slider_10.set(INITIAL_TEMPERATURE)
        # self.horizontal_slider_10.pack()
        self.horizontal_slider_11 = tk.Scale(self, length=1000, from_=1, to=20, orient=tk.HORIZONTAL,
                                             label="Nr of Scenarios")
        self.horizontal_slider_11.set(NR_OF_SCENARIOS)
        self.horizontal_slider_11.pack(anchor=tk.W)
        self.horizontal_slider_12 = tk.Scale(self, length=1000, from_=1, to=500, orient=tk.HORIZONTAL,
                                             label="Max Number of Generations")
        self.horizontal_slider_12.set(MAX_GENERATIONS)
        self.horizontal_slider_12.pack()

        self.scenario_protocol = tk.IntVar()
        self.scenario_protocol.set(SCENARIO_PROTOCOL)
        scenario_protocol_group = tk.Frame(self)
        tk.Label(scenario_protocol_group, text="Scenario Protocol").pack(anchor=tk.W)
        tk.Radiobutton(scenario_protocol_group, text="Static", variable=self.scenario_protocol,
                       value=1).pack(side=tk.LEFT)
        tk.Radiobutton(scenario_protocol_group, text="Dynamic", variable=self.scenario_protocol,
                       value=2).pack(side=tk.LEFT)
        tk.Radiobutton(scenario_protocol_group, text="Static, test on random", variable=self.scenario_protocol,
                       value=3).pack(side=tk.LEFT)
        scenario_protocol_group.pack(anchor=tk.W)
        
        self.agent_type = tk.IntVar()
        self.agent_type.set(AGENT_TYPE)
        agent_type_group = tk.Frame(self)
        tk.Label(agent_type_group, text="Agent Type").pack(anchor=tk.W)
        tk.Radiobutton(agent_type_group, text="Standard", variable=self.agent_type,
                       value=1).pack(side=tk.LEFT)
        tk.Radiobutton(agent_type_group, text="No wrap", variable=self.agent_type,
                       value=2).pack(side=tk.LEFT)
        tk.Radiobutton(agent_type_group, text="Pull", variable=self.agent_type,
                       value=3).pack(side=tk.LEFT)
        agent_type_group.pack(anchor=tk.W)

        self.mutation_protocol = tk.IntVar()
        self.mutation_protocol.set(MUTATION_PROTOCOL)
        mutation_protocol_group = tk.Frame(self)
        tk.Label(mutation_protocol_group, text="Mutation Protocol").pack(anchor=tk.W)
        tk.Radiobutton(mutation_protocol_group, text="Individual", variable=self.mutation_protocol,
                       value=1).pack(side=tk.LEFT)
        tk.Radiobutton(mutation_protocol_group, text="Component", variable=self.mutation_protocol,
                       value=2).pack(side=tk.LEFT)
        mutation_protocol_group.pack(anchor=tk.W)

        self.adult_selection_protocol = tk.IntVar()
        self.adult_selection_protocol.set(ADULT_SELECTION_PROTOCOL)
        adult_selection_group = tk.Frame(self)
        tk.Label(adult_selection_group, text="Adult Selection Protocol").pack(anchor=tk.W)
        tk.Radiobutton(adult_selection_group, text="Full", variable=self.adult_selection_protocol,
                       command=self.control_pool_size_adult, value=1).pack(side=tk.LEFT)
        tk.Radiobutton(adult_selection_group, text="Over Production", variable=self.adult_selection_protocol,
                       command=self.control_pool_size_adult, value=2).pack(side=tk.LEFT)
        tk.Radiobutton(adult_selection_group, text="Mixing", variable=self.adult_selection_protocol,
                       value=3).pack(side=tk.LEFT)
        adult_selection_group.pack(anchor=tk.W)

        self.parent_selection_protocol = tk.IntVar()
        self.parent_selection_protocol.set(PARENT_SELECTION_PROTOCOL)
        parent_selection_group = tk.Frame(self)
        tk.Label(parent_selection_group, text="Parent Selection Protocol").pack(anchor=tk.W)
        tk.Radiobutton(parent_selection_group, text="Fitness Proportionate", variable=self.parent_selection_protocol,
                       value=1).pack(side=tk.LEFT)
        tk.Radiobutton(parent_selection_group, text="Sigma-scaling", variable=self.parent_selection_protocol,
                       value=2).pack(side=tk.LEFT)
        tk.Radiobutton(parent_selection_group, text="Tournament selection", variable=self.parent_selection_protocol,
                       value=3).pack(side=tk.LEFT)
        tk.Radiobutton(parent_selection_group, text="Boltzmann Selection", variable=self.parent_selection_protocol,
                       value=4).pack(side=tk.LEFT)
        parent_selection_group.pack(anchor=tk.W)

        start_button = tk.Button(self, text="Start", width=20, command=self.start_simulation)
        start_button.pack()

    def control_pool_size_genotype(self, event=None):
        if self.adult_selection_protocol.get() == 1:
            self.horizontal_slider_2.set(self.horizontal_slider_1.get())
        elif self.adult_selection_protocol.get() == 2:
            self.horizontal_slider_2.set(min(self.horizontal_slider_2.get(), self.horizontal_slider_1.get() - 2))

    def control_pool_size_adult(self, event=None):
        if self.adult_selection_protocol.get() == 1:
            self.horizontal_slider_1.set(self.horizontal_slider_2.get())
        elif self.adult_selection_protocol.get() == 2:
            self.horizontal_slider_1.set(max(self.horizontal_slider_1.get(), self.horizontal_slider_2.get() - 6))
        if self.parent_selection_protocol.get() == 3:
            self.horizontal_slider_8.set(min(self.horizontal_slider_8.get(), self.horizontal_slider_2.get() // 2))
        self.horizontal_slider_3.set(min(self.horizontal_slider_3.get(), self.horizontal_slider_2.get()))

    def start_simulation(self):
        self.current_run = 0
        self.fitness_log_average = []
        self.fitness_log_best = []
        self.standard_deviation_log = []
        self.start_ea()

    def start_ea(self):
        self.parse_ann_input()
        self.ea = EvolutionaryAlgorithm(genotype_pool_size=self.horizontal_slider_1.get(),
                                        adult_pool_size=self.horizontal_slider_2.get(),
                                        elitism=self.horizontal_slider_3.get(),
                                        genotype_length=self.genotype_size,
                                        phenotype_length=self.genotype_size,
                                        adult_selection_protocol=self.adult_selection_protocol.get(),
                                        parent_selection_protocol=self.parent_selection_protocol.get(),
                                        crossover_rate=self.horizontal_slider_4.get(),
                                        mutation_rate=self.horizontal_slider_5.get(),
                                        mutation_protocol=self.mutation_protocol.get(),
                                        points_of_crossover=self.horizontal_slider_6.get(),
                                        symbol_set_size=self.horizontal_slider_7.get(),
                                        tournament_size=self.horizontal_slider_8.get(),
                                        tournament_slip_through_probability=self.horizontal_slider_9.get(),
                                        initial_temperature=self.horizontal_slider_10.get(),
                                        hidden_layers=self.layers_list,
                                        activation_functions=self.activations_list,
                                        generations=self.horizontal_slider_12.get())

        self.beertracker_worlds = [self.initialize_board() for _ in range(self.horizontal_slider_11.get())]
        self.current_generation = 0
        self.fitness_log_average.append([])
        self.fitness_log_best.append([])
        self.standard_deviation_log.append([])
        self.timer = time()
        self.run_ea()

    def run_ea(self):
        self.ea.run_one_life_cycle(self.beertracker_worlds)
        if self.current_generation == 0:
            self.timer = time() - self.timer
        self.current_generation += 1
        self.write_to_log()
        self.reset_scenarios()
        if self.current_generation < self.horizontal_slider_12.get() and \
                self.ea.phenotype_adult_pool[0].fitness_value < 1.0:
            self.after(self.delay, lambda: self.run_ea())
        else:
            self.current_run += 1
            if self.current_run < self.nr_of_runs:
                print "Current run", self.current_run
                self.start_ea()
            else:
                self.end_ea_run_visualisation()

    def end_ea_run_visualisation(self):
        print "Avg best fitness:", sum([self.fitness_log_best[i][-1] for i in range(len(self.fitness_log_best))]) / \
                                   len(self.fitness_log_best)
        print "Best fitness:", max([self.fitness_log_best[i][-1] for i in range(len(self.fitness_log_best))])
        BeerTrackerGui(
                    phenotype=self.ea.phenotype_adult_pool[0],
                    environments=self.beertracker_worlds,
                    fitness_log_average=self.fitness_log_average,
                    fitness_log_best=self.fitness_log_best,
                    standard_deviation_log=self.standard_deviation_log)
        print "Average Generations:", \
            sum([len(l) for l in self.fitness_log_average]) / len(self.fitness_log_average)

    def initialize_board(self):
        beertracker_world = BeerTrackerWorld(width=WORLD_WIDTH, height=WORLD_HEIGHT, agent_type=self.agent_type.get())
        return beertracker_world

    def reset_scenarios(self):
        if self.scenario_protocol.get() == 1:
            for world in self.beertracker_worlds:
                world.reset()
        else:
            self.beertracker_worlds = [self.initialize_board() for _ in range(len(self.beertracker_worlds))]

    def parse_ann_input(self):
        if self.hidden_layers.get() != '':
            self.layers_list = [INPUT_NODES] + \
                               map(int, self.hidden_layers.get().replace(" ", "").split(",")) + \
                               [OUTPUT_NODES]
        else:
            self.layers_list = [INPUT_NODES, OUTPUT_NODES]
        if not ONE_HOT_OUTPUT:
            self.layers_list[-1] = 2
        # Two extra nodes for detecting walls
        if self.agent_type.get() == 2:
            self.layers_list[0] += 2
        if self.agent_type.get() == 3:
            self.layers_list[-1] += 1
        if CENTERED_NODE:
            self.layers_list[0] += 1
        if FULL_NODE:
            self.layers_list[0] += 1
        self.activations_list = map(int, str(self.activation_functions.get()).replace(" ", "").split(","))
        self.genotype_size = sum([self.layers_list[i] * self.layers_list[i + 1]
                                  for i in range(len(self.layers_list) - 1)])
        if RECURENCE:
            for i in range(1, len(self.layers_list)):
                self.genotype_size += pow(self.layers_list[i], 2)
        # A Bias, time constant and gains value for each non-input neuron
        self.genotype_size += sum(self.layers_list[1:]) * 3

    def write_to_log(self):
        print "Gen:", "%.2d" % self.current_generation, "\tBest fitness:", \
            "%.3f" % round(self.ea.phenotype_adult_pool[0].fitness_value, 3), "\tAverage fitness:", \
            "%.3f" % round(self.ea.avg_fitness, 3), "\tStandard deviation: ", \
            "%.5f" % round(self.ea.standard_deviation, 3), \
            "Fitness components:", self.ea.phenotype_adult_pool[0].fitness_components, "\tTime left:", \
            "%02d:%02d" % (divmod(self.timer * (self.horizontal_slider_12.get() - self.current_generation), 60)), \
            "\tBest Phenotype:", self.ea.phenotype_adult_pool[0].components
        self.fitness_log_average[self.current_run].append(self.ea.avg_fitness)
        self.fitness_log_best[self.current_run].append(self.ea.phenotype_adult_pool[0].fitness_value)
        self.standard_deviation_log[self.current_run].append(self.ea.standard_deviation)
Exemplo n.º 2
0
class Gui(tk.Tk):
    def __init__(self, delay, nr_of_runs=1, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.delay = delay
        self.nr_of_runs = nr_of_runs
        self.current_run = 0
        self.current_generation = 0
        self.fitness_log_average = []
        self.fitness_log_best = []
        self.standard_deviation_log = []
        self.ea = None
        self.build_parameter_menu()

    def build_parameter_menu(self):
        self.horizontal_slider_1 = tk.Scale(self, length=1000, from_=2, to=1000, orient=tk.HORIZONTAL,
                                            label="Genotype Pool Size", resolution=2,
                                            command=self.control_pool_size_genotype)
        self.horizontal_slider_1.set(GENOTYPE_POOL_SIZE)
        self.horizontal_slider_1.pack()
        self.horizontal_slider_2 = tk.Scale(self, length=1000, from_=2, to=1000, orient=tk.HORIZONTAL,
                                            label="Adult Pool Size", resolution=2, command=self.control_pool_size_adult)
        self.horizontal_slider_2.set(ADULT_POOL_SIZE)
        self.horizontal_slider_2.pack()
        self.horizontal_slider_3 = tk.Scale(self, length=1000, from_=2, to=1000, orient=tk.HORIZONTAL,
                                            label="Genotype Length")
        self.horizontal_slider_3.set(GENOTYPE_LENGTH)
        self.horizontal_slider_3.pack()
        crossover_slider_group = tk.Frame(self)
        self.horizontal_slider_4 = tk.Scale(crossover_slider_group, length=500, from_=0.0, to=1.0, resolution=-1,
                                            orient=tk.HORIZONTAL, label="Crossover Rate")
        self.horizontal_slider_4.set(CROSSOVER_RATE)
        self.horizontal_slider_4.pack(side=tk.LEFT)
        self.horizontal_slider_5 = tk.Scale(self, length=1000, from_=0, to=1, resolution=-1, orient=tk.HORIZONTAL,
                                            label="Mutation Rate")
        self.horizontal_slider_5.set(MUTATION_RATE)
        self.horizontal_slider_5.pack()
        self.horizontal_slider_7 = tk.Scale(crossover_slider_group, length=500, from_=1, to=100, orient=tk.HORIZONTAL,
                                            label="Points of Crossover")
        self.horizontal_slider_7.set(POINTS_OF_CROSSOVER)
        self.horizontal_slider_7.pack(side=tk.LEFT)
        crossover_slider_group.pack(anchor=tk.W)
        self.horizontal_slider_8 = tk.Scale(self, length=1000, from_=0, to=300, orient=tk.HORIZONTAL,
                                            label="Zero-threshold")
        self.horizontal_slider_8.set(ZERO_THRESHOLD)
        self.horizontal_slider_8.pack()
        self.horizontal_slider_9 = tk.Scale(self, length=1000, from_=1, to=50, orient=tk.HORIZONTAL,
                                            label="Symbol Set Size")
        self.horizontal_slider_9.set(SYMBOL_SET_SIZE)
        self.horizontal_slider_9.pack(anchor=tk.W)
        tournament_slider_group = tk.Frame(self)
        self.horizontal_slider_11 = tk.Scale(tournament_slider_group, length=500, from_=3, to=500, orient=tk.HORIZONTAL,
                                            label="Tournament Size")
        self.horizontal_slider_11.set(TOURNAMENT_SIZE)
        self.horizontal_slider_11.pack(side=tk.LEFT)
        self.horizontal_slider_12 = tk.Scale(tournament_slider_group, length=500, from_=0, to=1, resolution=-1, orient=tk.HORIZONTAL,
                                             label="Tournament Slip-through Probability")
        self.horizontal_slider_12.set(TOURNAMENT_SLIP_THROUGH_PROBABILITY)
        self.horizontal_slider_12.pack(side=tk.LEFT)
        tournament_slider_group.pack(anchor=tk.W)
        self.horizontal_slider_13 = tk.Scale(self, length=1000, from_=1, to=1000, orient=tk.HORIZONTAL,
                                             label="Initial Temperature")
        self.horizontal_slider_13.set(INITIAL_TEMPERATURE)
        self.horizontal_slider_13.pack()
        self.horizontal_slider_14 = tk.Scale(self, length=1000, from_=1, to=10000, orient=tk.HORIZONTAL,
                                             label="Max Number of Generations")
        self.horizontal_slider_14.set(MAX_GENERATIONS)
        self.horizontal_slider_14.pack()

        self.mutation_protocol = tk.IntVar()
        self.mutation_protocol.set(MUTATION_PROTOCOL)
        radiogroup0 = tk.Frame(self)
        tk.Label(radiogroup0, text="Mutation Protocol").pack(anchor=tk.W)
        tk.Radiobutton(radiogroup0, text="Individual", variable=self.mutation_protocol, value=1).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup0, text="Component", variable=self.mutation_protocol, value=2).pack(side=tk.LEFT)
        radiogroup0.pack(anchor=tk.W)

        self.adult_selection_protocol = tk.IntVar()
        self.adult_selection_protocol.set(ADULT_SELECTION_PROTOCOL)
        radiogroup1 = tk.Frame(self)
        tk.Label(radiogroup1, text="Adult Selection Protocol").pack(anchor=tk.W)
        tk.Radiobutton(radiogroup1, text="Full", variable=self.adult_selection_protocol,
                       command=self.control_pool_size_adult, value=1).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup1, text="Over Production", variable=self.adult_selection_protocol,
                       command=self.control_pool_size_adult, value=2).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup1, text="Mixing", variable=self.adult_selection_protocol, value=3).pack(side=tk.LEFT)
        radiogroup1.pack(anchor=tk.W)

        self.parent_selection_protocol = tk.IntVar()
        self.parent_selection_protocol.set(PARENT_SELECTION_PROTOCOL)
        radiogroup2 = tk.Frame(self)
        tk.Label(radiogroup2, text="Parent Selection Protocol").pack(anchor=tk.W)
        tk.Radiobutton(radiogroup2, text="Fitness Proportionate", variable=self.parent_selection_protocol,
                       value=1).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup2, text="Sigma-scaling", variable=self.parent_selection_protocol,
                       value=2).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup2, text="Tournament selection", variable=self.parent_selection_protocol,
                       value=3).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup2, text="Boltzmann Selection", variable=self.parent_selection_protocol,
                       value=4).pack(side=tk.LEFT)
        radiogroup2.pack(anchor=tk.W)

        self.problem_type = tk.IntVar()
        self.problem_type.set(PROBLEM)
        radiogroup3 = tk.Frame(self)
        tk.Label(radiogroup3, text="Problem type").pack(anchor=tk.W)
        tk.Radiobutton(radiogroup3, text="One Max", variable=self.problem_type, value=1).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup3, text="LOLZ Prefix", variable=self.problem_type, value=2).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup3, text="Surprising Sequence Local", variable=self.problem_type,
                       value=3).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup3, text="Surprising Sequence Global", variable=self.problem_type,
                       value=4).pack(side=tk.LEFT)
        radiogroup3.pack(anchor=tk.W)

        start_button = tk.Button(self, text="Start", width=20, command=self.start_simulation)
        start_button.pack()

    def control_pool_size_genotype(self, event):
        if self.adult_selection_protocol.get() == 1:
            self.horizontal_slider_2.set(self.horizontal_slider_1.get())
        elif self.adult_selection_protocol.get() == 2:
            self.horizontal_slider_2.set(min(self.horizontal_slider_2.get(), self.horizontal_slider_1.get() - 2))

    def control_pool_size_adult(self, event=None):
        if self.adult_selection_protocol.get() == 1:
            self.horizontal_slider_1.set(self.horizontal_slider_2.get())
        elif self.adult_selection_protocol.get() == 2:
            self.horizontal_slider_1.set(max(self.horizontal_slider_1.get(), self.horizontal_slider_2.get() - 6))
        if self.parent_selection_protocol.get() == 3:
            self.horizontal_slider_11.set(min(self.horizontal_slider_11.get(), self.horizontal_slider_2.get() // 2))

    def start_simulation(self):
        self.current_run = 0
        self.fitness_log_average = []
        self.fitness_log_best = []
        self.standard_deviation_log = []
        self.start_ea()

    def start_ea(self):
        self.ea = EvolutionaryAlgorithm(genotype_pool_size=self.horizontal_slider_1.get(),
                                        adult_pool_size=self.horizontal_slider_2.get(),
                                        genotype_length=self.horizontal_slider_3.get(),
                                        phenotype_length=self.horizontal_slider_3.get(),  # Not a single slider
                                        adult_selection_protocol=self.adult_selection_protocol.get(),
                                        parent_selection_protocol=self.parent_selection_protocol.get(),
                                        crossover_rate=self.horizontal_slider_4.get(),
                                        mutation_rate=self.horizontal_slider_5.get(),
                                        mutation_protocol=self.mutation_protocol.get(),
                                        points_of_crossover=self.horizontal_slider_7.get(),
                                        zero_threshold=self.horizontal_slider_8.get(),
                                        symbol_set_size=self.horizontal_slider_9.get(),
                                        tournament_size=self.horizontal_slider_11.get(),
                                        tournament_slip_through_probability=self.horizontal_slider_12.get(),
                                        initial_temperature=self.horizontal_slider_13.get(),
                                        problem=self.problem_type.get(),
                                        generations=self.horizontal_slider_14.get())
        self.current_generation = 0
        self.fitness_log_average.append([])
        self.fitness_log_best.append([])
        self.standard_deviation_log.append([])
        self.run_ea()

    def run_ea(self):
        self.ea.run_one_life_cycle()
        self.write_to_log()
        self.current_generation += 1
        if self.current_generation < self.horizontal_slider_14.get() and \
                self.ea.phenotype_adult_pool[0].fitness_value < 1.0:
            self.after(self.delay, lambda: self.run_ea())
        else:
            print "End"
            self.current_run += 1
            if self.current_run < self.nr_of_runs:
                self.start_ea()
            else:
                print "Average Generations:", sum([len(l) for l in self.fitness_log_average])/len(self.fitness_log_average)
                self.plot_data()

    def write_to_log(self):
        print "Gen:", "%.2d" % self.current_generation, "\tBest fitness:", \
            "%.3f" % round(self.ea.phenotype_adult_pool[0].fitness_value, 3), "\tAverage fitness:", \
            "%.3f" % round(self.ea.avg_fitness, 3), "\tStandard deviation: ", \
            "%.5f" % round(self.ea.standard_deviation, 3), "\tBest Phenotype:", \
            self.ea.phenotype_adult_pool[0].components
        if self.problem_type.get() > 2:
            print "Violations: ", self.ea.phenotype_adult_pool[0].violations
        self.fitness_log_average[self.current_run].append(self.ea.avg_fitness)
        self.fitness_log_best[self.current_run].append(self.ea.phenotype_adult_pool[0].fitness_value)
        self.standard_deviation_log[self.current_run].append(self.ea.standard_deviation)

    def plot_data(self):
        plt.figure(1)
        plt.subplot(311)
        plt.plot(self.fitness_log_average[-1], label="Average fitness")
        plt.plot(self.fitness_log_best[-1], label="Best fitness")
        #plt.legend(['y = Average fitness in adult pool', 'y = Best fitness in adult pool'], loc='lower right')
        plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3, ncol=2, mode="expand", borderaxespad=0.)


        plt.subplot(312)
        plt.plot(self.fitness_log_best[-1])
        plt.legend(['y = Best fitness in adult pool'], loc='lower right')

        plt.subplot(313)
        plt.plot(self.standard_deviation_log[-1])
        plt.legend(['y = Standard deviation'], loc='upper right')
        plt.show()
Exemplo n.º 3
0
class Gui(tk.Tk):
    def __init__(self, delay, nr_of_runs=1, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.delay = delay
        self.nr_of_runs = nr_of_runs
        self.current_run = 0
        self.current_generation = 0
        self.fitness_log_average = []
        self.fitness_log_best = []
        self.standard_deviation_log = []
        self.ea = None
        self.build_parameter_menu()

    def build_parameter_menu(self):
        self.horizontal_slider_1 = tk.Scale(
            self,
            length=1000,
            from_=2,
            to=1000,
            orient=tk.HORIZONTAL,
            label="Genotype Pool Size",
            resolution=2,
            command=self.control_pool_size_genotype)
        self.horizontal_slider_1.set(GENOTYPE_POOL_SIZE)
        self.horizontal_slider_1.pack()
        self.horizontal_slider_2 = tk.Scale(
            self,
            length=1000,
            from_=2,
            to=1000,
            orient=tk.HORIZONTAL,
            label="Adult Pool Size",
            resolution=2,
            command=self.control_pool_size_adult)
        self.horizontal_slider_2.set(ADULT_POOL_SIZE)
        self.horizontal_slider_2.pack()
        self.horizontal_slider_3 = tk.Scale(self,
                                            length=1000,
                                            from_=2,
                                            to=1000,
                                            orient=tk.HORIZONTAL,
                                            label="Genotype Length")
        self.horizontal_slider_3.set(GENOTYPE_LENGTH)
        self.horizontal_slider_3.pack()
        crossover_slider_group = tk.Frame(self)
        self.horizontal_slider_4 = tk.Scale(crossover_slider_group,
                                            length=500,
                                            from_=0.0,
                                            to=1.0,
                                            resolution=-1,
                                            orient=tk.HORIZONTAL,
                                            label="Crossover Rate")
        self.horizontal_slider_4.set(CROSSOVER_RATE)
        self.horizontal_slider_4.pack(side=tk.LEFT)
        self.horizontal_slider_5 = tk.Scale(self,
                                            length=1000,
                                            from_=0,
                                            to=1,
                                            resolution=-1,
                                            orient=tk.HORIZONTAL,
                                            label="Mutation Rate")
        self.horizontal_slider_5.set(MUTATION_RATE)
        self.horizontal_slider_5.pack()
        self.horizontal_slider_7 = tk.Scale(crossover_slider_group,
                                            length=500,
                                            from_=1,
                                            to=100,
                                            orient=tk.HORIZONTAL,
                                            label="Points of Crossover")
        self.horizontal_slider_7.set(POINTS_OF_CROSSOVER)
        self.horizontal_slider_7.pack(side=tk.LEFT)
        crossover_slider_group.pack(anchor=tk.W)
        self.horizontal_slider_8 = tk.Scale(self,
                                            length=1000,
                                            from_=0,
                                            to=300,
                                            orient=tk.HORIZONTAL,
                                            label="Zero-threshold")
        self.horizontal_slider_8.set(ZERO_THRESHOLD)
        self.horizontal_slider_8.pack()
        self.horizontal_slider_9 = tk.Scale(self,
                                            length=1000,
                                            from_=1,
                                            to=50,
                                            orient=tk.HORIZONTAL,
                                            label="Symbol Set Size")
        self.horizontal_slider_9.set(SYMBOL_SET_SIZE)
        self.horizontal_slider_9.pack(anchor=tk.W)
        tournament_slider_group = tk.Frame(self)
        self.horizontal_slider_11 = tk.Scale(tournament_slider_group,
                                             length=500,
                                             from_=3,
                                             to=500,
                                             orient=tk.HORIZONTAL,
                                             label="Tournament Size")
        self.horizontal_slider_11.set(TOURNAMENT_SIZE)
        self.horizontal_slider_11.pack(side=tk.LEFT)
        self.horizontal_slider_12 = tk.Scale(
            tournament_slider_group,
            length=500,
            from_=0,
            to=1,
            resolution=-1,
            orient=tk.HORIZONTAL,
            label="Tournament Slip-through Probability")
        self.horizontal_slider_12.set(TOURNAMENT_SLIP_THROUGH_PROBABILITY)
        self.horizontal_slider_12.pack(side=tk.LEFT)
        tournament_slider_group.pack(anchor=tk.W)
        self.horizontal_slider_13 = tk.Scale(self,
                                             length=1000,
                                             from_=1,
                                             to=1000,
                                             orient=tk.HORIZONTAL,
                                             label="Initial Temperature")
        self.horizontal_slider_13.set(INITIAL_TEMPERATURE)
        self.horizontal_slider_13.pack()
        self.horizontal_slider_14 = tk.Scale(self,
                                             length=1000,
                                             from_=1,
                                             to=10000,
                                             orient=tk.HORIZONTAL,
                                             label="Max Number of Generations")
        self.horizontal_slider_14.set(MAX_GENERATIONS)
        self.horizontal_slider_14.pack()

        self.mutation_protocol = tk.IntVar()
        self.mutation_protocol.set(MUTATION_PROTOCOL)
        radiogroup0 = tk.Frame(self)
        tk.Label(radiogroup0, text="Mutation Protocol").pack(anchor=tk.W)
        tk.Radiobutton(radiogroup0,
                       text="Individual",
                       variable=self.mutation_protocol,
                       value=1).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup0,
                       text="Component",
                       variable=self.mutation_protocol,
                       value=2).pack(side=tk.LEFT)
        radiogroup0.pack(anchor=tk.W)

        self.adult_selection_protocol = tk.IntVar()
        self.adult_selection_protocol.set(ADULT_SELECTION_PROTOCOL)
        radiogroup1 = tk.Frame(self)
        tk.Label(radiogroup1,
                 text="Adult Selection Protocol").pack(anchor=tk.W)
        tk.Radiobutton(radiogroup1,
                       text="Full",
                       variable=self.adult_selection_protocol,
                       command=self.control_pool_size_adult,
                       value=1).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup1,
                       text="Over Production",
                       variable=self.adult_selection_protocol,
                       command=self.control_pool_size_adult,
                       value=2).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup1,
                       text="Mixing",
                       variable=self.adult_selection_protocol,
                       value=3).pack(side=tk.LEFT)
        radiogroup1.pack(anchor=tk.W)

        self.parent_selection_protocol = tk.IntVar()
        self.parent_selection_protocol.set(PARENT_SELECTION_PROTOCOL)
        radiogroup2 = tk.Frame(self)
        tk.Label(radiogroup2,
                 text="Parent Selection Protocol").pack(anchor=tk.W)
        tk.Radiobutton(radiogroup2,
                       text="Fitness Proportionate",
                       variable=self.parent_selection_protocol,
                       value=1).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup2,
                       text="Sigma-scaling",
                       variable=self.parent_selection_protocol,
                       value=2).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup2,
                       text="Tournament selection",
                       variable=self.parent_selection_protocol,
                       value=3).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup2,
                       text="Boltzmann Selection",
                       variable=self.parent_selection_protocol,
                       value=4).pack(side=tk.LEFT)
        radiogroup2.pack(anchor=tk.W)

        self.problem_type = tk.IntVar()
        self.problem_type.set(PROBLEM)
        radiogroup3 = tk.Frame(self)
        tk.Label(radiogroup3, text="Problem type").pack(anchor=tk.W)
        tk.Radiobutton(radiogroup3,
                       text="One Max",
                       variable=self.problem_type,
                       value=1).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup3,
                       text="LOLZ Prefix",
                       variable=self.problem_type,
                       value=2).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup3,
                       text="Surprising Sequence Local",
                       variable=self.problem_type,
                       value=3).pack(side=tk.LEFT)
        tk.Radiobutton(radiogroup3,
                       text="Surprising Sequence Global",
                       variable=self.problem_type,
                       value=4).pack(side=tk.LEFT)
        radiogroup3.pack(anchor=tk.W)

        start_button = tk.Button(self,
                                 text="Start",
                                 width=20,
                                 command=self.start_simulation)
        start_button.pack()

    def control_pool_size_genotype(self, event):
        if self.adult_selection_protocol.get() == 1:
            self.horizontal_slider_2.set(self.horizontal_slider_1.get())
        elif self.adult_selection_protocol.get() == 2:
            self.horizontal_slider_2.set(
                min(self.horizontal_slider_2.get(),
                    self.horizontal_slider_1.get() - 2))

    def control_pool_size_adult(self, event=None):
        if self.adult_selection_protocol.get() == 1:
            self.horizontal_slider_1.set(self.horizontal_slider_2.get())
        elif self.adult_selection_protocol.get() == 2:
            self.horizontal_slider_1.set(
                max(self.horizontal_slider_1.get(),
                    self.horizontal_slider_2.get() - 6))
        if self.parent_selection_protocol.get() == 3:
            self.horizontal_slider_11.set(
                min(self.horizontal_slider_11.get(),
                    self.horizontal_slider_2.get() // 2))

    def start_simulation(self):
        self.current_run = 0
        self.fitness_log_average = []
        self.fitness_log_best = []
        self.standard_deviation_log = []
        self.start_ea()

    def start_ea(self):
        self.ea = EvolutionaryAlgorithm(
            genotype_pool_size=self.horizontal_slider_1.get(),
            adult_pool_size=self.horizontal_slider_2.get(),
            genotype_length=self.horizontal_slider_3.get(),
            phenotype_length=self.horizontal_slider_3.get(
            ),  # Not a single slider
            adult_selection_protocol=self.adult_selection_protocol.get(),
            parent_selection_protocol=self.parent_selection_protocol.get(),
            crossover_rate=self.horizontal_slider_4.get(),
            mutation_rate=self.horizontal_slider_5.get(),
            mutation_protocol=self.mutation_protocol.get(),
            points_of_crossover=self.horizontal_slider_7.get(),
            zero_threshold=self.horizontal_slider_8.get(),
            symbol_set_size=self.horizontal_slider_9.get(),
            tournament_size=self.horizontal_slider_11.get(),
            tournament_slip_through_probability=self.horizontal_slider_12.get(
            ),
            initial_temperature=self.horizontal_slider_13.get(),
            problem=self.problem_type.get(),
            generations=self.horizontal_slider_14.get())
        self.current_generation = 0
        self.fitness_log_average.append([])
        self.fitness_log_best.append([])
        self.standard_deviation_log.append([])
        self.run_ea()

    def run_ea(self):
        self.ea.run_one_life_cycle()
        self.write_to_log()
        self.current_generation += 1
        if self.current_generation < self.horizontal_slider_14.get() and \
                self.ea.phenotype_adult_pool[0].fitness_value < 1.0:
            self.after(self.delay, lambda: self.run_ea())
        else:
            print "End"
            self.current_run += 1
            if self.current_run < self.nr_of_runs:
                self.start_ea()
            else:
                print "Average Generations:", sum([
                    len(l) for l in self.fitness_log_average
                ]) / len(self.fitness_log_average)
                self.plot_data()

    def write_to_log(self):
        print "Gen:", "%.2d" % self.current_generation, "\tBest fitness:", \
            "%.3f" % round(self.ea.phenotype_adult_pool[0].fitness_value, 3), "\tAverage fitness:", \
            "%.3f" % round(self.ea.avg_fitness, 3), "\tStandard deviation: ", \
            "%.5f" % round(self.ea.standard_deviation, 3), "\tBest Phenotype:", \
            self.ea.phenotype_adult_pool[0].components
        if self.problem_type.get() > 2:
            print "Violations: ", self.ea.phenotype_adult_pool[0].violations
        self.fitness_log_average[self.current_run].append(self.ea.avg_fitness)
        self.fitness_log_best[self.current_run].append(
            self.ea.phenotype_adult_pool[0].fitness_value)
        self.standard_deviation_log[self.current_run].append(
            self.ea.standard_deviation)

    def plot_data(self):
        plt.figure(1)
        plt.subplot(311)
        plt.plot(self.fitness_log_average[-1], label="Average fitness")
        plt.plot(self.fitness_log_best[-1], label="Best fitness")
        #plt.legend(['y = Average fitness in adult pool', 'y = Best fitness in adult pool'], loc='lower right')
        plt.legend(bbox_to_anchor=(0., 1.02, 1., .102),
                   loc=3,
                   ncol=2,
                   mode="expand",
                   borderaxespad=0.)

        plt.subplot(312)
        plt.plot(self.fitness_log_best[-1])
        plt.legend(['y = Best fitness in adult pool'], loc='lower right')

        plt.subplot(313)
        plt.plot(self.standard_deviation_log[-1])
        plt.legend(['y = Standard deviation'], loc='upper right')
        plt.show()