2

Java API を使用して、NetLogo でタートルの座標を取得しようとしています。ワークスペースをロードすることができ、作成した次のコードを使用しています。

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;
}

ただし、小さな問題が 1 つあります。タートルが 5 を超えると非常に遅くなります。座標を取得せずに 200 匹のカメで Flocking コードを実行すると、10 秒で約 300 ティックが得られます。座標でコードを実行すると、各ティックに約 3 秒かかります。これを達成するためのより効率的な方法はありますか?

ありがとう、

ナディム

4

2 に答える 2

4

私はなんとか適切な方法がどうあるべきかを見つけることができました。これは、SethTisueによって提供されたNetLogoメーリングリストのコードです。

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();
      }
   }
}

私はここでコードを複製したので、他の人に役立つかもしれません。Turtleから取得できる情報のリストを確認するには、NetLogoAPIのドキュメントを参照してください。

ナディム

于 2010-07-23T09:17:48.053 に答える
1

したがって、Java API を使用しているのは、

[xcor] of "bob" 10

私は非常に混乱しています。

上記のworkspace.report()呼び出しは、作成した式を解析して評価するようにnetlogoに依頼しているため、非常に高価であることがわかります。次に、それを整数に解析してnetlogoに戻します。

すべてのプレイヤーをリストまたはマップに保存し、リスト内のインデックスで参照する方がはるかに簡単なようです。つまり、やっているように見えることをするために API を使う必要はないと思います。

于 2010-07-22T13:02:50.433 に答える