並列プログラミング用のマルチエージェントシステム(Java、C ++)

エージェントベースのプログラミング









大学での論文のテーマは、「知識ベースを処理するためのマルチエージェントシステム」でした。 マルチエージェントのJadeシステムをProtegeナレッジベースに接続するのは簡単で、卒業証書の準備ができています。 これで、抽象的な学習タスク、エージェントの群れなどをシミュレートできます。 しかし、疑問が生じ、実際に取得した知識をどのように適用するのでしょうか? 「スマートホーム」システムで作業しているときに、研究開発を完了する機会が見つかりました。 「スマートホーム」からサードパーティのWebインターフェイス開発者にデータを転送するには、小さなマルチスレッドアプリケーションが必要でした。 エージェントベースのプログラミングを適用する絶好の機会です。 その結果、並列プログラミング用のマルチエージェントシステムが正常に作成されました。







マルチエージェントシステムの主要クラス(Java)





理解を深めるために、主なアイデアは次のように定式化できます。システムのメンタルモデルは、フローで動作するエージェントです。



クラスエージェント





ところで、AbstractAgentからエージェントを継承させることができます。



 import java.lang.reflect.Method; import java.util.HashMap; import java.util.concurrent.ConcurrentLinkedQueue; //    public class Agent extends AbstractAgent{ Agent () {codeName = "DefaultAgent";} //  public MissionDetails missionDetails; //  public AgentReport agentReport; //  public ConcurrentLinkedQueue<AgentMessage> messages = new ConcurrentLinkedQueue<>(); @Override public AgentMessage ReadMessage() {return messages.poll();}; @Override public void AddMessage(AgentMessage message) {messages.offer(message);}; //      ... public HashMap<String, Method> agentMethods = new HashMap<> (); //   Replicator tools = new Replicator(); }
      
      











代理店クラス





これはエージェントのディレクトリです。 さらに、ストリームの一般データをここに保存できます。



 import java.util.concurrent.ConcurrentHashMap; //       (     ) public class Agency { String agencyName = "defaultAgencyName"; //  public ConcurrentHashMap<String, AbstractAgent> agentReference = new ConcurrentHashMap<> (); }
      
      











クラスAgentThread





このスレッドクラスでは、スクリプトが実行され、その中でエージェントが動作します。 異なるスレッドで動作する場合でも、互いに通信できます。 同様のソリューションがMPIを提供します。 ところで、1つのスレッドで、複数のエージェントを一度に送信することができます。



 import java.lang.reflect.InvocationTargetException; import java.util.concurrent.LinkedBlockingQueue; import java.util.logging.Level; import java.util.logging.Logger; //   :      public class AgentThread extends AbstractAgentThread { //  public LinkedBlockingQueue<MissionCard> missionCards = new LinkedBlockingQueue<>(); @Override public void run() { MissionCard missionCard = null; Scenarios scenario = new Scenarios(); Agent agent = null; Agency agency = null; while (true) { try { sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(AgentThread.class.getName()).log(Level.SEVERE, null, ex); } System.out.println(" ."); missionCard = missionCards.poll(); if (missionCard != null) { agent = (Agent) missionCard.agent; agency = missionCard.agency; //  try { missionCard.mission.invoke(scenario, agent, agency); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { Logger.getLogger(AgentThread.class.getName()).log(Level.SEVERE, null, ex); } } //  if (agent.missionDetails.details.equals("kill")) {System.out.println("Thread "+ this.threadName + " killed"); break;} } } //     @Override public void AddMissionCardTask(MissionCard missionCard) { try { missionCards.put(missionCard); } catch (InterruptedException ex) { Logger.getLogger(AgentThread.class.getName()).log(Level.SEVERE, null, ex); } } }
      
      











システムソースコード





記事の最後にあるリンクを使用すると、システムのソースコードを取得できます。 コード自体はフレームワーク(FrameWork)であり、独自のエージェントを作成して新しいスレッドを設計することで拡張できます。 スレッド制御のために、AgentThreadPool.javaクラスが実装されています。 Javaシステムのロックフリーデータ構造が使用されます。 C ++フレームワークの場合、ロックフリー構造を挿入できます。 システムのテストケースもあります。 私の経験では、サードパーティのコードを使用すると便利だと思います。 スクリプトにロードしてストリームに送信すると、サードパーティのコードが実行されると、エージェントが独自の調整を行います。 そのため、たとえば、TCP / IPサーバーを実装できます。 並列プログラムをダウンロードして記述し、プロデューサーとコンシューマーのテンプレートのプロクラステンベッドを忘れてください。



ソーシャルインテリジェンスのソースコード。



All Articles