class SenseHubSiteSwarmEnvironmentModel(Model):
    """ A environemnt to model swarms """
    def __init__(self, N, width, height, grid=10, seed=None):
        if seed is None:
            super(SenseHubSiteSwarmEnvironmentModel, self).__init__(seed=None)
        else:
            super(SenseHubSiteSwarmEnvironmentModel, self).__init__(seed)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.schedule = SimultaneousActivation(self)

        self.target = Sites(id=1, location=(10, 10), radius=11, q_value=0.5)

        self.grid.add_object_to_grid(self.target.location, self.target)

        self.hub = Hub(id=1, location=(-45, -45), radius=11)

        self.grid.add_object_to_grid(self.hub.location, self.hub)

        for i in range(self.num_agents):
            a = SwarmAgentSenseHubSite(i, self)
            self.schedule.add(a)
            x = 45
            y = 45
            a.location = (x, y)
            a.direction = -2.3561944901923448
            self.grid.add_object_to_grid((x, y), a)

        self.agent = a

    def step(self):
        self.schedule.step()
Exemple #2
0
class GEEnvironmentModel(Model):
    """ A environemnt to model swarms """
    def __init__(self, N, width, height, grid=10, seed=None):
        if seed is None:
            super(GEEnvironmentModel, self).__init__(seed=None)
        else:
            super(GEEnvironmentModel, self).__init__(seed)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.schedule = SimultaneousActivation(self)
        self.agents = []
        for i in range(self.num_agents):
            a = GEBTAgent(i, self)
            self.schedule.add(a)
            # Add the agent to a random grid cell
            x = self.random.randint(-self.grid.width / 2, self.grid.width / 2)
            y = self.random.randint(-self.grid.height / 2, self.grid.height / 2)

            a.location = (x, y)
            self.grid.add_object_to_grid((x, y), a)
            # a.operation_threshold = self.num_agents // 10
            self.agents.append(a)
        # exit()

    def step(self):
        self.schedule.step()
Exemple #3
0
class GEEnvironmentModel(Model):
    """ A environemnt to model swarms """
    def __init__(self, N, width, height, grid=10, seed=None):
        if seed is None:
            super(GEEnvironmentModel, self).__init__(seed=None)
        else:
            super(GEEnvironmentModel, self).__init__(seed)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.schedule = SimultaneousActivation(self)

        self.agents = []

        # Create agents
        for i in range(self.num_agents):
            a = GEBTAgent(i, self)
            self.schedule.add(a)
            x = 0
            y = 0
            a.location = (x, y)
            self.grid.add_object_to_grid((x, y), a)
            a.operation_threshold = 2  # self.num_agents // 10
            self.agents.append(a)

    def step(self):
        self.schedule.step()
class GoToTowardsSwarmEnvironmentModel(Model):
    """ A environemnt to model swarms """
    def __init__(self, N, width, height, grid=10, seed=None):
        if seed is None:
            super(GoToTowardsSwarmEnvironmentModel, self).__init__(seed=None)
        else:
            super(GoToTowardsSwarmEnvironmentModel, self).__init__(seed)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.schedule = SimultaneousActivation(self)

        self.target = Sites(id=1, location=(45, 45), radius=5, q_value=0.5)

        for i in range(self.num_agents):
            a = SwarmAgentGoToTowards(i, self)
            self.schedule.add(a)
            x = 1
            y = 11
            a.location = (x, y)
            a.direction = -2.3561944901923448
            self.grid.add_object_to_grid((x, y), a)

        self.agent = a

    def step(self):
        self.schedule.step()
class RandomWalkSwarmEnvironmentModel(Model):
    """ A environemnt to model swarms """
    def __init__(self, N, width, height, grid=10, seed=None):
        if seed is None:
            super(RandomWalkSwarmEnvironmentModel, self).__init__(seed=None)
        else:
            super(RandomWalkSwarmEnvironmentModel, self).__init__(seed)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.schedule = SimultaneousActivation(self)

        for i in range(self.num_agents):
            a = SwarmAgentRandomWalk(i, self)
            self.schedule.add(a)
            x = 0
            y = 0
            a.location = (x, y)
            a.direction = -2.3561944901923448
            self.grid.add_object_to_grid((x, y), a)

        self.agent = a

    def step(self):
        self.schedule.step()
Exemple #6
0
class WealthEnvironmentModel(Model):
    """ A environemnt to model swarms """
    def __init__(self, N, width, height, grid=10, seed=None):
        if seed is None:
            super(WealthEnvironmentModel, self).__init__(seed=None)
        else:
            super(WealthEnvironmentModel, self).__init__(seed)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.schedule = SimultaneousActivation(self)

        for i in range(self.num_agents):
            a = SwarmAgent(i, self)
            self.schedule.add(a)
            # Add the agent to a random grid cell
            x = self.random.randint(-self.grid.width / 2, self.grid.width / 2)
            y = self.random.randint(-self.grid.height / 2,
                                    self.grid.height / 2)

            a.location = (x, y)
            self.grid.add_object_to_grid((x, y), a)

    def step(self):
        self.schedule.step()
class SingleCarryFoodModel(Model):
    """ A environment to model swarms """
    def __init__(self, N, width, height, grid=10, seed=None):
        if seed is None:
            super(SingleCarryFoodModel, self).__init__(seed=None)
        else:
            super(SingleCarryFoodModel, self).__init__(seed)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.schedule = SimultaneousActivation(self)

        for a in range(5):
            self.thing = Food(id=a, location=(0, 0), radius=16)

            self.grid.add_object_to_grid(self.thing.location, self.thing)

        for i in range(self.num_agents):
            a = SwarmSingleCarryFood(i, self)
            self.schedule.add(a)
            x = 0
            y = 0
            a.location = (x, y)
            a.direction = -2.3561944901923448
            self.grid.add_object_to_grid((x, y), a)

        self.agent = a

    def step(self):
        self.schedule.step()
class MultipleCarryModel(Model):
    """ A environment to model swarms """
    def __init__(self, N, width, height, grid=10, seed=None):
        if seed is None:
            super(MultipleCarryModel, self).__init__(seed=None)
        else:
            super(MultipleCarryModel, self).__init__(seed)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.schedule = SimultaneousActivation(self)

        self.thing = Debris(id=1, location=(0, 0), radius=40)

        self.grid.add_object_to_grid(self.thing.location, self.thing)

        self.agent = []
        for i in range(self.num_agents):
            a = SwarmMultipleCarry(i, self)
            self.schedule.add(a)
            x = 1
            y = 1
            a.location = (x, y)
            a.direction = 1.3561944901923448
            self.grid.add_object_to_grid((x, y), a)
            self.agent.append(a)

    def step(self):
        self.schedule.step()
Exemple #9
0
class NMModel(Model):
    """ A environment to model swarms """
    def __init__(self, N, width, height, grid=10, seed=None):
        if seed is None:
            super(NMModel, self).__init__(seed=None)
        else:
            super(NMModel, self).__init__(seed)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.schedule = SimultaneousActivation(self)

        self.hub = Hub(id=1, location=(0, 0), radius=11)
        self.grid.add_object_to_grid(self.hub.location, self.hub)

        # Create a place for the agents to drop the derbis
        self.obstacles = []
        try:
            for i in range(4):
                dx, dy = self.random.randint(5, 10, 2)
                dx = self.hub.location[0] + 25 + dx
                dy = self.hub.location[1] + 25 + dy
                o = Obstacles(id=i, location=(dx, dy), radius=10)
                self.grid.add_object_to_grid(o.location, o)
                self.obstacles.append(o)
        except AttributeError:
            pass

        self.agent = []
        for i in range(self.num_agents):
            a = NM(i, self)
            self.schedule.add(a)
            x = 19
            y = 10
            a.location = (x, y)
            a.direction = 2.3561944901923448
            self.grid.add_object_to_grid((x, y), a)
            self.agent.append(a)
        self.debris = []
        try:
            for i in range(self.num_agents * 10):
                dx, dy = self.random.randint(10, 20, 2)
                dx = self.hub.location[0] + dx
                dy = self.hub.location[1] + dy
                d = Debris(
                    i, location=(dx, dy),
                    radius=5)
                # print (i, dx, dy)
                d.agent_name = None
                self.grid.add_object_to_grid(d.location, d)
                self.debris.append(d)
        except KeyError:
            pass

    def step(self):
        self.schedule.step()
Exemple #10
0
class SingleCarryDropReturnSwarmEnvironmentModel(Model):
    """A environment to model swarms."""
    def __init__(self, N, width, height, grid=10, seed=None, viewer=False):
        if seed is None:
            super(SingleCarryDropReturnSwarmEnvironmentModel,
                  self).__init__(seed=None)
        else:
            super(SingleCarryDropReturnSwarmEnvironmentModel,
                  self).__init__(seed)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.viewer = viewer

        self.schedule = SimultaneousActivation(self)

        self.hub = Hub(id=2, location=(0, 0), radius=5)
        self.grid.add_object_to_grid(self.hub.location, self.hub)
        self.site = Sites(id=3, location=(-35, -5), radius=5)
        self.grid.add_object_to_grid(self.site.location, self.site)

        self.agents = []
        self.foods = []

        for i in range(self.num_agents):
            f = Food(i, location=(-35, -5), radius=5)
            self.grid.add_object_to_grid(f.location, f)
            self.foods.append(f)

        for i in range(self.num_agents):
            # a = SwarmAgentRandomSingleCarryDropReturn(i, self)
            a = SwarmAgentHandCodedForaging(i, self)
            self.schedule.add(a)
            x = -45
            y = -45
            a.location = (x, y)
            a.direction = -2.3561944901923448
            self.grid.add_object_to_grid((x, y), a)

            self.agents.append(a)

        if self.viewer:
            self.ui = UI((width, height), [self.hub],
                         self.agents, [self.site],
                         food=self.foods)

    def step(self):
        self.schedule.step()
        if self.viewer:
            self.ui.step()
Exemple #11
0
class XMLEnvironmentModel(Model):
    """ A environemnt to model swarms """
    def __init__(self, N, width, height, grid=10, seed=None):
        if seed is None:
            super(XMLEnvironmentModel, self).__init__(seed=None)
        else:
            super(XMLEnvironmentModel, self).__init__(seed)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.schedule = SimultaneousActivation(self)

        self.site = Sites(id=1, location=(45, 45), radius=5, q_value=0.5)

        self.grid.add_object_to_grid(self.site.location, self.site)

        self.hub = Hub(id=1, location=(0, 0), radius=11)

        self.grid.add_object_to_grid(self.hub.location, self.hub)

        self.agents = []

        # Create agents
        for i in range(self.num_agents):
            a = XMLTestAgent(i, self)
            self.schedule.add(a)
            x = 45
            y = 45

            a.location = (x, y)
            self.grid.add_object_to_grid((x, y), a)
            a.operation_threshold = 2  # self.num_agents // 10
            self.agents.append(a)

        # Add equal number of food source
        for i in range(5):  # self.num_agents * 2):
            f = Food(i, location=(45, 45), radius=3)
            f.agent_name = None
            self.grid.add_object_to_grid(f.location, f)

    def step(self):
        self.schedule.step()
Exemple #12
0
class RandomWalkSwarmEnvironmentModel(Model):
    """A environment to model swarms."""
    def __init__(self, N, width, height, grid=10, seed=None, viewer=False):
        """Initialize the environment methods."""
        if seed is None:
            super(RandomWalkSwarmEnvironmentModel, self).__init__(seed=None)
        else:
            super(RandomWalkSwarmEnvironmentModel, self).__init__(seed)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.viewer = viewer

        self.schedule = SimultaneousActivation(self)

        self.hub = Hub(id=2, location=(0, 0), radius=5)
        self.grid.add_object_to_grid(self.hub.location, self.hub)

        self.site = Sites(id=2, location=(25, 25), radius=5)
        self.grid.add_object_to_grid(self.site.location, self.site)

        self.agents = []
        for i in range(self.num_agents):
            a = SwarmAgentRandomWalk(i, self)
            self.schedule.add(a)
            x = 0
            y = 0
            a.location = (x, y)
            a.direction = -2.3561944901923448
            self.grid.add_object_to_grid((x, y), a)
            self.agents.append(a)

        if self.viewer:
            self.ui = UI((width, height), [self.hub], self.agents, [self.site])

    def step(self):
        """Execute."""
        self.schedule.step()
        if self.viewer:
            self.ui.step()
Exemple #13
0
class MultipleCarryModel(Model):
    """ A environment to model swarms """
    def __init__(self, N, width, height, grid=10, seed=None):
        if seed is None:
            super(MultipleCarryModel, self).__init__(seed=None)
        else:
            super(MultipleCarryModel, self).__init__(seed)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.schedule = SimultaneousActivation(self)

        self.thing = Food(id=1, location=(30, 30), radius=40)
        self.grid.add_object_to_grid(self.thing.location, self.thing)

        self.thing1 = Food(id=1, location=(30, 30), radius=40)
        self.grid.add_object_to_grid(self.thing1.location, self.thing1)

        self.site = Sites(id=1, location=(30, 30), radius=5, q_value=0.5)
        self.grid.add_object_to_grid(self.site.location, self.site)

        self.hub = Hub(id=1, location=(0, 0), radius=11)
        self.grid.add_object_to_grid(self.hub.location, self.hub)

        self.agent = []
        for i in range(self.num_agents):
            a = SwarmMultipleCarry(i, self)
            self.schedule.add(a)
            x = 30
            y = 30
            a.location = (x, y)
            a.direction = 2.3561944901923448
            self.grid.add_object_to_grid((x, y), a)
            self.agent.append(a)

    def step(self):
        self.schedule.step()
Exemple #14
0
class SimModel(Model):
    """A environemnt to model swarms."""

    def __init__(
            self, N, width, height, grid=10, iter=100000,
            xmlstrings=None, seed=None, viewer=False, pname=None,
            expname='MSFSimulation', agent='SimAgent'):
        """Initialize the attributes."""
        if seed is None:
            super(SimModel, self).__init__(seed=None)
        else:
            super(SimModel, self).__init__(seed)

        self.runid = datetime.datetime.now().strftime(
            "%s") + str(self.random.randint(1, 1000, 1)[0])

        if pname is None:
            self.pname = os.getcwd() + '/' + self.runid + expname
        else:
            self.pname = pname + '/' + self.runid + expname

        self.width = width
        self.height = height
        self.stepcnt = 1
        self.iter = iter
        self.xmlstrings = xmlstrings

        self.viewer = viewer

        # Create db connection
        connect = Connect('swarm', 'swarm', 'swarm', 'localhost')
        self.connect = connect.tns_connect()

        # Fill out the experiment table
        self.experiment = Experiment(
            self.connect, self.runid, N, seed, expname,
            iter, width, height, grid, phenotype=xmlstrings[0])

        self.experiment.insert_experiment_simulation()

        self.sn = self.experiment.sn

        # Create a folder to store results
        os.mkdir(self.pname)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.schedule = SimultaneousActivation(self)

        self.agents = []

        bound = np.ceil((self.num_agents * 1.0) / len(self.xmlstrings))

        j = 0
        # Create agents
        for i in range(self.num_agents):
            # print (i, j, self.xmlstrings[j])
            a = eval(agent)(i, self, xmlstring=self.xmlstrings[j])
            self.schedule.add(a)
            # Add the agent to a random grid cell
            # x = self.random.randint(
            #    -self.grid.width / 2, self.grid.width / 2)
            x = 0
            # y = self.random.randint(
            #    -self.grid.height / 2, self.grid.height / 2)
            y = 0

            a.location = (x, y)
            self.grid.add_object_to_grid((x, y), a)
            a.operation_threshold = 2  # self.num_agents // 10
            self.agents.append(a)

            if (i + 1) % bound == 0:
                j += 1

    def create_environment_object(self, jsondata, obj):
        """Create env from jsondata."""
        name = obj.__name__.lower()
        temp_list = []
        i = 0
        for json_object in jsondata[name]:
            location = (json_object["x"], json_object["y"])
            if "q_value" in json_object:
                temp_obj = obj(
                    i, location, json_object["radius"], q_value=json_object[
                        "q_value"])
            else:
                temp_obj = obj(i, location, json_object["radius"])

            self.grid.add_object_to_grid(location, temp_obj)
            temp_list.append(temp_obj)
            i += 1
        return temp_list

    def build_environment_from_json(self):
        """Build env from jsondata."""
        jsondata = JsonData.load_json_file(filename)
        # Create a instance of JsonData to store object that
        # needs to be sent to UI
        self.render = JsonData()
        self.render.objects = {}

        for name in jsondata.keys():
            obj = eval(name.capitalize())
            self.render.objects[name] = self.create_environment_object(
                jsondata, obj)

        self.hub = self.render.objects['hub'][0]
        try:
            self.foods = []
            for site in self.render.objects['sites']:
                self.site = site  # self.render.objects['sites'][0]

                for i in range(self.num_agents):
                    f = Food(
                        i, location=self.site.location,
                        radius=self.site.radius)
                    f.agent_name = None
                    self.grid.add_object_to_grid(f.location, f)
                    self.foods.append(f)
        except KeyError:
            pass

        if self.viewer:
            self.ui = UI(
                (self.width, self.height), [self.hub], self.agents,
                [self.site], food=self.foods)

    def step(self):
        """Step through the environment."""
        # Gather info from all the agents
        # self.gather_info()
        # Next step
        self.schedule.step()
        # Increment the step count
        self.stepcnt += 1
        if self.viewer:
            self.ui.step()

    def find_higest_performer(self):
        """Find the best agent."""
        fitness = self.agents[0].individual[0].fitness
        fittest = self.agents[0]
        for agent in self.agents:
            if agent.individual[0].fitness > fitness:
                fittest = agent
        return fittest

    def find_higest_food_collector(self):
        """Find the best agent to collect food."""
        fitness = self.agents[0].food_collected
        fittest = self.agents[0]
        for agent in self.agents:
            if agent.food_collected > fitness:
                fittest = agent
        return fittest

    def detect_food_moved(self):
        """Detect food moved."""
        grid = self.grid
        food_loc = self.site.location
        neighbours = grid.get_neighborhood(food_loc, 10)
        food_objects = grid.get_objects_from_list_of_grid('Food', neighbours)

        # print (food_objects)
        return food_objects

    def food_in_hub(self):
        """Find amount of food in hub."""
        grid = self.grid
        food_loc = self.hub.location
        neighbours = grid.get_neighborhood(food_loc, 10)
        food_objects = grid.get_objects_from_list_of_grid('Food', neighbours)
        return len(food_objects)

    def food_in_loc(self, loc):
        """Find amount of food in hub."""
        grid = self.grid
        neighbours = grid.get_neighborhood(loc, 10)
        food_objects = grid.get_objects_from_list_of_grid('Food', neighbours)
        return food_objects
Exemple #15
0
class EvolModel(Model):
    """A environemnt to model swarms."""
    def __init__(self,
                 N,
                 width,
                 height,
                 grid=10,
                 iter=100000,
                 seed=None,
                 expname='COT',
                 agent='EvolAgent',
                 parm='swarm_mcarry.txt'):
        """Initialize the attributes."""
        if seed is None:
            super(EvolModel, self).__init__(seed=None)
        else:
            super(EvolModel, self).__init__(seed)

        self.runid = datetime.datetime.now().strftime("%s") + str(
            self.random.randint(1, 1000, 1)[0])

        self.pname = '/'.join(os.getcwd().split('/')[:-2]) + '/results/' \
            + self.runid + expname

        self.stepcnt = 1
        self.iter = iter
        self.top = None
        # Create db connection
        connect = Connect('swarm', 'swarm', 'swarm', 'localhost')
        self.connect = connect.tns_connect()

        # Fill out the experiment table
        self.experiment = Experiment(self.connect, self.runid, N, seed,
                                     expname, iter, width, height, grid)
        self.experiment.insert_experiment()

        self.sn = self.experiment.sn

        # Create a folder to store results
        os.mkdir(self.pname)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.schedule = SimultaneousActivation(self)

        self.agents = []
        self.parm = parm

        # Create agents
        for i in range(self.num_agents):
            a = eval(agent)(i, self)
            self.schedule.add(a)
            # Add the agent to a random grid cell
            x = self.random.randint(-self.grid.width / 2, self.grid.width / 2)
            # x = 0
            y = self.random.randint(-self.grid.height / 2,
                                    self.grid.height / 2)
            # y = 0

            a.location = (x, y)
            self.grid.add_object_to_grid((x, y), a)
            a.operation_threshold = 2  # self.num_agents // 10
            self.agents.append(a)

    def create_environment_object(self, jsondata, obj):
        """Create env from jsondata."""
        name = obj.__name__.lower()
        temp_list = []
        i = 0
        for json_object in jsondata[name]:
            location = (json_object["x"], json_object["y"])
            if "q_value" in json_object:
                temp_obj = obj(i,
                               location,
                               json_object["radius"],
                               q_value=json_object["q_value"])
            else:
                temp_obj = obj(i, location, json_object["radius"])

            self.grid.add_object_to_grid(location, temp_obj)
            temp_list.append(temp_obj)
            i += 1
        return temp_list

    def build_environment_from_json(self):
        """Build env from jsondata."""
        jsondata = JsonData.load_json_file(filename)
        # Create a instance of JsonData to store object that
        # needs to be sent to UI
        self.render = JsonData()
        self.render.objects = {}

        for name in jsondata.keys():
            obj = eval(name.capitalize())
            self.render.objects[name] = self.create_environment_object(
                jsondata, obj)

        self.hub = self.render.objects['hub'][0]
        try:
            self.foods = []
            self.site = self.render.objects['sites'][0]
            food_radius = self.random.randint(20, 30)
            for i in range(self.num_agents):
                f = Food(i, location=self.site.location, radius=food_radius)
                f.agent_name = None
                f.phenotype = {}
                self.grid.add_object_to_grid(f.location, f)
                self.foods.append(f)
        except KeyError:
            pass

    def step(self):
        """Step through the environment."""
        # Gather info from all the agents
        self.top = self.gather_info()
        # Next step
        self.schedule.step()
        # Increment the step count
        self.stepcnt += 1

    def gather_info(self):
        """Gather information from all the agents."""
        diversity = np.ones(len(self.agents))
        exploration = np.ones(len(self.agents))
        foraging = np.ones(len(self.agents))
        fittest = np.ones(len(self.agents))
        for id in range(len(self.agents)):
            diversity[id] = self.agents[id].diversity_fitness
            exploration[id] = self.agents[id].exploration_fitness()
            foraging[id] = self.agents[id].food_collected
            fittest[id] = self.agents[id].individual[0].fitness
        beta = self.agents[-1].beta
        """
        mean = Best(
            self.pname, self.connect, self.sn, 1, 'MEAN', self.stepcnt,
            beta, np.mean(fittest), np.mean(diversity), np.mean(exploration),
            np.mean(foraging), "None"
            )
        mean.save()

        std = Best(
            self.pname, self.connect, self.sn, 1, 'STD', self.stepcnt, beta,
            np.std(fittest), np.std(diversity), np.std(exploration),
            np.std(foraging), "None"
            )
        std.save()
        """
        # Compute best agent for each fitness
        self.best_agents(diversity, beta, "DIVERSE")
        self.best_agents(exploration, beta, "EXPLORE")
        self.best_agents(foraging, beta, "FORGE")
        self.best_agents(fittest, beta, "OVERALL")
        return np.argmax(foraging)

    def best_agents(self, data, beta, header):
        """Find the best agents in each category."""
        idx = np.argmax(data)
        dfitness = self.agents[idx].diversity_fitness
        ofitness = self.agents[idx].individual[0].fitness
        ffitness = self.agents[idx].food_collected
        efitness = self.agents[idx].exploration_fitness()
        phenotype = self.agents[idx].individual[0].phenotype

        best_agent = Best(self.pname, self.connect, self.sn, idx, header,
                          self.stepcnt, beta, ofitness, dfitness, efitness,
                          ffitness, phenotype)

        best_agent.save()

    def find_higest_performer(self):
        """Find the best agent."""
        fitness = self.agents[0].individual[0].fitness
        fittest = self.agents[0]
        for agent in self.agents:
            if agent.individual[0].fitness > fitness:
                fittest = agent
        return fittest

    def find_higest_food_collector(self):
        """Find the best agent to collect food."""
        fitness = self.agents[0].food_collected
        fittest = self.agents[0]
        for agent in self.agents:
            if agent.food_collected > fitness:
                fittest = agent
        return fittest

    def detect_food_moved(self):
        """Detect food moved."""
        grid = self.grid
        food_loc = self.site.location
        neighbours = grid.get_neighborhood(food_loc, 10)
        food_objects = grid.get_objects_from_list_of_grid('Food', neighbours)

        # print (food_objects)
        return food_objects

    def food_in_loc(self, loc):
        """Find amount of food in hub."""
        grid = self.grid
        neighbours = grid.get_neighborhood(loc, 10)
        food_objects = grid.get_objects_from_list_of_grid('Food', neighbours)
        return food_objects
Exemple #16
0
class RunEnvironmentModel(Model):
    """A environemnt to model swarms."""
    def __init__(self,
                 N,
                 width,
                 height,
                 grid=10,
                 iter=100000,
                 xmlstring=None,
                 seed=None):
        """Initialize the attributes."""
        if seed is None:
            super(RunEnvironmentModel, self).__init__(seed=None)
        else:
            super(RunEnvironmentModel, self).__init__(seed)

        self.runid = datetime.datetime.now().strftime("%s") + str(
            self.random.randint(1, 1000, 1)[0])
        self.pname = os.getcwd() + '/' + self.runid + "SFCommSimulation"

        self.stepcnt = 1
        self.iter = iter
        self.xmlstring = xmlstring

        # Create db connection
        connect = Connect('swarm', 'swarm', 'swarm', 'localhost')
        self.connect = connect.tns_connect()

        # Fill out the experiment table
        self.experiment = Experiment(self.connect,
                                     self.runid,
                                     N,
                                     seed,
                                     'Simuation SFComm',
                                     iter,
                                     width,
                                     height,
                                     grid,
                                     phenotype=xmlstring)
        self.experiment.insert_experiment_simulation()

        self.sn = self.experiment.sn

        # Create a folder to store results
        os.mkdir(self.pname)

        self.num_agents = N

        self.grid = Grid(width, height, grid)

        self.schedule = SimultaneousActivation(self)

        # self.site = Sites(id=1, location=(5, 5), radius=11, q_value=0.5)

        # self.grid.add_object_to_grid(self.site.location, self.site)

        # self.hub = Hub(id=1, location=(0, 0), radius=11)

        # self.grid.add_object_to_grid(self.hub.location, self.hub)

        self.agents = []

        # Create agents
        for i in range(self.num_agents):
            a = RunSwarmAgent(i, self)
            self.schedule.add(a)
            # Add the agent to a random grid cell
            x = self.random.randint(-self.grid.width / 2, self.grid.width / 2)
            # x = 0
            y = self.random.randint(-self.grid.height / 2,
                                    self.grid.height / 2)
            # y = 0

            a.location = (x, y)
            self.grid.add_object_to_grid((x, y), a)
            a.operation_threshold = 2  # self.num_agents // 10
            self.agents.append(a)

        # Add equal number of food source
        # for i in range(20):
        #    f = Food(i, location=(-29, -29), radius=5)
        #    self.grid.add_object_to_grid(f.location, f)
        # print (i,x,y)

    def create_environment_object(self, jsondata, obj):
        """Create env from jsondata."""
        name = obj.__name__.lower()
        temp_list = []
        i = 0
        for json_object in jsondata[name]:
            location = (json_object["x"], json_object["y"])
            if "q_value" in json_object:
                temp_obj = obj(i,
                               location,
                               json_object["radius"],
                               q_value=json_object["q_value"])
            else:
                temp_obj = obj(i, location, json_object["radius"])

            self.grid.add_object_to_grid(location, temp_obj)
            temp_list.append(temp_obj)
            i += 1
        return temp_list

    def build_environment_from_json(self):
        """Build env from jsondata."""
        jsondata = JsonData.load_json_file(filename)
        # Create a instance of JsonData to store object that
        # needs to be sent to UI
        self.render = JsonData()
        self.render.objects = {}

        for name in jsondata.keys():
            obj = eval(name.capitalize())
            self.render.objects[name] = self.create_environment_object(
                jsondata, obj)

        self.hub = self.render.objects['hub'][0]
        try:
            self.site = self.render.objects['sites'][0]
            for i in range(self.num_agents * 2):
                f = Food(i,
                         location=self.site.location,
                         radius=self.site.radius)
                f.agent_name = None
                self.grid.add_object_to_grid(f.location, f)
        except KeyError:
            pass

    def step(self):
        """Step through the environment."""
        # Gather info from all the agents
        # self.gather_info()
        # Next step
        self.schedule.step()
        # Increment the step count
        self.stepcnt += 1

    def find_higest_performer(self):
        """Find the best agent."""
        fitness = self.agents[0].individual[0].fitness
        fittest = self.agents[0]
        for agent in self.agents:
            if agent.individual[0].fitness > fitness:
                fittest = agent
        return fittest

    def find_higest_food_collector(self):
        """Find the best agent to collect food."""
        fitness = self.agents[0].food_collected
        fittest = self.agents[0]
        for agent in self.agents:
            if agent.food_collected > fitness:
                fittest = agent
        return fittest

    def detect_food_moved(self):
        """Detect food moved."""
        grid = self.grid
        food_loc = self.site.location
        neighbours = grid.get_neighborhood(food_loc, 10)
        food_objects = grid.get_objects_from_list_of_grid('Food', neighbours)

        # print (food_objects)
        return food_objects

    def food_in_hub(self):
        """Find amount of food in hub."""
        grid = self.grid
        food_loc = self.hub.location
        neighbours = grid.get_neighborhood(food_loc, 10)
        food_objects = grid.get_objects_from_list_of_grid('Food', neighbours)
        return len(food_objects)