def Initialize(self, max_gen, env):
     # logging.info("------Initialize begin------")
     for i in range(self.pop_size):
         rat = Rat(env)
         rat.Initialize(self.env.depot_num, self.env.factory_num, self.env.agent_num, self.env)
         self.rat_list.append(rat)
     self.best_in_history = self.rat_list[0].Copy()
     self.best_in_history.Fitness_calculation()
    def __init__(self, env, pop_size, max_gen, cross_rate, mutate_rate, T_max, T_min, SA_rate):
        self.env = env
        self.pop_size = pop_size
        self.max_gen = max_gen
        self.cross_rate = cross_rate
        self.mutate_rate = mutate_rate
        self.T_max = T_max
        self.T_min = T_min
        self.SA_rate = SA_rate

        self.rat_list = []
        self.rat_best = Rat(self.env)
        self.best_cost_list = []
        self.best_in_history = Rat(self.env)
示例#3
0
def handle_fight(player, rat_damage_points, rat_life_points):
    """
    Handle a fight between the player and the rat
    :param player: The player object for the player
    :param rat_damage_points: The damage points to give to the rat
    :param rat_life_points: The life points to give to the rat
    :return: None
    """

    # Create the rat object
    rat = Rat()

    # Set the life and damage points for the rat
    rat.set_damage_points(rat_damage_points)
    rat.set_life_points(rat_life_points)

    # Loop until the player or the rat is dead
    while player.check_player() and rat.check_rat():

        # Get the damage the player inflicts onto the rat
        players_damage = player.inflict_damage(rat.life_points)
        rat.remove_life_points(players_damage)
        if players_damage:
            print "You hit the rat and caused " + str(players_damage) + " damage to it!"
        else:
            print "You failed to hit any damage on the rat"
        sleep(.15)

        # Get the damage the rat inflicts onto the player
        rats_damage = rat.inflict_damage(player.life_points)
        player.remove_life_points(rats_damage)

        if rats_damage > 0:
            print "OUCH! The rat hits a " + str(rats_damage) + " on you!"
        else:
            print "Lucky you! The rat didn't hit any damage!"
        sleep(.15)

    if not rat.check_rat():             # The rat died
        print "\nYou defeated the rat! You have " + str(player.life_points) + " life points left."
    elif not player.check_player():     # The rat defeated the player
        print "\nThe rat defeated you!"
        handle_game_over(False)
    else:                               # Do this if neither of the above happened
        print "You shouldn't ever see this..."
class GASA:
    """Gene Arithmetic"""

    def __init__(self, env, pop_size, max_gen, cross_rate, mutate_rate, T_max, T_min, SA_rate):
        self.env = env
        self.pop_size = pop_size
        self.max_gen = max_gen
        self.cross_rate = cross_rate
        self.mutate_rate = mutate_rate
        self.T_max = T_max
        self.T_min = T_min
        self.SA_rate = SA_rate

        self.rat_list = []
        self.rat_best = Rat(self.env)
        self.best_cost_list = []
        self.best_in_history = Rat(self.env)

    def Run(self):
        """execute function"""
        random.seed()
        self.Initialize(self.max_gen, self.env)
        for i in trange(self.max_gen):
            time.sleep(0.01)
            # logging.info("\n------This is the %d generation------" % i)
            random.shuffle(self.rat_list)
            self.Crossover_and_Mutation()
            # self.Select()
            self.Elite_select()
            self.rat_best.BestRatDisplay_log()

    def Display(self):
        """display function"""
        print("POP SIZE: %d" % (len(self.rat_list)))
        print("---Best Rat---")
        self.best_in_history.Display()
        self.best_in_history.Display_log()


        # Pyplot制图
        plt.figure(("遗传算法收敛图"))
        x1 = np.arange(1, self.max_gen+1)
        y1 = self.best_cost_list
        plt.title("GA Best Fitness Curve")
        plt.plot(x1, y1)

        plt.figure("路径图")
        colorlist= ["blue", "green", "yellow", "purple", "black"]
        depot_colorlist = ["navy","brown","deeppink"]
        markers = ["D", "x", "h", ".", "^", ">", "v"]
        for i in range(len(self.env.depot_list)):
            print("%s\t%s" % (self.env.depot_list[i].position.x, self.env.depot_list[i].position.y))
            plt.scatter(self.env.depot_list[i].position.x, self.env.depot_list[i].position.y, color=depot_colorlist[i], s=200, label="Depot" +str(i))
        x_list = []
        y_list = []
        label_list = []
        for chrome in self.rat_best.chrome_list:
            label_list.append(chrome.agent_number)
            n_list_x = []
            n_list_y = []
            n_list_x.append(self.env.agent_list[chrome.agent_number].start_depot.position.x)
            n_list_y.append(self.env.agent_list[chrome.agent_number].start_depot.position.y)
            for pos in chrome.meet_position:
                n_list_x.append(pos.x)
                n_list_y.append(pos.y)
            x_list.append(n_list_x)
            y_list.append(n_list_y)
        for i in range(len(label_list)):
            for j in range(len(x_list[i])):
                # print(str(x_list[i][j]) + "\t" +str(y_list[i][j]) + "\t" + str(x_list[i][j+1]) + "\t" + str(y_list[i][j+1]))
                plt.arrow(x_list[i][j], y_list[i][j], x_list[i][j+1]-x_list[i][j], y_list[i][j+1]-y_list[i][j],head_width=3, lw=2, color=colorlist[i])
                plt.text(x_list[i][j], y_list[i][j], s=j, fontsize=8, color='red')  # ⽂本
                if j == len(x_list[i])-2:
                    # plt.text(x_list[i][j], y_list[i][j], s=j, fontsize=8, color='red')  # ⽂本
                    break
        plt.legend()

        plt.show()

    def Initialize(self, max_gen, env):
        # logging.info("------Initialize begin------")
        for i in range(self.pop_size):
            rat = Rat(env)
            rat.Initialize(self.env.depot_num, self.env.factory_num, self.env.agent_num, self.env)
            self.rat_list.append(rat)
        self.best_in_history = self.rat_list[0].Copy()
        self.best_in_history.Fitness_calculation()

    def Crossover_and_Mutation(self):
        logging.debug("------Crossover and Mutate begin------")
        rat_num = len(self.rat_list)
        T = self.T_max
        while T >= self.T_min:
            logging.debug("Temperature MAX\t now %f" % T)
            # crossover
            for i in range(rat_num-1):
                j = i + 1
                if random.random() < self.cross_rate:
                    logging.debug("Total Rat is %d\tRatA index %d\tRatB index %d" % (len(self.rat_list), i, j))
                    self.Crossover(self.rat_list[i], self.rat_list[j], T, i, j)
            # mutate
            for i in range(rat_num):
                if random.random() < self.mutate_rate:
                    logging.debug("Mutate Index:%d" % i)
                    self.Mutate(self.rat_list[i], T, i)
            T *= self.SA_rate
            logging.debug("Now Temperature is %f" % T)
        logging.debug("Temperature < T_min, SA END")

    def Crossover(self, rat_A, rat_B, T, index_a, index_b):
        """对A,B个体进行操作,注意要改变个体本身,不产生新个体"""
        logging.debug("---Crossover Begin---(%s, %s)" % (rat_A.name, rat_B.name))
        chrome_number = random.choice(range(self.env.agent_num))
        n_rat_A = rat_A.Copy()
        n_rat_B = rat_B.Copy()
        a = n_rat_A.chrome_list[chrome_number]
        b = n_rat_B.chrome_list[chrome_number]
        a.Display_log()
        b.Display_log()
        if len(a.gene_list) == 0 and len(b.gene_list) == 0:
            logging.debug("No gene exist in these chromes, RETRY!")
            return
        F_ab = [x for x in a.gene_list if x in b.gene_list]
        F_a = [y for y in a.gene_list if y not in F_ab]
        F_b = [z for z in b.gene_list if z not in F_ab]
        logging.debug("F_ab:" + str(F_ab) + "\tF_a:" + str(F_a) + "\tF_b:" + str(F_b))

        logging.debug("Before Duplicate, rat num is: %d, following is RatA, RatB" % len(self.rat_list))
        rat_A.Display_log()
        rat_B.Display_log()

        logging.debug("After Duplicate, rat num is: %d" % len(self.rat_list))

        logging.debug("---Before Switch--- (A,B)")
        n_rat_A.chrome_list[chrome_number].Display_log()
        n_rat_B.chrome_list[chrome_number].Display_log()
        tmp = a.Copy()
        n_rat_A.chrome_list[chrome_number] = n_rat_B.chrome_list[chrome_number].Copy()
        n_rat_B.chrome_list[chrome_number] = tmp
        logging.debug("---After Switch--- (A,B)")
        n_rat_A.chrome_list[chrome_number].Display_log()
        n_rat_B.chrome_list[chrome_number].Display_log()

        n_rat_A.Delete_redundant_element(F_b, chrome_number)
        n_rat_B.Delete_redundant_element(F_a, chrome_number)

        n_rat_A.Insert_element(F_a)
        n_rat_B.Insert_element(F_b)

        logging.debug("RatA, RatB, newRatA, newRatB")
        rat_A.Display_log()
        rat_B.Display_log()
        n_rat_A.Display_log()
        n_rat_B.Display_log()

        self.rat_list[index_a] = self.SA_deal(rat_A, n_rat_A, T)
        self.rat_list[index_b] = self.SA_deal(rat_B, n_rat_B, T)

    def Mutate(self, rat, T, index):
        logging.debug("------RAT Mutate Begin------(%s)" % rat.name)
        n_rat = rat.Copy()
        n_rat.Mutate(self.mutate_rate)
        self.rat_list[index] = self.SA_deal(rat, n_rat, T)

    def Select(self):
        if len(self.rat_list) == 0:
            logging.error("No rat survive!")
            exit()
        for rat in self.rat_list:
            rat.Fitness_calculation()
        pop_fitness_max = self.rat_list[0].fitness
        pop_fitness_min = self.rat_list[0].fitness
        for rat in self.rat_list:
            if rat.fitness > pop_fitness_max:
                pop_fitness_max = rat.fitness
                break
            if rat.fitness < pop_fitness_min:
                pop_fitness_min = rat.fitness
                break

        relative_fitness_sum = 0
        for rat in self.rat_list:
            tmp = rat.Relative_fitness_calculation(pop_fitness_max, pop_fitness_min, self.env.avg_cost)
            relative_fitness_sum += tmp

        prob_sum = 0
        for rat in self.rat_list:
            prob_sum += rat.relative_fitness
            rat.accumulation_probability = prob_sum / relative_fitness_sum

        n_rat_list = []
        for i in range(self.pop_size):
            select_prob = random.random()
            logging.debug("select_prob is %f" % select_prob)
            for j in range(len(self.rat_list)):
                if self.rat_list[j-1].accumulation_probability < select_prob <= self.rat_list[j].accumulation_probability:
                    logging.debug("The %d Rat is selected. It's accumulation_probability is %f, Former one is %f" % (
                        j, self.rat_list[j].accumulation_probability, self.rat_list[j-1].accumulation_probability))
                    n_rat_list.append(self.rat_list[j])
                    logging.debug("New Rat List has %d members." % len(n_rat_list))
                    break
        self.rat_list = n_rat_list

    def Elite_select(self):
        best_index = 0
        worst_index = 0
        logging.debug("Before Elite select, Survive Rat Num: %d" % len(self.rat_list))
        pop_fitness_min = self.rat_list[0].fitness
        pop_fitness_max = self.rat_list[0].fitness
        for i in range(len(self.rat_list)):
            if self.rat_list[i].fitness < pop_fitness_min:
                pop_fitness_min = self.rat_list[i].fitness
                best_index = i
                break
            if self.rat_list[i].fitness > pop_fitness_max:
                pop_fitness_max = self.rat_list[i].fitness
                worst_index = i
                break
        logging.debug("The best index %d\tCost is: %f\nThe worst index %d\tCost is: %f" % (\
            best_index, self.rat_list[best_index].fitness, worst_index, self.rat_list[worst_index].fitness))
        logging.debug("Before replace, rat num is %d" % len(self.rat_list))
        self.rat_best = self.rat_list[best_index].Copy()
        del self.rat_list[worst_index]
        logging.debug("After Delete, rat num is %d" % len(self.rat_list))
        self.rat_list.append(self.rat_best)
        self.best_cost_list.append(self.rat_best.fitness)
        logging.debug("After replace, rat num is %d" % len(self.rat_list))
        if self.rat_best.fitness < self.best_in_history.fitness:
            self.best_in_history = self.rat_best.Copy()
            logging.debug("Better RAT appear!")
            self.best_in_history.Display_log

    def SA_deal(self, parent_rat, son_rat, T):
        logging.debug("SA_deal. Parent: %s\t Son: %s" % (parent_rat.name, son_rat.name))
        parent_rat.Fitness_calculation()
        son_rat.Fitness_calculation()
        delta = parent_rat.fitness - son_rat.fitness
        logging.debug("Delta: %s\tParent: %s\tSon: %s" % (delta,parent_rat.fitness,son_rat.fitness))
        if delta > 0:
            logging.debug("Delta > 0, Replace!")
            del parent_rat
            return son_rat
        else:
            logging.debug("Delta < 0, Prob!")
            prob = np.exp(delta / T)
            if prob > random.random():
                logging.debug("Prob YES, Replace!")
                del parent_rat
                return son_rat
            else:
                logging.debug("Prob NO, Reserve!")
                del son_rat
                return parent_rat
示例#5
0
def handle_fight(player, rat_damage_points, rat_life_points):
    """
    Handle a fight between the player and the rat
    :param player: The player object for the player
    :param rat_damage_points: The damage points to give to the rat
    :param rat_life_points: The life points to give to the rat
    :return: None
    """

    # Create the rat object
    rat = Rat()

    # Set the life and damage points for the rat
    rat.set_damage_points(rat_damage_points)
    rat.set_life_points(rat_life_points)

    # Loop until the player or the rat is dead
    while player.check_player() and rat.check_rat():

        # Get the damage the player inflicts onto the rat
        players_damage = player.inflict_damage(rat.life_points)
        rat.remove_life_points(players_damage)
        if players_damage:
            print "You hit the rat and caused " + str(
                players_damage) + " damage to it!"
        else:
            print "You failed to hit any damage on the rat"
        sleep(.15)

        # Get the damage the rat inflicts onto the player
        rats_damage = rat.inflict_damage(player.life_points)
        player.remove_life_points(rats_damage)

        if rats_damage > 0:
            print "OUCH! The rat hits a " + str(rats_damage) + " on you!"
        else:
            print "Lucky you! The rat didn't hit any damage!"
        sleep(.15)

    if not rat.check_rat():  # The rat died
        print "\nYou defeated the rat! You have " + str(
            player.life_points) + " life points left."
    elif not player.check_player():  # The rat defeated the player
        print "\nThe rat defeated you!"
        handle_game_over(False)
    else:  # Do this if neither of the above happened
        print "You shouldn't ever see this..."
示例#6
0
#!/usr/bin/env python
#-*- coding: utf-8 -*-

import numpy as np
import time
import os

## Serial port simulation ##
from Rat import Rat

ports = {'P1': 'COM11', 'P2': 'COM22'}

# Register rats; ids should match whatever ID comes out of the RFID reader
rat1 = Rat('Steve', '001')
rat2 = Rat('Julia', '002')
rat3 = Rat('Mario', '003')

rats = [rat1, rat2, rat3]

for a in range(10):
    rid = np.random.randint(len(rats))
    pid = np.random.randint(len(ports))
    cmd = 'echo %s > %s' % (rats[rid].rfid, ports[ports.keys()[pid]])
    print cmd
    os.system(cmd)
    time.sleep(2 * np.random.rand())