clement-moulin-frier / vivarium

MIT License
5 stars 0 forks source link

Decide what name the general case of behaviors or routines should have #44

Open Marsolo1 opened 6 months ago

Marsolo1 commented 6 months ago

Description

As of now, the behaviors defined in the Agent class of notebook_controller.py are a specific case of the routine methods defined in the base class Entity. We should decide whether the behaviors should be recoded as such (for now they are a modified copy-paste of the routines), and what name to give the general case (routine or behavior)

clement-moulin-frier commented 6 months ago

What I wrote on mattermost:

Les routines sont un concept qui vient de la lib pyvrep-epuck aussi (expliqué en session 3 ou 4 je crois). C'est en effet très similaire à un behavior, mais c'est plus général. Un behavior retourne forcément des activités motrices, alors que des routines non. Par exemple, une routine peut être utilisé pour :

Si tu veux essayer, tu peux par exemple tenter le code suivant (peut-être à adapter un peu, je ne l'ai pas testé) :

def horizontal_movement(object):
    object.x_position += 1.

Une fois la routine attachée à un objet et démarrée (comme pour un behavior, mais avec attach_routine), tu devrais le voir bouger de gauche à droite au cours du temps.

Ceci dit, je me demande maintenant si il est forcément nécessaire de distinguer routine et behavior. En fait, un behavior est simplement un cas particulier d'une routine qui ne s'applique qu'à des agents pour modifier leurs activations motrices. Avec le code actuel, il est en théorie tout à fait possible de définir un behavior comme une routine (à tester), par exemple :

def aggression(agent):
    agent.left_motor = agent.left_prox
    agent.right_motor = agent.right_prox

Si tu attaches cette fonction comme une routine (méthode attach_routine) et la démarre, le comportement devrait être le même que si c'était défini comme un behavior. @Marsolo1 tu pourrais déjà tester ça?

clement-moulin-frier commented 6 months ago

Then I wrote that:

Mmm, en fait il y a un cas auquel je viens de penser. Dans pyvrep-epuck, on peut attacher plusieurs behavior en parallèle sur un robot (c'est expliqué en session 3 ou 4). C'est très utile pour structurer le code car ça permet de définir des behaviors élémentaires (dans des fonction très courtes, par exemple un behavior pour éviter des obstacles et un autre pour attraper des ressources). Sous le capot, la librairie va ensuite automatiquement récupérer les activations motrices retournées par tous les behaviors et en faire la moyenne, qu'il va envoyer à l'agent. En fait je crois que j'ai déjà intégré ça dans Agent.behave. Si on passe tout dans des routines, ça devient plus compliqué de faire ça. Mais ça pose aussi la question intéressante de comment combiner des routines hiérarchiquement (par exemple : une super-routine qui a accès à des sous-routines pour en faire une moyenne ?). Donc ça mérite discussion.