MaDKit forum

Welcome All !
Please, use explicit topic names when creating new threads. Thanks.

You are not logged in.

#1 Re: Wishlist and general discussion » Multi-level modeling under madkit » 2012-06-14 17:34:25

Hi,

If your are interested, you will find the new web site of MadKitGroupExtension here: http://madkitgroupextension.free.fr/
Documentation and downloads are included.

#2 Re: Wishlist and general discussion » Multi-level modeling under madkit » 2012-03-15 16:08:57

Hello,

I am not sure that its your subject, but I have done an extension of MadKit to use hiearachy of groups on the MAS (MadKitGroupExtension). This hierarchy looks like the folder organisation. So several groups can be included into one group which can be included in another group, etc.. It is also possible to work with MultiGroup by regrouping several groups.

This extension is open source and will be published online soon. I am currently generating the documentation.

#3 Re: HowTo » Impossible de tuer un agent (MadKit 5 alpha 4) » 2010-12-21 17:56:15

fmichel wrote:

Salut Jason !!
Ça me fait très plaisir de te voir là wink

Tant mieux smile

fmichel wrote:

Bon, si je comprends bien, c'est pour des raisons de synchronisation des différentes étapes que tu as écrit le code comme ça.

exactement.

fmichel wrote:

En fait je me rends compte en lisant ton code à quel point MadKit manque de doc wink

Par exemple, le scheduler ne sera en principe pas pertubé par une liste qui change en cours de route (il travaille sur une copie), et beaucoup de choses sont déjà synchronisées en interne.
Par exemple un kill sur plusieurs agents devrait en principe être juste une boucle killAgent(a) depuis l'AgentLauncher par exemple.

Surtout ce qui manque dans la doc, c'est de bien préciser qu'il existe 2 types d'agent : les autonomes threadé (Agent) et les agents destinés à être simulés et schedulés par un agent threadé (comme le Scheduler) : les AbstractAgent (sans live)

C'est bon à savoir. C'est sûr qu'il faudrait rajouter tout ça dans la doc. Mais j'avais compris pour les deux types d'agent.

fmichel wrote:

Bon, ça va être un peu compliqué par forum. Si tu as un projet eclipse, tu peux me l'envoyer, je regarderai ce que tu fais, comme ça je comprends mieux comment expliquer tout ça.

Je vais t'envoyer mes sources. Ceci dit, j'ai codé rapidement un test très simple avec Madkit que je t'expliquerais ultérieurement, et j'ai toujours une exception à la suppression. Je ne sais pas vraiment si c'est un mauvaise utilisation ou si c'est un bug.

fmichel wrote:

Sinon, regarde bien du côté de la démo bees et de ses sources : je pense que cela t'éclairera aussi un peu mieux.

C'est ce que j'ai fait dès le début wink J'y ai passé une après midi en explorant la doc pour comprendre le fonctionnement de Madkit.

fmichel wrote:

En tout cas ça fait plaisir d'avoir un développeur confirmé comme utilisateur de MadKit : ça va me faire des bugs à corriger wink

Merci ! D'ailleurs je pense à une fonction dans madkit qui me simplifierait bien la vie pour les développement futurs de certains de mes modèles : c'est d'étendre la fonction de groupe à la notion de groupe de groupe. Par exemple, on entrerait requestRole("Com/Groupe/Sous Groupe/rôle"), ou encore requestRole("Com", "Groupe", "Sous Groupe", "rôle") avec une déclaration de la fonction du type public void requestRole(String ...args), et une contrainte de trois éléments minimum. En fait, j'ai pris gout à cette notion de groupe, et vraiment pouvoir gérer toute une hiérarchie dans son SMA serait TOP.

#4 Re: HowTo » Impossible de tuer un agent (MadKit 5 alpha 4) » 2010-12-21 12:47:46

Merci pour votre réponse rapide (au passage salut Fab, c'est Jason wink).

Pour être plus précis, pour l'instant, j'ai voulu faire un bouton reset qui supprime tous les agents de la simulation (sauf les agents environnement, scheduler, launcher). Mais plus tard, la suppression devra être dynamique dans la simulation. Malgrès l'exception générée, la fonction end de l'agent supprimé est bien appelée, car cette dernière supprime l'agent de mon monteur d'affichage (l'agent disparaît de l'écran). Mais comme il s'agit de supprimer une liste d'agents et qu'une exception est générée, les autres agents ne sont pas supprimés. Il faut que je clique plusieurs fois sur reset pour faire disparaître tous mes agents.

L'ordre de suppression des agents est lancé par un bouton en lançant la fonction reset de la classe AgentLauncher. Pour être sûr que cela ne perturbe pas le système en cours de simulation, cette ordre est différé sous forme de tâche exécutée lors de la mise à jours de l'agent environnement. De plus, normalement, l'agent concerné n'est pas supprimé pendant la boucle du scheduler executant des mises à jour de tout ses homologues.

Voici le code de mon agentLauncher (à noter que la fonction launchAgentConstraint fonctionne correctement):

public class AgentLauncher extends Watcher
{


    protected Probe<AgentConstraint> m_probe_agents_contraint;
    protected Probe<AgentContour> m_probe_agents_contour;
    protected AgentEnvironment m_environment;
    protected AgentScheduler m_scheduler;

    @Override public void activate()
    {
    createGroup("RDF", "sma_reconstruction");
    requestRole("RDF", "sma_reconstruction","launcher");
    this.launchAgent(m_environment=new AgentEnvironment());
    this.launchAgent(new AgentPerception());
    this.launchAgent(m_scheduler=new AgentScheduler());
    
    m_probe_agents_contour=new Probe<AgentContour>("RDF", "sma_reconstruction", "agent_contour");
    m_probe_agents_contraint=new Probe<AgentConstraint>("RDF", "sma_reconstruction", "agent_constraint");
    this.addProbe(m_probe_agents_contour);
    this.addProbe(m_probe_agents_contraint);
    Main.m_frame.setAgentLauncher(this);
    }
    
    public void lunchAgentsContraint(final int _nb)
    {
    
    m_environment.invokeLater(new Runnable() {
        
        @Override
        public void run()
        {
        int nb=_nb;
        while (nb-->0)
        {
            AgentLauncher.this.launchAgent(new AgentConstraint());
        }
        }
    });

    }
    public void reset()
    {
    synchronized (m_probe_agents_contraint)
    {
        m_environment.invokeLater(new Runnable() {
        
        @Override
        public void run()
        {
            for (AgentConstraint a : m_probe_agents_contraint.getCurrentAgentsList())
            a.killAgent(a);
            /*for (AgentContour a : m_probe_agents_contour.getCurrentAgentsList())
                AgentLauncher.this.killAgent(a);*/
            m_environment.init();
        }
        });
    }
    }
...
}

Là c'est le code de mon agentScheduler :

public class AgentScheduler extends Scheduler
{
    @Override public void activate()
    {
    super.activate();
    this.requestRole("RDF", "sma_reconstruction", "scheduler");
    this.addActivator(new GenericBehaviorActivator<AgentEnvironment>("RDF", "sma_reconstruction", "environment", "update"));
    this.addActivator(new GenericBehaviorActivator<AgentConstraint>("RDF", "sma_reconstruction", "agent_constraint", "live"));
    this.addActivator(new GenericBehaviorActivator<AgentContour>("RDF", "sma_reconstruction", "agent_contour", "perceiveAndEmitSignals"));
    this.addActivator(new GenericBehaviorActivator<AgentContour>("RDF", "sma_reconstruction", "agent_contour", "live"));
    this.setDelay(0);
    setSimulationState(Scheduler.State.PAUSED);
    
    }
}

et enfin celui de mon environnement qui dans notre cas va se charger d'executer les tâches mises en attente.

public class AgentEnvironment extends Watcher
{

    ...
    private LinkedList<Runnable> m_actions=new LinkedList<Runnable>();

   ...    
    @Override public void activate()
    {
    this.requestRole("RDF", "sma_reconstruction", "environment");
    this.addProbe(new EnvironmentEnumerator<AgentConstraint>("RDF", "sma_reconstruction", "agent_constraint"));
    this.addProbe(new EnvironmentEnumerator<AgentPerception>("RDF", "sma_reconstruction", "perception organisation"));
    this.addProbe(m_agents_contour_probe=new EnvironmentEnumerator<AgentContour>("RDF", "sma_reconstruction", "agent_contour"));
    /*m_agents_contour_probe=new Probe<AgentContour>("RDF", "sma_reconstruction", "agent_contour");
    this.addProbe(m_agents_contour_probe);*/
    }

    synchronized public void invokeLater(Runnable r)
    {
    synchronized(m_actions)
    {
        m_actions.add(r);
    }
    }
    public void update()
    {
    LinkedList<Runnable> actions;
    synchronized(m_actions)
    {
        actions=(LinkedList<Runnable>)m_actions.clone();
        m_actions.clear();
    }
    for (Runnable r : actions)
    {
        r.run();
    }
    
    }
    
   ...
}

#5 HowTo » Impossible de tuer un agent (MadKit 5 alpha 4) » 2010-12-20 15:38:14

JazZ
Replies: 4

Bonjour,

J'essaye de tuer un agent par celui qu'il l'a créé : creator.killAgent(cible). Une exception madkit.kernel.KilledException est générée sans plus de précision. Si l'agent se tue lui même (this.killAgent(this)), j'ai la même exception. Je me suis par ailleurs arrangé pour que l'agent soit tué en dehors de sa boucle (ou de ses boucles) avec le scheduler, pour que ce dernier ne soit pas perturbé avec une liste d'agent actif qui a changée en cours de route (j'utilise des GenericBehaviorActivator). Toutefois, l'agent en question est tué lors de l'activation, par le scheduler, du comportement de l'agent environnement. Malgrès toutes ces précautions, rien y fait. J'avais pourtant fait un test avant de commencer mon programme avec succès. J'avais seulement relevé qu'on ne pouvait pas tuer un agent pendant sa phase d'activation par le scheduler. Maintenant, mon programme est plus complexe et je ne vois pas trop quoi faire.

A noter aussi que l'ordre de suppression de l'agent vient d'un autre thread (GUI), mais qu'une synchronisation est mise en place. De plus, l'ordre est instancié sous forme de tâche (Runnable), de sorte à ce qu'il soit exécuté lors de la mise à jour de l'agent environnement qui géré est par le même agent Scheduler, mais pas par le même GenericBehaviorActivator que l'agent à tuer.

Merci d'avance pour votre aide.

Board footer