def move_by_only_a_cell(agent): """ RA2 : l'agent ne peut se déplacer que d'une cellule par cycle en verifiant certains conditions développées dans la fonction is_interested_to_move """ xi, yi = get_pos(agent) env = get_env(agent) acc_refs = accecible_positions(agent) found_target = False size_poss = len(acc_refs) if size_poss != 0: sorted_list = e.sort_sugar_level_desc(env, acc_refs) i = 0 #car la liste est triée maximum = sorted_list[0] while i < size_poss and not found_target: if not is_interested_to_move(agent, maximum): if i + 1 < size_poss: maximum = sorted_list[i + 1] else: found_target = True i += 1 if found_target: xf, yf = maximum xd, yd = u.vector_diff(get_pos(agent), maximum) if xd == 0: step = (1 if yd < 0 else -1) move_y = correct_position((xi, yi + step), env) move(agent, move_y) else: step = (1 if xd < 0 else -1) move_x = correct_position((xi + step, yi), env) move(agent, move_x)
def total_gain(agent, target): """ calculer les réserves de l’agent additionnée à l’ensemble du sucre qu’il récupérera durant son voyage soustrait au métabolisme consommé à chaque étape """ pop = get_population(agent) env = get_env(agent) pos = get_pos(agent) sugar_level = get_sugar_level(agent) #x_diff,y_diff xd, yd = u.vector_diff(pos, target) if xd == 0: #the same line steps = abs(yd) step = (1 if yd < 0 else -1) for i in range(steps): cell_refs = correct_position((pos[0], pos[1] + step * i), env) cell = e.get_cell(env, cell_refs) sugar_level += c.get_sugar_level(cell) else: #the same row steps = abs(xd) step = (1 if xd < 0 else -1) for i in range(steps): cell_refs = correct_position((pos[0] + step * i, pos[1]), env) cell = e.get_cell(env, cell_refs) sugar_level += c.get_sugar_level(cell) return sugar_level - get_metabolism(agent) * steps
def move_by_only_a_cell(agent): """ RA2 : l'agent ne peut se déplacer que d'une cellule par cycle en verifiant certains conditions développées dans la fonction is_interested_to_move """ xi,yi = get_pos(agent) env = get_env(agent) acc_refs = accecible_positions(agent) found_target = False size_poss = len(acc_refs) if size_poss != 0: sorted_list = e.sort_sugar_level_desc(env,acc_refs) i = 0 #car la liste est triée maximum = sorted_list[0] while i < size_poss and not found_target: if not is_interested_to_move(agent,maximum): if i+1 < size_poss: maximum = sorted_list[i+1] else: found_target = True i+=1 if found_target: xf,yf = maximum xd,yd = u.vector_diff(get_pos(agent),maximum) if xd == 0: step = (1 if yd < 0 else -1) move_y = correct_position((xi,yi+step),env) move(agent,move_y) else: step = (1 if xd < 0 else -1) move_x = correct_position((xi+step,yi),env) move(agent,move_x)
def total_gain(agent,target): """ calculer les réserves de l’agent additionnée à l’ensemble du sucre qu’il récupérera durant son voyage soustrait au métabolisme consommé à chaque étape """ pop = get_population(agent) env = get_env(agent) pos = get_pos(agent) sugar_level = get_sugar_level(agent) #x_diff,y_diff xd,yd = u.vector_diff(pos,target) if xd == 0: #the same line steps = abs(yd) step = (1 if yd < 0 else -1) for i in range(steps): cell_refs = correct_position((pos[0],pos[1]+step*i),env) cell = e.get_cell(env,cell_refs) sugar_level += c.get_sugar_level(cell) else: #the same row steps = abs(xd) step = (1 if xd < 0 else -1) for i in range(steps): cell_refs = correct_position((pos[0]+step*i,pos[1]),env) cell = e.get_cell(env,cell_refs) sugar_level += c.get_sugar_level(cell) return sugar_level - get_metabolism(agent)*steps
def RA2_is_possible( env, agent, target ): agent_ref = get_pos( agent ) result = u.vector_diff( target, agent_ref ) target_unit = vector_one_max( result ) cell_ref = u.vector_sum( agent_ref, target_unit ) cell = e.get_cell( env, cell_ref ) return ( not c.agent_is_present(cell) ) and get_metabolism(agent) <= get_sugar_level(agent) + c.get_sugar_level(cell)
def unital_move(env, env_size, agent, pos_cell): """ Makes the movement of the agent respecting the RA2 rule which makes the agents move from one cell to another cell which is just one cell further. """ deplacement = deplacement_into_unit(u.vector_diff(pos_cell, get_pos(agent))) save = ref_adapted_to_env(env_size, u.vector_sum(get_pos(agent), deplacement)) return possible_cell_position(env, agent, save)
def unital_move(env, env_size, agent, pos_cell): """ Makes the walkers move from one cell to another cell which is just one cell further. """ deplacement = a.deplacement_into_unit( u.vector_diff(pos_cell, get_pos(agent))) save = a.ref_adapted_to_env(env_size, u.vector_sum(get_pos(agent), deplacement)) return possible_cell_position(env, agent, save)
def RA2( pop, env, agent ): """ Règle 2: Se dirige vers la cellule avec le plus de sucre mais de 1 case par 1 case. """ agent_ref = get_pos(agent) cells_refs = get_cells_refs( env, agent ) if len(cells_refs) > 0: sort_cells_refs_decrease( env, cells_refs ) for target in cells_refs: if RA2_is_possible( env, agent, target ): result = u.vector_diff( target, agent_ref ) target_unit = vector_one_max( result ) cell_ref = u.vector_sum( agent_ref, target_unit ) # Récupère la position de la cellule à coté de l'agent move_to(env, agent, cell_ref) # Bouge l'agent return
def is_interested_to_move(agent,target): """ - vérifier si le total_gain(agent,target) est plus grand que zèro - si un autre agent peut atteindre la cellule avant lui - si il n'y a pas d'agents dans la direction choisie """ pos = get_pos(agent) xd,yd = u.vector_diff(pos,target) env = get_env(agent) agent_on_way = False if xd == 0: step = (1 if yd < 0 else -1) next_move = correct_position((pos[0],pos[1]+step),env) agent_on_way = c.get_present_agent(e.get_cell(env,next_move)) else: step = (1 if xd < 0 else -1) next_move = correct_position((pos[0]+step,pos[1]),env) agent_on_way = c.get_present_agent(e.get_cell(env,next_move)) return (not is_an_agent_can_be_there_faster(agent,target) and not agent_on_way and total_gain(agent,target) > 0)
def is_interested_to_move(agent, target): """ - vérifier si le total_gain(agent,target) est plus grand que zèro - si un autre agent peut atteindre la cellule avant lui - si il n'y a pas d'agents dans la direction choisie """ pos = get_pos(agent) xd, yd = u.vector_diff(pos, target) env = get_env(agent) agent_on_way = False if xd == 0: step = (1 if yd < 0 else -1) next_move = correct_position((pos[0], pos[1] + step), env) agent_on_way = c.get_present_agent(e.get_cell(env, next_move)) else: step = (1 if xd < 0 else -1) next_move = correct_position((pos[0] + step, pos[1]), env) agent_on_way = c.get_present_agent(e.get_cell(env, next_move)) return (not is_an_agent_can_be_there_faster(agent, target) and not agent_on_way and total_gain(agent, target) > 0)