0

私が直面している問題は、単純な問題を解決する一連の jade エージェントを実行しているときに、実行中のエージェントの量に応じて、90 秒以内に jvm がヒープ領域を使い果たすことです。エージェントの目標は、いくつかのエージェントが負荷と別の世代を表す単純化されたマイクログリッド モデルで負荷と生成のバランスを取ることです。

次のコードに示すように、負荷エージェントは、ジェネレーターの動作の反復ごとに新しい値でジェネレーターを更新します。

    public class House9 extends Agent
    {
      double load  = 50;
      boolean offline = false;
      boolean valid = true;
      int counter = 0;
      double cur = 50;
      int next;

      public void setup()
      {

          addBehaviour(new SimpleBehaviour(this)
          {
             public void action()
             {
                //Adjusting load value
                if(counter == 0)
                {
                  load = (int)load;
                  cur = load;
                  next = 20+(int)(Math.random()*80);
                  //System.out.println("current: " + cur + " next " + next);
                  counter++;
                }
                else if(counter <= 1000)
                {
                  load = load + ((next - cur)/1000);
                  //System.out.println("added " + ((next - cur)/1000) +" to load");
                  counter++;
                }               
                else
                {
                  counter = 0;
                }

                //System.out.println("counter " + counter);

                //Sending result to the generator agent
                ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
                msg.setContent(Double.toString(load));
                msg.addReceiver(new AID("gen", AID.ISLOCALNAME));
                myAgent.send(msg);

           }
           public boolean done()
           {
              return offline;
           }
      });
}

すべての負荷エージェントはこれと同一であり、生成エージェントは次のとおりです。

    public class Generator extends Agent
    {
       int output = 100; 
       long time = System.currentTimeMillis();
       int iter = 0;


       public void setup()
       {
           System.out.println("Iterations,Time");

           addBehaviour(new CyclicBehaviour(this)
           {

               public void action()
               {
                   //myAgent.setQueueSize(2);
                     int temp = output;
                     ACLMessage reply = receive();

                     if(reply != null)
                     {
                        int load = Integer.parseInt(reply.getContent());
                        //System.out.println("current state--- output: " + output + " load: " + load);
                        if(load > output)
                        {
                           iter = 0;
                           while(load > output)
                           {
                               output = output + 10;
                               iter++;
                           }
                           //System.out.println((System.currentTimeMillis()-time)+ "," + iter );
                        }
                        else if(load < output)
                        {
                            iter = 0;
                            while(load < output)
                            {
                                output = output - 10;
                                iter--;
                            }
                            //System.out.println((System.currentTimeMillis()-time)+ "," + iter );

                        }

                        System.out.println((System.currentTimeMillis()-time)+ "," + iter + "," + load + "," + temp + "," + myAgent.getCurQueueSize());

                  }
              }
         });
      }
 }

この種のことに関するインターネット上の他の投稿から、生成エージェントがヒープスペースを消費していた場合に備えて、生成エージェントのメッセージキューサイズを制限しようとしました。しかし、それらのどれも違いを生むようには見えませんでした。ヒープスペースを追加しようとしましたが、メモリ不足の例外が1分ほど遅れただけでした。jade エンジンが呼び出され、netbeans を介して jade gui が開始されます。

私はマルチエージェント プログラミングと jade の使用が初めてなので、この種のシステムを実行するためのより適切で最適な方法があり、それ自体が問題を説明する可能性があることを理解できます。しかし、問題の助けをいただければ幸いです。

ありがとう、カルム

4

1 に答える 1

0

House9 エージェント内の動作には終了条件がありません。各エージェントは、動作がスケジュールされるたびにメッセージを送信します。メソッドをオーバーライドしたためdone、メッセージを送信する動作を繰り返します。

そんなにたくさんのメッセージを送るつもりですか?メッセージの間にある種の一時停止が必要ですか? エージェントはこれらすべてのメッセージを処理しようGeneratorとしますが、キューの負荷に追いつくことができません。

于 2013-01-24T11:50:19.473 に答える