2010-07-19 4 views
2

J'essaie d'obtenir des coordonnées pour les tortues dans NetLogo en utilisant l'API Java. J'ai réussi à obtenir l'espace de travail chargé et ont été en utilisant le code suivant que je fait:Utilisation de l'API NetLogo pour obtenir les coordonnées tortue

public static int getX(HeadlessWorkspace workspace, String playerName, int agentNum) 
{ 

    Double doubleX = null; 
    int xVal = 0; 
    try 
    { 
     xVal = doubleX.valueOf((workspace.report("[xcor] of "+playerName+" "+agentNum).toString()).trim()).intValue(); 
    } 
    catch(Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
    return xVal; 
} 

Cependant, il y a un petit problème. Il est extrêmement lent quand il y a plus de 5 tortues. Quand je lance le code Flocking avec 200 tortues, sans obtenir les coordonnées, je reçois environ 300 ticks en 10 secondes. Lorsque je cours le code avec les coordonnées, chaque tick prend environ 3 secondes. Y a-t-il un moyen plus efficace d'y parvenir?

Merci,

Nadim

Répondre

4

J'ai réussi à trouver la bonne façon de procéder. C'est le code de la liste de diffusion NetLogo donné par Seth Tisue.

import org.nlogo.headless.*; 
import org.nlogo.api.*; 
class J { 
    public static void main(String[] args) { 
     try { 
     HeadlessWorkspace ws = HeadlessWorkspace.newInstance(); 
     ws.openString(org.nlogo.util.Utils.url2String("/system/empty.nlogo")); 
     ws.command("cro 8 [ fd 5 ]"); 
     org.nlogo.api.Turtle turtle =(org.nlogo.api.Turtle) ws.world().turtles().agent(3); 
     System.out.println("[xcor] of turtle 3 = " + turtle.xcor()); 
     ws.dispose(); 
     } 
     catch(Exception ex) { 
     ex.printStackTrace(); 
     } 
    } 
} 

J'ai reproduit le code ici afin qu'il puisse bénéficier à d'autres. Pour voir une liste des informations que vous pouvez obtenir de Turtle, consultez la documentation de l'API NetLogo.

Nadim

1

Donc, vous utilisez l'API Java pour que vous puissiez obtenir le

[xcor] of "bob" 10 

Je suis très confus.

Je peux vous dire que votre appel workspace.report() ci-dessus est très cher car vous demandez à netlogo d'analyser puis d'évaluer l'expression que vous créez, puis de l'analyser en un entier pour le renvoyer à netlogo.

Il semble qu'il serait beaucoup plus facile de simplement stocker tous les joueurs dans une liste ou une carte et se référer à eux par leur index dans la liste. Autrement dit, je ne pense pas que vous ayez besoin d'utiliser l'API pour faire ce que vous semblez faire.

+0

Salut jmvidal, je rédigeais un programme en Java qui utilise NetLogo pour effectuer le traitement, et donc je devais utiliser l'API Java. Je ne pouvais pas trouver un moyen facile d'utiliser l'API et j'avais trouvé cette solution de contournement. Malheureusement, comme vous l'avez dit à juste titre, c'est une solution de contournement coûteuse. J'ai réussi à trouver comment faire le code et l'ai reproduit ci-dessous. Merci, Nadim – Nadim

Questions connexes