الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ال Communication بين عملاء ال Jade

بدأه djug في 11 أغسطس 2009 · 11 رد · 2,371 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بعد أن رأينا كيف ننشئ عملاء JADE و كيف نحدد المهام التي يقومون بها، لا يمكننا الحديث عن نظام متعدد العملاء multi agent system و ليس عن مجموعة عملاء يغرد كل في سربه إلا إذا كانت هناك تواصل و محادثة communication بين العملاء،

هذا المقال يقدم شرحا عن كيفية التواصل بين العملاء و كيفية بناء محادثات بينهم.

1. مقدمة:

لكي يستطيع عملاء JADE التعاون على أمر ما لا بد لهم من وسائل للتواصل بينهم، يملك كل عميل JADE صندوق بريدي يستقبل الرسائل المرسلة إليه، تكون هذه الرسائل في قائمة مرتبة حسب زمن وصولها.

2. تركيبة رسالة JADE

يستعمل عملاء JADE رسائل متوافقة مع معايير FIPA ACL (FIPA agent communication language) . هذه الرسائل عبارة عن instance من الصنف ACLMessage الموجود في الـ package المسمى jade.lang.acl .

تتكون رسائل JADE من التالي:

- مرسل الرسالة: يتم ملء هذه الخانة بطريقة آلية لدى إرسال الرسالة.

- مجموعة المستقبلين: يمكن إرسال نفس الرسالة إلى أكثر من عميل في آن واحد.

- communicative act : يمثل هدف العميل من إرسال الرسالة كإخبار العميل المستقبل بأمر ما، أو عمل call for proposal أو إرسال إجابة عن طلب ما ...

- محتوى الرسالة.

- إضافة إلى مجموعة من الخانات الأخرى مثل اللغة المستعملة في كتابة محتوى الرسالة، الـ timOut ،...

3. إرسال رسالة:

ليقوم عميل JADE بإرسال رسالة ما كل ما عليه هو ملء خانات رسالة JADE و من ثم استدعاء الدالة send الخاصة بالصنف Agent

المثال التالي يوضح كيفية إرسال رسالة إلى العميل المسمى said و يكون محتوى الرسالة ...salam :

  1.  
  2. ACLMessage message = new ACLMessage(ACLMessage.INFORM);
  3. message.addReceiver(new AID("said", AID.ISLOCALNAME));
  4. message.setContent("salam…");
  5. send(message);
  6.  
  7.  

4. استقبال رسالة:

استقبال رسالة سهل مثل سهولة إرسال رسالة، بل أكثر من ذلك، فقط يكفي استدعاء الدالة receive() الخاصة بالصنف Agent

و ذلك كالتالي:

  1.  
  2. ACLMessage messageRecu = receive();
  3.  
  4.  

أحيانا نحتاج إلى الرد على صاحب الرسالة، يمكن معرفة هوية المرسل باستعمال الدالة getSender() الخاصة بالصنف ACLMessage كالتالي:

  1.  
  2. ACLMessage message = new ACLMessage(ACLMessage.INFORM);
  3. message.addReceiver(messageRecu.getSender());
  4. message.setContent("the response");
  5. send(message);
  6.  
  7.  

5. انتظار وصول رسالة:

في بعض الأحيان ، يمكن لعميل ما أن يقوم بتنفيذ مهمة معينة، لكن زمن تنفيذ المهمة مرتبط بزمن استقبال رسالة من agent معين.

من الممكن جدا جعل العميل ينتظر الرسالة بالطريقة التالية

  1.  
  2. ACLMessage message =null ;
  3. While (message == null){
  4. Message = receive() ;
  5. }
  6. //المهمة الواجب القيام بها
  7.  
  8.  

لكن كما تلاحظون فإن هذا النوع من الانتظار يستهلك موارد كثيرة بحكم أن العميل ليس متوقفا كلية عن العمل و إنما "يقوم بالانتظار"

يوفر الصنف Behaviour دالة تسمح بإيقاف الـ behaviour إلى غاية استقبال رسالة

الدالة هي block() حيث أنه بمجرد استدعائها فإن الـ behaviour الحالي يتوقف و لا يكمل تنفيذه إلا بعد استقبال رسالة

  1.  
  2. Message = receive() ;
  3. If (message == null) block();
  4. //المهمة الواجب القيام بها
  5.  
  6.  

تجب الإشارة هنا إلى أنه في حالة استقبال رسالة فإن كل الـ behaviours الخاصة بالـعميل و التي كانت متوقفة تواصل نشاطها

6. اختيار رسالة من صندوق البريد:

عندما يقوم العميل بالتواصل مع أكثر من عميل جملة واحدة، فإنه قد يحتاج في وقت معين ألا يستقبل إلا الرسائل القادمة من عميل معين أو التي تحقق شرطا معينا،

من أجل ذلك يقوم العميل بتعريف pattern للرسائل التي يود قراءتها و ذلك كالتالي:

  1.  
  2. MessageTemplate template = MessageTemplate.MatchPerformative(ACLMessage.INFORM);
  3.  
  4. ACLMessage msg = myAgent.receive(template);
  5.  
  6.  
  7.  

7. مثال:

المثال التالي يوضح كيفية التواصل بين عميلين AgentA وAgentB

يقوم العميل AgentA بتوليد أرقام عشوائية و من ثم يرسلها إلى العميل AgentB

العميل AgentB يقوم بجمع هذه الأعداد

إذا لم يتجاوز المجموع حدا معينا (50) فإن العميل AgentB يخبر العميل AgentA بإنه لا يزال في إمكانه استقبال المزيد،

في حال ما إذا تجاوز المجموع 50 فإن العميل AgentB يرسل رسالة للـ AgentA ليوقف إرسال الرسائل و ينهي العميلان تنفيذهما.

كود العميل AgentA:

  1.  
  2. import jade.core.AID;
  3. import jade.core.Agent;
  4. import jade.core.behaviours.FSMBehaviour;
  5. import jade.core.behaviours.OneShotBehaviour;
  6. import jade.lang.acl.ACLMessage;
  7.  
  8.  
  9. public class AgentA extends Agent {
  10.  
  11.  
  12. protected void setup(){
  13.  
  14. System.out.println("---------------------------------------");
  15. System.out.println("----------------agent A----------------");
  16. System.out.println("---------------------------------------");
  17.  
  18. FSMBehaviour agentA_beh= new FSMBehaviour();
  19.  
  20. agentA_beh.registerFirstState(new waitingAgentB(), "waitingAgentB");
  21. agentA_beh.registerState(new SendingNumber(), "SendingNumber");
  22. agentA_beh.registerLastState(new end(), "end");
  23.  
  24. agentA_beh.registerDefaultTransition("waitingAgentB", "SendingNumber");
  25. agentA_beh.registerTransition("SendingNumber", "waitingAgentB",0);
  26. agentA_beh.registerTransition("SendingNumber", "end", 1);
  27.  
  28. addBehaviour(agentA_beh);
  29.  
  30.  
  31. }
  32.  
  33.  
  34.  
  35.  
  36. private class waitingAgentB extends OneShotBehaviour{
  37.  
  38. @Override
  39. public void action() {
  40.  
  41.  
  42. System.out.println("Waiting for AgentB");
  43. block();
  44. }
  45.  
  46. }
  47.  
  48. /*****************************************************************/
  49. private class SendingNumber extends OneShotBehaviour{
  50.  
  51. int valeurRetour = 0;
  52. @Override
  53. public void action() {
  54.  
  55. ACLMessage messageRecu = receive();
  56. if (messageRecu.getContent().equalsIgnoreCase("ready") ) valeurRetour=0;
  57. else valeurRetour=1;
  58.  
  59. int chiffre = (int)(Math.random()*10);
  60. System.out.println("sending ... "+ chiffre);
  61. ACLMessage message = new ACLMessage(ACLMessage.INFORM);
  62. message.addReceiver(messageRecu.getSender());
  63. message.setContent(chiffre+"");
  64. send(message);
  65.  
  66. }
  67.  
  68.  
  69.  
  70.  
  71. public int onEnd(){
  72. return valeurRetour;
  73.  
  74. }
  75.  
  76. }
  77.  
  78. /*****************************************************************/
  79. private class end extends OneShotBehaviour{
  80.  
  81. @Override
  82. public void action() {
  83.  
  84. System.out.println("shutdonw agent");
  85. myAgent.doDelete();
  86.  
  87.  
  88.  
  89. }
  90.  
  91. }
  92.  
  93. }
  94.  
  95.  
  96.  

كود العميل AgentB

  1.  
  2. import java.security.acl.Acl;
  3.  
  4.  
  5. import jade.core.AID;
  6. import jade.core.Agent;
  7. import jade.core.behaviours.FSMBehaviour;
  8. import jade.core.behaviours.OneShotBehaviour;
  9. import jade.lang.acl.ACLMessage;
  10.  
  11. public class AgentB extends Agent {
  12.  
  13. int total = 0;
  14. boolean stop = false;
  15. protected void setup(){
  16.  
  17.  
  18. System.out.println("----------------agent B----------------");
  19. FSMBehaviour agentB_beh= new FSMBehaviour();
  20.  
  21. agentB_beh.registerFirstState(new Waiting for number(), "Waiting for number");
  22. agentB_beh.registerState(new Display(), "Display");
  23. agentB_beh.registerState(new end(), "end");
  24.  
  25.  
  26.  
  27.  
  28. agentB_beh.registerTransition("Waiting for number", "Display",0);
  29.  
  30. agentB_beh.registerTransition("Waiting for number", "end",1);
  31.  
  32. agentB_beh.registerDefaultTransition("Display", "Waiting for number");
  33.  
  34.  
  35.  
  36. addBehaviour(agentB_beh);
  37.  
  38.  
  39. }
  40.  
  41. private class Waiting for number extends OneShotBehaviour{
  42.  
  43. int valeurRetour = 0;
  44. public void action() {
  45.  
  46. ACLMessage message = new ACLMessage(ACLMessage.INFORM);
  47. message.addReceiver(new AID("AgentA", AID.ISLOCALNAME));
  48.  
  49.  
  50. if(!stop){
  51. message.setContent("ready");
  52. send(message);
  53. valeurRetour=0;
  54. block();
  55.  
  56. }else{
  57. message.setContent("done");
  58. send(message);
  59. valeurRetour=1;
  60.  
  61. }
  62.  
  63.  
  64. }
  65.  
  66. public int onEnd(){
  67.  
  68. return valeurRetour;
  69. }
  70.  
  71. }
  72.  
  73. /**********************************************************************/
  74.  
  75.  
  76. private class Display extends OneShotBehaviour{
  77.  
  78. @Override
  79. public void action() {
  80.  
  81.  
  82. ACLMessage messageRecu = receive();
  83. total+= Integer.parseInt(messageRecu.getContent());
  84. System.out.println("number received= "+ messageRecu.getContent());
  85. System.out.println(" total = "+total);
  86.  
  87.  
  88. if (total > 50) stop = true;
  89. }
  90.  
  91. }
  92. /**********************************************************************/
  93.  
  94. private class end extends OneShotBehaviour{
  95.  
  96. @Override
  97. public void action() {
  98.  
  99.  
  100. System.out.println("shutdonw agent");
  101. myAgent.doDelete();
  102. }
  103.  
  104. }
  105.  
  106. }
  107.  
  108.  
  109.  
  110.  

تم تعديل هذه المشاركة بواسطة djug في 12 أغسطس 2009 في 00:05

#2

السلام عليكــم ورحمـة الله وبركاتــه ،،

Djugإني أتنفس تحت الماء، ... :)

لم أفهم الجدوى من هذه التقنية و يا حبذى لو توضح لن إستخداماتها و لو بتمهيد بسيط يأطر القارء.

#3

كما فهمت المثال من وجهة نظرى

لدى احد العملاء فى تطبيقى يقوم باستخراج اكثر العملاء استخداماً لخدمة ال SMS و يحتاج احد العملاء فى تطبيق للمبيعات على سيرفر بعيد لاسماء اكثر العملاء استخداماً لخدمة ال SMS ليقوم بارسال عروض الشركة الخاصة لهم

يقوم برنامجى بارسال Queue يحتوى على عدد معين من ال Objects فى المرة الواحدة لكى يقوم البرنامج الاخر بالتعامل معهم و اذا زاد هذا الحد فان العميل الثانى سيقوم باخبار عميلى ان يتوقف عن ارسال اى بيانات للعملاء له الان

تم تعديل هذه المشاركة بواسطة طارق إبراهيم في 11 أغسطس 2009 في 23:03

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#4

@بن العيد:

يمكن تعريف العميل على أنه كائن برمجي أو robot أو إنسان مخول بالقيام بعمل ما ضمن مجتمع من العملاء للوصول إلى هدف ما

يمكن أن يكون العميل من النوع الذي يقوم بعمل ما بعد أن يتلقى طلبا أو بعد أن يحدث طارئ في المجتمع الذي فيه

و قد يكون من النوع الذي له استقلالية نسبية و يتمتع بذكاء اصطناعي يخول له اتخاذ قرارات لم تكن مبرمجة سلفا

أضرب لك مثالا عن نظام يمكن بناؤه وفق الـ Multi agent system

لنفرض أن هناك سربا من الطائرات التي تحوم حول منطقة ما لنقل البضائع ، يتم قيادة هذه الطائرات آليا، و لتجنب أي اصطدام بينها نضع عميلا في كل طائرة يستطيع أن يتواصل مع العملاء على الطائرات الأخرى و يستطيعون بناء استراتيجية يسيرون وفقها لتجنب التصادمات دون أن يقوم المبرمج ببناء هذه الاستراتيجية و إنما يحدد فقط بعض الأسس كمسافة الأمان و السرعة القصوى و الدنيا ...

يمكنك معرفة المزيد على Multi agent system :

http://fr.wikipedia.org/wiki/Syst%C3%A8me_multi-agents

http://en.wikipedia.org/wiki/Multi-agent_system

لقد أضفت رابطي المقالين الأولين عن الـ JADE في مقدمة الموضوع

@طارق إبراهيم: لم أفهم مثالك جيدا لكن الظاهر أنه يمكن برمجته باستعمال العملاء

بأي منصة تبرمج العملاء أخي طارق؟

تم تعديل هذه المشاركة بواسطة djug في 12 أغسطس 2009 في 00:06

#5

السلام عليكم.

اعتقد أن هذا النظام "system multi agents" يعتمد على client/server architector

و هذا يعني أن العملاء تنتقل من جهاز لآخر لانجاز عمل ما.

ففي المثال أعلاه Agent A+Agent B هل يصلح عملهما ان كان كل عميل في جهاز أو البرنامج مقتصر على جهاز واحد فقط.

#6

بالطبع يمكن أن يكون كل عميل على جهاز

كما يمكن أن تتم المحادثات عن بعد (كل عميل في جهاز)، أو أن ينتقل أحد العملاء إلى جهاز العميل الآخر ليتواصل معه على نفس الجهاز ثم يعود إلى جهازه الأول

#7

من خلال قراءه سريعه للدروس أحسست أن Jade هذا فيه Implementation للـ Workflow بالاضافه إلى وظيفته الأساسيه كـ Messaging Solution كما في WF & WCF في NET 3.x.

جزاك الله خيراً أخي djug :)

#8

أخي حازم :

مختبرات إيطاليا تيليكوم (صاحبة مشروع JADE) لها مشروع آخر خاص بالـ workflow مبني على الـ JADE

المشروع يسمى WADE

للمزيد من المعلومات عليه:

http://jade.tilab.com/wade/index.html

#9

مفهوم workflaw

مفهوم قديم جداً وتم تعديله إلى business process management

مالم تكونوا تدفق البيانات في الشبكة أو ما شابه

بالمناسبة ماهو الترخيص الخاص بجاد؟

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#10

ترخيص الـ JADE هو LGPL

اقتباس
JADE is free software and is distributed by Telecom Italia, the copyright holder, in open source software under the terms of the LGPL ( Lesser General Public License Version 2).
#11

السلام عليكم و رحمة الله وبركاته

طيب ماذا لو اردت ارسال اربع متغيرات للايجنت الاخر بدلا من متغير واحد ماذا افعل

#12

هل يمكنكم مساعدتي في ايجاد دروس او مقالات مصورة

لكيفية استخدام agent mobile

لاني لم اجد شيا واضحا

او اقل شيء كيف افعل الماشين ( الالة للتستقبل ) لان اثناء الارسال تضهر رسالة لايوجد او انه لايدعم

مواضيع مشابهة