Tuesday, May 18, 2021

القسم الثاني: محاكاة التلدين

عملية التلدين هي عملية تسخين المادة (مثل الحديد) لدرجة حرارة عالية ثم تبريدها بطريقة منسقة ومنظمة.  تعتمد هذا العملية على زيادة صلابة المادة خاصة إذا كان التبريد يحدث بشكل منسق وبطيء. تبريدها بشكل عشوائي او سريع قد يتسبب بتكوين مادة هشة وقابلة للانكسار.  تقوم عملية التلدين بمحاولة اكتشاف درجة الحرارة الكلية الملائمة لتبريد المادة للسيطرة على كمية الطاقة المفقودة بشكل منتظم (حيث تكون الطاقة في اعلى كمياتها عندما تكون المادة في اعلى درجات حرارتها).

 

في عملية محاكاة التلدين، يقوم البرنامج بعملية مشابهة لعملية التلدين، حيث يبدا البرنامج بحل عشوائي ويبدئ بتعديل عشوائي على الحل ثم قياسه.  يقوم البرنامج بالتقرب للحل النهائي بناء على مجموعة تكرارات للعملية (كعملية إيجاد درجة التبريد المناسب في عملية التلدين).



الحل المبدئي:

قد يبدئ البرنامج بحل مبدئي عشوائي حيث يقوم البرنامج بتحميل البرنامج في خانة الحل الحالي.  في بعض الأحيان وعندما يكون البرنامج قد مر بحل مشاكل سابقة قد يعتمد اخر حل كحل مبدئي لمشكلة جديدة.


تقييم الحل:

يقيم الحل بفك شفرته ثم القيام بالعملية المبرمجة لتحليل النتيجة للمشكلة القائمة. قد يكون الحل المشفر عبارة عن مجموعة من المتغيرات التي بدورها تستخدم لتقييم الحل لتقييم قرب حل المشكلة القائمة بعد فك تشفيرها.


تعديل عشوائي للحل:

ان كانت هناك حاجة، يقوم البرنامج بنسخ الحل في خانة ما يسمى بالحل النشط. ثم يقوم البرنامج بتعديل عشوائي للحل بناء على ما تم تشفيره.  كمثال اذا اعتبرنا خوارزمية البائع المتنقل (Traveling Salesman problem) حيث يقوم البرنامج باستبدال مدينتين بشكل عشوائي بعد نسخها في احل القائم.  بعد التعديل، يقيم الحل بناء على الخطوة السابقة


معايير القبول:

عملية معايير القبول قد تكون معقدة بعض الشيء، حيث تكون اول خطوة هي مقارنة الحلين: النشط (المعدل) والحالي.  إذا كان الحل النشط افضل (طاقته المخزنة افل من الطاقة في الحل الحالي كما هو في عملية التلدين الفعلي) نقوم بقبول الحل النشط عن طريق استبدال الحل الحالي معه.  إذا كان اسوء فلا يزال هناك احتمال لقبول الحب التي تقاس بناء على قانون الديناميكية الحرارية (Law of Thermodynamics)

ينتج عن ذلك انه كلما زادت درجة الحرارة (باستخدام مصطلحات التلدين) كلما زاد احتمال قبول الحل المعدل، او الأسو (ذات الطاقة الأعلى)، على الحل الحالي.  هذا يتيح لتوسيع دائرة الحلول المحتملة حيث انها تقل كلما اقتربنا من الحل المثالي.


تبريد درجة الحرارة:

بعد عدة تكرارات، يقوم الخوارزمية بتبريد درجة الحرارة.  عادة ما تكون هناك عمليات لخفيض عالي لدرجة الحرارة وقد تكون العملية بسيطة مثل:


حيث اننا نضرب درحجة الحرارة الحالية (i) بثابت ذات قيمة بين 0 و1 للحصول على درجة الحرارة الجديدة (i+1)   او قد تكون المعادلة أكثر تعقيدا لمحاولة السيطرة على الناتج


إعادة العملية:

قد تكون عملية التكرار متعددة على نفس درجة الحرارة وتنخفض عند الانتهاء من عدد التكرارات المحددة.  يتوقف البرنامج (او العملية) عند وصول درجة الحرارة لصفر.

Saturday, April 17, 2021

تطوير برامج الذكاء الاصطناعي: الجزء الاول


انوي في شهر رمضان المبارك ان أقوم بتغطية كتاب
“AI Application Programming” من تاليف م. تيم جونز والذي تم اصداره سنة 2003.  مع ان الكتاب قديم نوعا ما، الا انه يوفر مقدمة جيدة لتاريخ الذكاء الاصطناعي وبعض تقنياته.  يضيف الكتاب قسم جميل حيث يقوم الأستاذ جونز بشرح كيف يمكن للفرد برمجة هذه التقنيات والتي بدورها قد اخصص سلسلة جديدة من المقالات لهذا الخصوص حيث يقوم المؤلف بشرحها باستخدام لغة الC و التي اخطط لترجمتها للغة جديدة كالبايثون او الجافا او الC#.  أذا كان هناك اختلاف بين زمن اصدار الكتاب والعصر الحديث او هناك إضافة حديثة ساقوم بإضافة تعليقي وتحديد ذلك.

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

العقد الخامس من القرن العشرين: 

طور الحاسب من قبل الن تورنغ (Alan Turing) البريطاني بهدف فك شفرة جهاز الانيغما الشهير الذي استخدم من قبل الالمان لتشفير الرسائل بين عناصر جيشهم.  بعدها بثلاثة سنين و في سنة 1945 طور الدكتوران جون موتشلي (John Mauchly)  و ج ب اكارت الابن (J. P Eckart Jr.) الحاسب الالي و الذي القوا اسم كولوسس عليه بهدف القيام بحسابات قوائم لقذائف الحرب العالمية الثانية.  في نفس الفترة تم تطوير الشبكات العصبية الاصطناعية (Artificial Neural Networks) من قبل والتر بتس (walter Pitts) و وارن مكولوك (Warren McCulloch)  التي تمثلت بدوائر كهربائية و التي قام دونالد هبز (Donald Hebbs) بإضافة الوزنية لكل خلية عصبية في الشبكة في عام 1949

 العقد السادس من القرن العشرين:

 ولد الذكاء الاصطناعي في هذه الفترة حيث تم تأليف المصطلح من قبل جون مكارثي في سنة 1955 في اول مؤتمر للذكاء الاصطناعي في كلية دارتموث وقام الن تورنغ بإنشاء "اختبار تورنغ" الذي يحدد: إذا لم يستطع الفرد على التمييز بيت المكينة والانسان فقد نعتبر ان المكينة ذكية.  في هذه الفترة تم تطوير اول لغتين لبرمجة الذكاء الاصطناعي IPL  و LISP حيث استطاعت الثانية اثبات جدارتها على الاوى و استمرت كاللغة المفضلة لمطوري الذكاء الاصطناعي.  هذه الحقبة أسست لتطوير الذكاء الاصطناعي حي تأسست مدرسته وكليات لدراسته وتطويره

العقد السابع من القرن العشرين:

نهوض الذكاء الاصطناعي الذي تمثل في تأليف اول كتب انتقادية لهذا التخصص الجديد وهما كتاب "الكمبيوتر والفطرة السليمة لمورتايمر توب: اسطورة المكينة المفكرة" (Mortimer Taube’s Computers and Common Sense: The Myth of Thinking Machines) و "الكيمياء والذكاء الاصطناعي" (Alchemy and AI) والمقصود بالكيمياء هي الكيمياء القديمة التي امنت بانه يمكنك تغير المعادن الى ذهب.  إضافة الى ذلك تم تطوير الشبكات العصبية والتي في نهاية الحقبة تم تقديم انتقاد حاد لشبكة عصبية ذات طبقة واحدة.  والتي بدورها أسست لسقوط حاد في استثمارات الذكاء الاصطناعي في الحقبة التالية. 

العقد الثامن من القرن العشرين: 

التي بدورها تم عنونتها بحقبة سقوط الذكاء الاصطناعي.  هذه الفترة شهدت تقليص أي استثمار كان يصب في الذكاء الاصطناعي وذلك كان نتيجة لكية التأملات المترقبة لهذا التخصص وضعف نتائج ما تم تطويره وقلت التطبيقات الواقعية لهذا المجال.  لكن، ز مع قلة النتائج، تم تطوير لغة الProlog  التي بدورها تفوقت على LISP خارج الولايات المتحدة الامريكية.  إضافة الى ذلك تم تأسيس تقنية المنطق الضبابي (fuzzy logic)، والذي بدوره تم تطبيقه على مكائن التي تعمل بالبخار

العقد التاسع من القرن العشرين:

تنطلق تقنيات الذكاء والاصطناعي في هذه الحقبة ويتم اخمادها من جديد حيث بدا هذا العقد مبيعات كثيفة لأجهزة الذكاء الاصطناعي وانظمته والتي تشكلت بالأنظمة الخبيرة (Expert Systems).  وفرت هذه الأنظمة وعدا جديد للذكاء الاصطناعي حيث وجدت له تطبيقات في الصيانة والاستشارة.  كذلك الشبكات العصبية شهدت نهوض جديد في هذه الفترة حيث تم اعتمادها في تطبيقات التعرف على الصوت.  سبب هبوط هذه الفترة كان متعلقا بفشل الأنظمة الخبيرة التي كانت تعتمد على العناية بالأسالة التي قد تتعقد بناء على عددها والتي لم تتطور كثيرا

العقد العاشر من القرن العشرين:

 النمو البطيىء للذكاء الاصطناعي.  هذه الفترة التي شهدت تطوير تطبيقات أكثر فعالية كأنظمة التعرف على الوجوه وكشف احتيالات بطاقات الائتمانية وأنظمة التخصيص وانظمة تقدير التوظيف ودخل المؤسسات.  من اهم ما نتج في هذه الفترة كان انتصار برنامج ذكي: ديب بلو، على بطل الشطرنج غاري كاسبروف وتحليق المركبة الفضائية ديب سبايس 1 بشكل تلقائي

اود ان اضيف حقبة جديدة وهي حقبة العقد الثاني من القرن الواحد وعشرين التي بدورها لقت تفجرا في تقنيات الذكاء الاصطناعي الذي اعتمدت على انتشار الهاتف النقال و الذي بدوره ساهم في ان تصبح هذه التقنية  في متناول الجميع و دجعلها تقنية موجودة في تطبيقات هدفها التسلية أكثر من التخصص.  إضافة الى ذلك تم انتشار الأجهزة الذكية التي بدورها تعمل على تجميع كميات كبيرة من البيانات والتي  ساهمت في تطوير تقنيات تنقيب البيانات (Data Mining).  هذه نفس التقنيات التي اعتمدت بعد ان أدرك الكثير من الشركات انها تستطيع الاستفادة من كمية البيانات التي كانت تجمعها منذ تبنيها لأنظمة الحاسب الالي لإدارة اعمالها والتي بدورها تستطيع استخدامها لتحسين وسائل اتخاذ القرار وتقدير المستقبل.

Sunday, November 5, 2017

بعض ادوات تطوير البرامج المجانية

 يمكنك الاستفادة من مجموعة ادوات مجانية في تصميم البرامج و الالعاب:
  1. لتصاميم ثلاثية الابعاد نزل برنامج Blender.  لمعرفة كيفية الاستخدام يمكنك مراجعة قسم الدعم او Support الذي يوفر الدليل الكامل للاستخدام.  Blender بديل ممتاز ل3D Studio Max و لكنه مبني على اساس الOpen Source.
  2. Unity الذي يمكنك من تصميم العاب الكمبيوتر و الجوال.  النسخة المجانية من البرنامج تعطيك الصلاحية في التعلم على الاستخدامو اذا اردت ان تنشر برامجك فذلك يتطلب اشتراك شهري بقيمة 35$.  تصميم اللعبة يتطلب لكتابة بعض نصوص البرمجة باستخدام لغة ال#C و بذلك قد يكون من المفيد ان تتعلم مبادئ اللغة قبل البدء بتصميم العابك.
  3. Visual Studio برنامج يوفر لك بيئة كاملة لبرمجة برامجك من الصفر.  توفر لك البيئة الامكانية في بدء برامجك بناء على قالب مبدئي (مثلا قالب خاص لتصميم المواقع و اخر لتصميم برامج الWindows). اضافة الى ذلك فات البيئة تسمح لك باضافة الكثير من الاضافات التي قد تسهل او تساعد على تصميم البرامج و التي يمكنك تنزيلها بناء على الحاجة.  أللغات الاساسية المتوفرة في Visual Studio هي #C و Visual Basic و ASPX و يمكنك اضافة ++C و Python و غيرها من اللغات
  4. Eclipse بيئة متكاملة لبرمجة جميع أنواع تطبيقات الJava و الذي تبدأ من برامج بسيطة الى أنظمة متكاملة (Enterprise Application)
  5. Netbeans يشبه Eclipse و لكنه اشتهر بتطوير برمجيات الجوالات البدائية (قبل الهواتف الذكية).  أن كان استخدام Eclipse صعبا قليلا حيث يستهدف المطور المتقدم بعض الشيء فان استخدام Netbeans ابسط و اسهل في تعلم لغة الJava.

Monday, September 4, 2017

Tutorial: Building Your First Drone

Developing Your First Robot

Scope

Develop a remote-controlled Drone with a camera feed. Requirement sparks from the need to investigate in small tight places. This is to help inspect specific environments that might prove difficult to reach without causing break and tear. Control is meant to be conducted through a laptop, mobile or tablet.

Requirements

Tools

  • Small flathead screwdriver (small electric testing screw driver will do the trick)
  • Glue Gun

Drone

  • Raspberry PI running the Raspbian OS (Follow NOOBs tutorial for setup [1])
  • Mobile Battery Pack
  • 2-Wheel chassis (will be used for prototype purpose but can be switched based on application)
  • L298N board (for a 2 DC motor chassis, might be required to swap out if chassis is changed)
  • USB WiFi adapter
  • Raspberry PI camera (using 5MP standard camera, can be changed in the event of application change)
  • LED (using a 3 color LED)
  • 9v Battery (connector might be useful but unnecessary)
  • Relevant jumper cables to connect it all together
  • 5V Battery Pack (To power the Raspberry PI, if Possible identify one with a 2mA current as it will affect the performance of the PI)

Client

Assembel It

  1. Connect the camera to its designated location on the raspberry pi
  2. LED has 4 connectors, Left to Right:
    1. Red
    2. Green
    3. Blue
    4. Ground
    using 4 female-to-female jumper cable, connect the 4 pins of the LED to the following pins in the same order as above, 3, 5, 7, 9 (where 9 is for ground)
  3. Connect the L298N board: the L298N board is split into 4 sections:
  4. Section on the left to control the left wheel, using 2 male-to-male jumper cable, connect the top slot on the L298N to the positive slot of the left DC wheel (on the chassis) and the bottom slot to the negative slot of the left DC wheel.
  5. Section on the right to control the right wheel, using 2 male-to-male jumper cable, connect the top slot on the L298N to the positive slot of the right DC wheel (on the chassis) and the bottom slot to the negative slot of the right DC wheel.
  6. On the top left slot, there are 4 pins that should be connected to the raspberry pi. The two on the left will control the left wheel, and the 2 on the right will control the right wheel. From Left to Right, connect the Pins in the following order 35, 37, 36, 38.
  7. On the top right side of the L298N board, there are three slot:
    1. using a male-to-male jumper cable, connect the right slot to the positive side of the 9V battery
    2. Using to jumper cables, connect the middle slot to the negative side of the 9V battery using a male-to-male jumper cable and to pin 39 using a male-to-female jumper cable
    3. leave the right left slot empty (you can potentially connect it to Pin 2 of the Raspberry PI but concern is that it will not be capable of providing the PI with a steady current which in turn will impact the stability of the PI.
  8. Connect the USB WiFi adapter to one of the USB slots on the raspberry PI
  9. Using a glue gun, fix everything in place to ensure it stays in place. ensure to fix the camera and the LED in place.

Configuring the Raspberry PI

  1. Run 'sudo apt-get update' and once completes, 'sudo apt-get upgrade' to ensure all dependencies have been applied
  2. using 'sudo apt-get install xxx' to install the following components where 'xxx' will be replaced by the component name:
    • 'hostapd' to enable the raspberry pi to act like a WiFi hotspot
    • 'dhcpd' to allow the pi to issue IP addresses for connectivity
    • 'oracle-java8-jdk' to get the latest Java Development Kit (can be replaced with ‘java’ in case of applying the solution)
    • 'vncserver' to enable remote desktop to Raspberry PI (Useful to run NetBeans, if using command line compiling, unneccesary)
  3. Install RPI Webcam (based on reference3)
  4. setup 'hostapd' and 'dhcpd' based on reference 2
  5. Download the latest "Netbeans" from 'http://http://netbeans.org/' and extract it. it might be useful to create a shortcut on the desktop.

Client

Configurations

  1. Install Visual Studio. Ensure to select Windows Desktop, .NET Framework 4.5 (or the latest) and Web components
  2. Connect to the Raspberry PI WiFi network you setup, I am using the SID "Drone"
  3. using putty, connect to the raspberry PI and ensure connectivity (I am using IP '192.168.15.1')
  4. Run 'vncserver :1' to enable X-Terminal
  5. using VNC client, connect to the PIs X Terminal using '192.168.15.1:1'
  6. Now you can directly configure the PI through the GUI interface or the Command Prompt as required.

Connection

Connection to the Drone will be connected through WiFi as it:
  • Helps with the distance that can be covered in contrast to bluetooth and infrared,
  • In addition, with WiFi, we can configure a Wireless LAN that is hosted from the PI which would simplify the development of a TCP/IP application,
  • Tutorials are readily available
  • Both Java and .NET cover it as part of their standard Framework.
  • Messages can be passed between client and server in ASCII format

Implementation

Writing the Raspberry PI code (Server)

Start

Setup TCP Listener
 Listen: Establish Connection
 Case to received command
  Light: Toggle Light 'On' or 'Off'
  Forward: Move Forward by setting pins 35 and 36 to true for 0.5 Secs
  Backward: Move Backward by Setting pins 37 and 38 to true for 0.25 Secs
  Left: In-Spot turn Left by switching pins 35 and 38 to true for 0.10 secs
  Right: In-Spot turn Right by switching pins 36 and 37 to true for 0.10 secs
  Default: Do nothing
 Terminate Connection
 Goto Listen

End

Writing the Client Code

Start

MainFrame: Execute Command
 Connect to Server on Listening Port
 Case to selected command
  Light: Send Light Command to Server
  Forward: Send Move Forward to Server
  Backward: Send Move Backward to Server
  Left: Send Turn Left to Server
  Right: Send Turn Right to Server
  Default: Do nothing
 Terminate Connection
 Goto MainFrame

End

Camera Feed

On Server: Modify main page of web page on PI to only display the webcam picture (continuously refreshed picture). This can be identified by going through the PHP page as downloaded by the RPI webcam solution and clearing everything that is not related to the <div> for the camera shot. Your new PHP file should be reduced to fit in a page or slightly over.
On Client: Using a web control, point the URI to the webcam page on the PI (can test URI using any browser)

Close

After Closure, what was developed was a base product of a remote controlled drone with a camera feed. The idea is to be able to investigate locations that are difficult to reach. Based on the applications (highlighted below), the drone can be customized further to be built for a specific need. The above details the implementation which covers details of the development of the base product. A good step forward might be to try to deploy it as a live solution and omitting out all development steps.

References:

  1. Installing Raspbian with NOOBS (19-Dec-2016)
  2. Setting Up a Raspberry Pi as a WiFi Access Point (19-Dec-2016)
  3. RPI-Webcam-Interface (24-Nov-2016)