class agent: id_number getLocation() changeLocation() category carbon, iron, sulfur, seed (2) class swarm: vector of agents computeNextMove(agent locations, rules) rules: if carbon: go toward the largest group of carbons if sulfur: go toward the nearest unpaired sulfur after pairing: go toward nearest iron if iron: go toward the seed never be next to another iron

In [168]:
%matplotlib inline
import numpy as np
import pylab as plt
from matplotlib import animation
from JSAnimation import IPython_display

swarm_params = { 'Ncarbon': 6, 'Nsulfur': 8, 'Niron': 5,'Nseed': 1 }
color_dict = { 'carbon': 'k', 'sulfur' : 'y', 'iron' : 'g', 'seed' :'r' }
xlims = [-5,5]
ylims = [-5,5]

class agent():
    def __init__(self,id_number,pars):
        self.id = id_number
        self.xpos = pars['x_init']
        self.ypos = pars['y_init']
        self.cat = pars['cat']
        self.fixed = pars['fixed']
        return None
    
    def update_position(self, newx, newy):
        self.xpos = newx
        self.ypos = newy
        return None
    
    def checkBCs(self):
        if self.xpos > xlims[1]:
            self.update_position(-5,self.ypos)
        if self.xpos < xlims[0]:
            self.update_position(5,self.ypos)
        if self.ypos > ylims[1]:
            self.update_position(self.xpos,-5)
        if self.ypos < ylims[0]:
            self.update_position(self.xpos, 5)
    
    def moveRight(self):
        newx = self.xpos + 1
        newy = self.ypos
        self.update_position(newx,newy)
        
    def moveLeft(self):
        newx = self.xpos - 1
        newy = self.ypos
        self.update_position(newx,newy)
        
    def moveUp(self):
        newx = self.xpos
        newy = self.ypos + 1
        self.update_position(newx,newy)
        
    def moveDown(self):
        newx = self.xpos 
        newy = self.ypos - 1
        self.update_position(newx,newy)
    
    
def agentSep(agent1,agent2):
    return np.sqrt((agent1.xpos-agent2.xpos)**2+(agent1.ypos-agent2.ypos)**2)

class swarm():
    
    def __init__(self, pars):
        
        self.members = []
        self.fig = plt.figure()
        self.ax = self.fig.gca()
        
        for i in np.arange(pars['Ncarbon']):
            temp = agent(i,{'x_init':i, 'y_init':0, 'cat': 'carbon', 'fixed': False})
            self.members.append(temp)
        """     
        for i in np.arange(pars['Nsulfur']):
            temp = agent(i,{'x_init':i, 'y_init':1, 'cat': 'sulfur', 'fixed': False})
            self.members.append(temp)
            
        for i in np.arange(pars['Niron']):
            temp = agent(i,{'x_init':i, 'y_init':2, 'cat': 'iron', 'fixed': False})
            self.members.append(temp)
        """    
        for i in np.arange(pars['Nseed']):
            temp = agent(i,{'x_init':i, 'y_init':3, 'cat': 'seed', 'fixed': True})
            self.members.append(temp)
    
    def checkMove(self,current,newx,newy):
        for other in self.members:
            if newx == other.xpos and newy == other.ypos:
                return 1
        return 0
    
    def timeEvolve(self, N):
        counter = 0
        while counter < N:
            for member in self.members:
                if not member.fixed:
                    test = np.random.rand(1)
                    if test >= 0 and test < 0.25:
                        member.moveLeft()
                    if test >= 0.25 and test < 0.5:
                        member.moveRight()
                    if test >= 0.5 and test < 0.75:
                        member.moveUp()
                    if test >= 0.75 and test <= 1:
                        member.moveDown()
                    member.checkBCs()
                    member.fixed = self.shouldFixQ(member)
            counter += 1
                    
                
    def shouldFixQ(self,member):
        for other in self.members:
            if agentSep(member,other) == 1 and other.fixed:
                return True
        return False
            
    def showCurrentState(self):
        self.ax.cla()
        self.ax.set_xlim(xlims[0],xlims[1])
        self.ax.set_ylim(ylims[0],ylims[1])
        xvec = []
        yvec = []
        colvec = []
        for member in self.members:
            xvec.append(member.xpos)
            yvec.append(member.ypos)
            colvec.append(color_dict[member.cat])
        scat = self.ax.scatter(xvec,yvec,c=colvec,)
        return scat
        
    def animInit(self):
        self.ax.grid(b=True, which='major', color='0.65',linestyle='-')
        
    def timeEvolveAndShowCurrentState(self):
        print '1'
        self.timeEvolve(1)
        print '2'
        scat = self.showCurrentState()
        return scat
        
    def animateSwarm(self):
        anim = animation.FuncAnimation(self.fig, self.timeEvolveAndShowCurrentState, init_func=self.animInit,
                               frames=xrange(200))

In [169]:
classroom = swarm(swarm_params)
classroom.timeEvolve(300)
classroom.showCurrentState()


Out[169]:
<matplotlib.collections.PathCollection at 0x109119890>

In [170]:
classroom = swarm(swarm_params)
classroom.animateSwarm()



In [ ]:
def main():
    numframes = 100
    numpoints = 10
    color_data = np.random.random((numframes, numpoints))
    x, y, c = np.random.random((3, numpoints))

    fig = plt.figure()
    scat = plt.scatter(x, y, c=c, s=100)

    ani = animation.FuncAnimation(fig, update_plot, frames=xrange(numframes),
                                  fargs=(color_data, scat))
    plt.show()

def update_plot(i, data, scat):
    scat.set_array(data[i])
    return scat,

main()