예제 #1
0
 def __init__(self):
     self.agents = {}
     self.locations = [(x,y) for x in range(Grid_Size) for y in range(Grid_Size)]
     agents_per_race = int((Grid_Size**2)*(1-Empty_Space)/Num_of_Races)
     shuffle(self.locations)
     loc_idx = 0
     minimum_friends = 3
     agents = []
     for race in range(Num_of_Races):
         for i in range(agents_per_race):
             new_agent = Agent(race)
             potential_friends = agents.copy()
             for j in range(minimum_friends):
                 if potential_friends:
                     degrees = [degree(agent) for agent in potential_friends]
                     friend = potential_friends[randomFromCDF(cdf(degrees))]
                     new_agent.connectTo(friend)
                     potential_friends.remove(friend)
             loc = self.locations[loc_idx]
             loc_idx += 1
             self.agents[loc] = new_agent
             agents.append(new_agent)
             
     # start keeping track of empty locations for unhappy agents to move to
     self.empty_locations = []
     for i in range(loc_idx, len(self.locations)):
         self.empty_locations.append(self.locations[i])
     self.steps = 0
     self.unhappy_count = 0
 def preferentialHomophilyNetwork(legislators):
     '''
     Returns adjacency matrix based on preferential attachment with homophily
     '''
     
     for i in range(Num_of_Representatives):
         legislators[i].linkTo(legislators[i],1)  # create self-link
     for rep1 in sample(legislators, Num_of_Representatives):  # (a shuffle without changing the original list)
         i = legislators.index(rep1)
         rep1_issues = sorted(State.issues, key = lambda i: rep1.priorities[i], reverse=True)
         potential_friends = []
         for rep2 in legislators:  # first find all potential friends with homophily
             j = legislators.index(rep2)
             if rep1!=rep2:                    
                 link_strength = 0
                 sum_pri_diffs = 0
                 for issue in rep1_issues[0:10]:
                     similarity = binaryTreeSimilarity(rep1.positions[issue], rep2.positions[issue])
                     pri_diff = 1 - abs(rep1.priorities[issue] - rep2.priorities[issue])
                     link_strength += similarity*pri_diff
                     sum_pri_diffs += pri_diff
                 link_strength = (link_strength/sum_pri_diffs)*2 - 1
                 if link_strength > Friend_Threshold:
                     potential_friends.append(rep2)
         degrees = [1 for rep in potential_friends]
         for k in range(Minimum_Friends):
             degrees = [len(rep.links.values()) for rep in potential_friends]
             if degrees:
                 friend_idx = randomFromCDF(cdf(degrees))
                 rep2 = potential_friends[friend_idx]
                 rep1.linkTo(rep2, 1)
                 potential_friends.remove(rep2)  # can't friend someone twice
                 
     
     matrix = [[legislators[i].getLinkValueTo(legislators[j]) for i in range(Num_of_Representatives)] 
                                              for j in range(Num_of_Representatives)]
     return matrix
 def __init__(self, affiliation, priority_issues=[], default_positions={}):
     self.priorities = {}
     self.positions = {}
     self.links = {} # network link strengths to other legislators
     self.affiliation = affiliation
     
     # generae priorities by preferential attachment
     priorities = [1 for i in range(Num_of_Issues)]        
     for issue in priority_issues:
         priorities[issue] = Priority_Multiplier * (priority_issues.index(issue) + 1)
                 
     for i in range(Num_of_Issues**2):
         priorities[randomFromCDF(cdf(priorities))] += 1
     # normalize the priorities to sum = 1
     priorities = pdf(priorities)
     shuffle(priorities)
     #assign priorities and positions
     for issue in State.issues:
         self.priorities[issue] = priorities[issue]
         self.positions[issue] = getrandbits(Solution_Bit_Length)
         if issue in default_positions.keys():  # set the last bits according to default position
             b = Ideology_Bit_Depth
             #self.positions[issue] = (self.positions[issue]>>b)<<b + default_positions[issue]
             self.positions[issue] = default_positions[issue]