لدي فكرة مجنونة ، من موقع SourceForge

Wednesday, August 13, 2008 | Labels: | 0 comments |

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

فكرة وجدتها وانا اتصفح موقع الفريق العربي للبرمجة . الفكرة مطروحة ايضاً على موقع sourceforge بالاساس وسأحاول ان اوضحها للجميع هنا .

لنفترض ان لدينا صورة 4*4 بيكسل ، نريد ان نجرب فيها كل الاحتمالات بلونين فقط هما الابيض والاسود ، هل تعرف كم صورة سيكون الناتج ؟
الناتج سيكون 2 مرفوعة للاس 4*4 وهو ما يعني 2 مرفوعة للاس 16 وتساوي 65536 .
حيث ستجد اولاً البكسل الاول اسود والباقي ابيض ، ثم الثاني ، ثم الثالث ، ثم الاول والثاني ، ثم الاول والثالث .... الخ .

الآن سنفترض اننا نريد عمل صورة ملونة 16 مليون لون بحجم 640*480 ، هل تعرف كم الصور الناتجة ؟
طبعاً ، الناتج هو 16000000 مرفوع للاس 307200 ، وهو رقم كبير جداً ، يكفي ان تعلم ان 16 مليون مرفوعة للاس 2 ستحتوي على الاقل على ضعف عدد الاصفار اي 12 صفر ، للاس 3 سيصبح 24 صفر ، الاس الرابع سيصبح 48 اس ، بمعنى انه لن يزيد 6 اصفار في المرة بل ستتضاعف ، لذا لك ان تتخيل الرقم عند الاس الالف ومن ثم الرقم مرفوعاً للاس 307 آلاف ، ان حساب الرقم الناتج هو في حد ذاته مشكلة فما بالك بالحصول على الصور نفسها .
لكن هل تتخيل على ماذا ستحتوي هذه الصور ، بالواقع ستحتوي على كل الاحتمالات التي يمكن لكاميرا ما ان تلتقطها ، وهي بالتالي تحتوي على :

- صور جميع البشر سواء البشر الذين ولدوا او سيولدوا او الموجودين حالياً .
- جميع الكائنات الحية المكتشفة او التي لم تكتشف بعد .
- صور جميع الاختراعات ووسائل المواصلات التي اخترعت او ستخترع .
- صور جميع الكلمات المكتوبة ، هنا ستجد ايضاً افضل قصيدة قيلت او ستقال لإن القصيدة او بيت الشعر هو شيء يمكن تصويره .
- ستجد ايضاً الحل لكل المسائل الفيزيائية والهندسية والكيميائية ، حيث ان هذه الحلول هي صور ايضاً .
- ستجد ايضاً صور لجميع الدوائر الكهربية او الالكترونية الموجودة او تلك التي ستوجد .

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

لذا سنختم ببعض النقاط :

- اغلب هذه الصور غير ذا جدى في الواقع ، حيث انك ستجد صورة تحتوي على نقطة واحدة فقط من لون ، وهكذا لمدة 16 مليون صورة ، ثم تحتوي على نقطتين ثم على ثلاث ، ستجد رقماً مهولاً من الصور بهذه الطريقة .
- نحتاج إلى الجوريزم لاستبعاد الصور غير المهمة ، ولكن هذا الالجوريزم لا بد ان يكون ذكياً ، ربما الصورة غير مهمة حالياً ولكنها شيء لم نكتشفه بعد !
- ستجد لنفسك فقط عدة مليارات من الصور إن لم تكن اكثر ، خد صورتك وحول لون احد شعر رأسك للأحمر ثم للاخضر وهكذا لمدة 16 مليون لون ، ثم انتقل للشعرة التالية ، ثم للشعرة الاولى مع الثانية ... وهكذا ، ثم حرك راسك بمقدار بيكسل واعد الحسابات ، هذا لو سلمنا ان الشعرة بيكسل فما بالك لو كانت الشعرة تحتوي على اكثر من بيكسل ، هنا سنجد مقدراً مهولاً من التكرارات ، ثم نفس الامر مع صورة زميلك ثم مع تغيير الخلفية لتحتوي على تلفزيون بدلاً من مكتب ، ثم مكتب ببيكسل احمر في المنتصف ... الخ .

النص التالي منقول من موقع الفريق العربي للبرمجة لشرح فقط فكرة تكوين الصور وعدد الاحتمالات - مهندس أسامة - :

http://www.arabteam2000-forum.com/index.php?showtopic=155674&st=20&p=782920&#entry782920

لو فرضنا أنك تريد أن تحسب الأحتمالات لصورة مكونة من لونين فقط، وحجمها هو 3 × 1 بيكسل، فيكون عدد الاحتمالات = عدد الألوان (2) مرفوع للأس (3) (حجم الصوره)= 2 أس (3×1) = 8 صور

الصورة المرفقة

وبالتالى: لو تريد أن تحسب الأحتمالات لصورة مكونة من لونين فقط، وحجمها هو 3 × 2 بيكسل، فيكون عدد الاحتمالات = عدد الألوان (2) مرفوع للأس (6) (حجم الصوره)= 2 أس (3×2) = 64 صور = (2 أس 3) أس 2

الصورة المرفقة

إذن: تريد أن تحسب الأحتمالات لصورة مكونة من 256 لون، وحجمها هو 640 × 480 بيكسل، فيكون عدد الاحتمالات = عدد الألوان (256) مرفوع للأس (307200) (حجم الصوره)= 256 أس (640×480) = (256 أس 640) أس 480

الصورة المرفقة

أحسب الناتج، ولنفترض أن زمن تكوين الصوره يساوى 1 من مليون من الثانية (جدلاً)، فما الوقت الازم لتكوين جميع الاحتمالات؟؟؟

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ولحساب زمن تقريبي لتنفيذ هذه العملية ، هذا ايضاً من موقع الفريق العربي  للمهندس اسامة ايضاً :

 

هل حاولت حساب الوقت المستغرق لهذه العملية ؟ (عدد الأحتمالات تقريباً يساوى (10 أس 737280)، أى واحد وامامه 737280 صفر)

الصورة المرفقة

نفترض جدلاً ان لديك نظام يستطيع تكوين ألف مليار صورة فى الثانية، أى: 1.000.000.000.000، وهو تقريباً يساوى

أى عدد الثوانى التى تحتاجها لجميع الاحتمالات = 256 أس 307195، أى تقريباً (10 أس 737268) أى واحد وامامه 737268 صفر من الثوانى regular_smile.gif

الصورة المرفقة

وحيث أن السنه تحتوى تقريباً على 32.000.000 ثانية، أى كل 3 سنين تحتوى تقريباً على 10.000.000 ثانية (10 أس 7)
إذن تحتاج الى زمن قدره = 3 × (10 أس (737268-7)) = 3 × (10 أس 737261) سنة، 3 × (10 أس 737259) قرن
ولنفترض أن تكنولوجيا البرنامج تضاعفت سرعتها 3 مليون مليار مرة، اى اصبح ينتج: ثلاثة مليار مليار مليار صورة فى الثانية (أى واحد وامامه 24 صفر صورة فى الثانية). إذن ستحتاج لوقت يساوى (10 أس 737241) قرن
ولنفترض أنك ستختار صورة واحدة من كل مليار مليار مليار صورة (أى 0.000000000000000000000000000000000001%)، إذن ستحتاج لوقت يساوى (10 أس 737205) قرن أى (10 أس 737193) مليار قرن، أى (واحد وامامه 737207 صفر من السنين)
مع العلم أن عمر الأرض يقدر بحوالى (4.5 × 10 أس 9) سنة = 4.500.000.000 سنة
أى ستحتاج تقريباً إلى أكثر من (10 أس 737195) ضعف عمر الأرض regular_smile.gif ، ولو افترضنا بأننا (لا أدرى كيف؟) أنتقينا صورة واحدة من كل ((10 أس 30000) إلى (10 أس 40000)) صورة، لكانت المحصلة تساوى تقريباً (10 أس 700000) ضعف عمر الأرض، (واحد وامامه 700.000 صفر regular_smile.gif)
أى لو بدء البرنامج مع بدء عمر الأرض، وبقوة تصل إلى: ثلاثة مليار مليار مليار صورة فى الثانية، مع اختيار صورة واحدة من كل مليار مليار مليار صورة، وأن زمن اختيار واستبعاد الصور جدلاً يساوى صفر، وكان هناك حوالى (10 أس 700000) نظام بنفس القوه ويعملوا سوياً بالتوازى، لكنا الان نشاهد الرسالة regular_smile.gif

LEFT TO RIGHT

98% of task completed

ملاحظة: الحسابات بإفتراض الصورة 640 × 480 × 8 بت، وعليه:

  • 640 × 480 × 4 بت، سيكون الناتج النهائى التقريبى = 10 أس (700000/2) = 10 أس 350.000
  • 640 × 480 × 16 بت، سيكون الناتج النهائى التقريبى = 10 أس (700000*2) = 10 أس 1.400.000
  • 640 × 480 × 24 بت، سيكون الناتج النهائى التقريبى = 10 أس (700000*3) = 10 أس 2.100.000
  • 640 × 480 × 32 بت، سيكون الناتج النهائى التقريبى = 10 أس (700000*4) = 10 أس 2.800.000
  • 640 × 480 × 4 بت = 320 × 480 × 8 بت = 640 × 240 × 8 بت = 320 × 240 × 16 بت، الناتج النهائى التقريبى = 10 أس (700000/2) = 10 أس 350.000
  • ... الخ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

رابط الموضوع على منتدى الفريق العربي للبرمجة :
http://www.arabteam2000-forum.com/index.php?showtopic=155674

رابط الموضوع على فيجوال بيسك للعرب :

http://vb4arab.com/vb/showthread.php?t=13808


رابط الموضوع على sourceforge هنا :
http://sourceforge.net/community/forum/topic.php?id=451&page

 

Read more ...

Strategy Design Pattern

| Labels: | 1 comments |

The Strategy Design Pattern
نبدأ أولاً مع التعريف وهو :

The Strategy Design Pattern basically consists of decoupling an algorithm from its host, and encapsulating the algorithm into a separate class. More simply put, an object and its behaviour are separated and put into two different classes. This allows you to switch the algorithm that you are using at any time.

وباختصار ، فإن هذا الباترن مكون من عملية decoupling للالجوريزم و encapsulating في كلاسات Classes مختلفة ، حيث يتم فصل الكائن عن سلوكه في كلاسين منفصلين ، وهو ما سيسمح لك لاحقاً بتغيير الالجوريزم وقت ما تريد .

مميزات هذا الباترن :
- يمكنك بكل بساطة من خلاله تغيير ال behaviour الخاص بك وقت ما تريد عن طريق فصل كل behaviour في كلاس خاص به .
- في حالة رغبتك في اضافة behaviour أو تعديله لن تضطر إلى التعديل في الكلاس الرئيسي .


الاستخدام :
عندما يكون لديك عدد من الكائنات Objects متشابه ومختلفة فقط في ال behaviour فإنه من المفضل دائماً استخدام Strategy حيث يمكنك اختصار جميع هذه الكلاسات في كلاس واحد فقط مع استخدام Strategies مختلفة .
كذلك الأمر أيضاً مع subclassing للكائنات ، حيث يعتمد الحل القديم على كون ال behaviour من نوع static ، وعندما ترغب في تغييره فإنك تقوم بعمل new instance ومن ثم تقوم بعمل تبديل replace للقديم ، ولكن الآن كل ما عليك هو تغيير ال Strategy وهو سيقوم تلقائياً بتعديل ال behaviour .


أيضاً فإن وجود عدد كبير من ال behaviour في كلاس واحد سيجبرك على كثرة استخدام الجمل الشرطية لمعرفة ال behaviour المطلوب ، أما مع Strategy فلن تحتاج إلى ذلك أبداً .
طريقة العمل بكل بساطة في الصورة التالية :

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

Read more ...

Traffic Monitoring System

| Labels: , | 5 comments |

اسم المشروع : نظام لمراقبة المرور مع نموذج للقيادة الآلية .
Traffic Monitoring System With Automatic Driving Model


المشروع فائز بالمركز الأول على مستوى جمهورية مصر العربية في يوم الهندسة المصري EED فرع IT .

فريق العمل :
1- أحمد جمال خليفة .
2- أحمد سعيد أنور .
3- أحمد عماد أحمد .
4- أحمد محمد عيسوي .
5- حسام الدين محمد صادق .
6- خالد عادل محمد سلامة .

اسم المشرف :
بروفيسور: عراقي خليفة .
م. عمر غنيم .


الكلية والجامعة :
جمهورية مصر العربية - جامعة حلوان - كلية الحاسبات والمعلومات - قسم علوم الحاسب.
السنة : 2007 .


وصف مختصر للمشروع :
المراحل الأساسية للمشروع - باختصار شديد - لمزيد من التفاصيل راجع ال Documentation في آخر الموضوع .

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

المصاعب الأساسية التي واجهت النظام :
تعتبر الاستجابة اللحظية للأوامر الصادرة عن طريق الكومبيوتر للسيارة هي العقبة الأولى في المشروع نظراً للزمن الذي تستغرقه عمليه تحليل الصور على حاسب آلي متوسط السرعة ، والوقت الذي تستغرقة الأوامر للانتقال في ظل حاجتنا إلى أسرع استجابة ممكنة ليمكن تطبيق النظام في الواقع .

السيناريو :
* مخطط لسيناريو المشروع :

* مخطط Collaboration Diagram للمشروع :

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


معالجة الصور :
المرحلة الأولى في عملية معالجة الصور هي مرحلة Road Extraction حيث يتم معرفة الطرق الموجودة في المدينة عن طريق مراحل متعددة تمر بها عملية استخراج الطرق بعد ذلك يمكن حصرها اجمالاً في المراحل التالية (Generate Road Seed points, Snaxles, Snakes) حيث يتم التعرف في آخر مرحلة بصورة مفصلة على جميع الطرق غير المستقيمة أو المنحنية بانحناءات متعددة .


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

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

الخطوة الثانية تعتمد على البدء الفعلي في قراءة الصور ويتم ذلك عبر تحويلها إلى صور Binary مع تطبيق بعض ال morphological filtering من اجل توضيح الصورة ، وهذه المحصلة النهائية لهذه العمليات :

الخطوة الأخيرة هي البدء بتتبع هذه السيارات فترة عمل النظام ، ويتم ذلك باستخدام LUCAS-KANADE OPTICAL FLOW ALGORITHM على سبيل المثال .
نظام الإحصائيات والتقارير القيادة الآلية :
بعد أن استطعنا في المرحلة السابقة معرفة أماكن السيارات في المدينة وحالة الطرق ، جاء دور المرحلة الثانية من النظام والتي تتلخص في الاستفادة من هذه البيانات ، وتتم الاستفادة من هذه البيانات بطريقتين :

نظام الإحصائيات والتقارير :
حيث يتم عرض تقرير فوري بحالة الطرق ونسب الإزدحام وخلافه .

نظام القيادة الآلية :
وهذا هو الجزء الثاني من المشروع ، حيث يتم كبداية تحديد مهمة للانتقال من نقطة أ إلى نقطة ب .
أول العمليات التي يتم تنفيذها هي حساب ال Best Path عن طريق معادلة لكل طريق يتم من خلالها اختيار الطريق الأنسب وبدء العمل على تحريك السيارة من خلاله

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


الهاردوير Hardware :
كما أسلفنا في النقطة السابقة ، فإنه تلزمنا بعض التعديلات ليصبح بمقدورنا تحريك السيارة الموديل عن طريق الكومبيوتر .
بداية استعنا بسيارة ريموت كنترول RC Car مع مراعاة وجود أكثر من تردد Frequency في حالة استخدام أكثر من سيارة أو استخدام crystals أو Removable Strips من أجل تجنب تداخل الموجات .
ثم قمنا بعمل موديل لمدينة مصغرة وقمنا برسم بعض الطرق وبناء بعض المباني كما هو موضح في الصور المرفقة .
وقمنا باستخدام كاميرا عادية لالتقاط الصور .
المرحلة الأولى هي ربط الكاميرا بالكومبيوتر ، وتم ذلك عبر منفذ USB حيث يمكن قراءة الكاميرا بأكثر من طريقة وحسب لغة البرمجة المستخدمة .
الخطوة الثانية هي ربط الريموت بالكومبيوتر ليتم التحكم في السيارة ، ويتم ذلك عن طريق استخدام مبادئ ال Relays والتي تسمح للتيار بالمرور في الريموت عند تلقي أمر معين من الكومبيوتر من خلال منفذ الطابعة Parallel Port .
وهاتين الصورتين توضحان الفرق بين الريموت العادي حيث يتم تحريك صفائح على بعضها مقارنة بالريموت الجديد حيث أصبح ال Relay هو المتحكم في توصيل الكهرباء .

التطبيق في العالم الواقعي :
لكي يصبح هذا النظام قابلاً للتطبيق في أرض الواقع وعلى مدينة حقيقة فإنه ما زال بحاجة إلى بعض التعديلات ، نوجزها في الثلاث نقاط التالية :


- من جهة معالجة الصور : سيتم استبدال الكاميرا بصور مباشرة للأقمار الصناعية مثل Googel Earth والتي بدأت تقدم خدمات بث مباشر لبعض المدن حول العالم .
أيضاً لا زلنا بحاجة للمزيد من التسريع والدقة في عمليات معالجة الصور ، أيضا لمزيد من الفلترة للمؤثرات الجوية الخاصة مثل الغيوم ، الأمطار ... الخ .
- من جهة نظام قيادة السيارة : لن يتحمل السيرفر وحده عبء القيادة بل سيكون هناك جهاز على السيارة أو Microcontroller يستقبل المسار ويبدأ في توجيه نفسه بنفسه وذلك منعاً لتثقيل العمل على السيرفر وزيادة في السرعة .
أيضاً سيتم استخدام دوائر كهربائية مثل ultra-sonic حتى في الموديل الصغير لتلافي الاصطدامات التي تنتج عن أجسام مفاجئة حيث تقوم بارسال واستقبال موجات ويتم احتساب زمن ارتدادها لمعرفة ومن خلالها يمكن معرفة المسافة التي تفصلها عن أقرب جسم في الاتجاه والزاوية التي ترسل بها الموجات .
- من جهة نظام التحكم والاتصال : لن يتم الاتصال عبر موجات Radio عادية بل لا بد من وجود Wireless network ، والشرط الأهم هو كونها محمية وهو ما لم تتوصل إليه البحوث حتى الآن حيث لا توجد شبكة لا سلكية محمية بصورة كاملة أبداً .
ومن الجهة الأخرى فنحن بحاجة إلى تطويع هاردوير السيارات لاستقبال أوامر عن طريق الكومبيوتر وهو ما لا يعد مرحلة صعبة من ناحية التطبيق ، ولكنه سيواجه مشاكل عديدة تنتج عن سرعة السيارة مثلاً وسرعة الاستجابة للأوامر في ظل سيرها على سرعات كبيرة والتوقف المفاجئ وتوقع الاعطال وغيره .

المشروع :


تم تسليم المشروع باستخدام C# ولكن بداية العمل في المشروع لم تكن كذلك ، حيث تم استخدام MATLAP نظراً لكونه الأسهل في التعامل مع ال Image Proccessing ، ومن ثم تم ربطه بالنظام الذي قمنا بعمله من خلال C# ولكن وبالرغم من ذلك فلن تجد اللغة المستخدمة تفرق كثيراً حيث أن أغلب البرنامج عبارة عن معادلات وقوانين لن يختلف تطبيقها من لغة إلى أخرى أبداً .
وللتحويل إلى C# تم استخدام SharperCV وهي مكتبة مفتوحة المصدر متخصصة في عمليات ال Image Proccesing وهي عبارة عن Warrper لمكتبة OpenCV التي تم تصميمها للعمل على C++ ، وسبب الاستعانة بهذه المكتبة هو التعقيد الكبير الذي سينتج عن استخدام أكواد سي شارب مباشرة في كل عملية من عمليات معالجة الصور التي نستخدمها نظراً لإنك ستضطر للتعامل مع المؤشرات Pointers وهو ما يضطرك لاستخدام unsafe code ، وبصراحة فهي لا تعطيك كافة المميزات التي تقدمها لك لغة مثل C++ وفي نفس الوقت تحرمك من السهولة التي تجدها في الماتلاب .
ولكن هذا لم يمنع استخدام أكواد مباشرة في كثير من الأحيان ، وإنما تم استخدام SharperCV فقط في العمليات المتكررة أو التي يتم التعامل فيها مع كمية كبيرة من الأكواد حيث تختصر عليك ال SharperCV جزء كبير من المهمة برغم كثرة مشاكلها ، ولكنك ستجد نفسك مضطراً في النهاية للبرمجة اليدوية .
كان بالإمكان اضافة حل آخر وهو استخدام عمليات التحويل من ماتلاب إلى .net ولكن ظهور بعض المشاكل أدى إلى ايقاف هذه العملية ، عموماً ما زالت جميع مراحل العمل على معالجة الصور موجودة من خلال matlap ومن خلال C# أيضاً .
أما الجزء الآخر الخاص بالنظام والشاشات والقيادة الآلية ومعادلات الحركة والربط بالكاميرا من جهة أو الربط بالسيارة من جهة أخرى وعمليات التعديل والتحرير وقواعد البيانات والتقارير وخلافه فقد تمت برمجته باستخدام C# مباشرة .
لقطات وصور من المشروع :


لقطات وصور من البرنامج :


وهذه نسخة من ال Documentation للمشروع يمكن الاطلاع عليها من خلال هذا الرابط :
http://www.4shared.com/file/133227955/d4ea58ba/Final_Documentation.html

مراكز أخرى حققتها جروبات كلية حاسبات ومعلومات حلوان :

http://www.fcih.net/details.asp?id=94

Read more ...

الفروقات بين C# And VB.net - الخلاصة 99% تشابه

| Labels: , | 0 comments |

في هذه المقالة أهدف إلى توضيح بعض الفروقات بين C# و VB.net في اشارة إلى أن الفروقات بينها 90% فقط في طريقة الكتابة ، ولن أناقش مبدأ أنهما متشابهان في البنية التحتية فهذا أمر مفروغ منه ، ومن أجمل ما قرأت مقال الأستاذ أيمن المدهون بعنوان : لا تكذبي إني رأيتكما معاً ، على هذا الرابط : http://www.vb4arab.com/vb/showthread.php?t=726

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

وسأضع هنا تنويهاً عن الفروقات الغوية الأبرز وأحيلك في آخر الدروس إلى موسوعة للفروقات بين هاتين اللغتين ، ولنبدأ بالفروقات اللغوية - فروق غير ذات قيمة - :

* أولاً : كونك مبرمج سي شارب لا تنس أن تضع ; في آخر كل سطر

* ثانياً : طريقة تعريف المتغيرات :

VB.net :

Dim X as Integer
Dim X as ClassName=new ClassName()



C#

int x;

ClassName x=new ClassName();




* ثالثاً : في حالة الشروط في VB.net اكتب = أما في C# اكتب == ، كما ستجد العلامة != لعدم المساواة بدلاً من <> .

* رابعاً : تعتمد لغة VB.net على جمل مثل End وتستخدمها في الاجراءات والكلاسات وغيرها مثلاً :

if x=1 Then

End if




بينما تجدها في C# باستخدام الأقواس :


if(x==1)

{

}



وكذلك في الكلاس والاجراءات أيضاً :


VB.net :

Imports System

Namespace MyNameSpace

Class HelloWorld

'Entry point which delegates to C-style main

Private Function

Public Overloads Shared Sub Main()

Main(System.Environment.GetCommandLineArgs())

End Sub

Overloads Shared Sub Main(args() As String)

System.Console.WriteLine("Hello World")

End Sub 'Main

End Class 'HelloWorld End Namespace 'MyNameSpace





C# :


using System

Namespace MyNameSpace

{

class HelloWorld

{

static void Main(string[] args)

{

System.Console.WriteLine(
"Hello

World"
)

}

}

}




* خامساً ، في فيجوال بيسك .net سوف تستخدم And,Or,Not,OrElse بينما في C# سوف تستخدم && ! .

* سادساً : عند جمع النصوص استخدم & في VB.net ولكن في C# استخدم + .

* سابعاً : else if في C# هي ElseIf في VB.net

* ثامناً : كما اسلفنا في موضوع End ، ففي الحلقات التكرارية تعتمد C# على الأقواس أيضاً :


for (i = 2; i < = 10; i += 2)

{

System.Console.WriteLine(i);

System.Console.WriteLine(i*10);

}



وفي حالة كونها سطر واحد يمكن الاستغناء عن الأقواس :


for (i = 2; i < = 10; i += 2)

System.Console.WriteLine(i);




أما في VB.net فهي تأخذ شكلاً موحداً :


For c = 2 To 10 Step 2

System.Console.WriteLine(c)

Next



ونفس الأمر بالنسبة لباقي الحلقات التكرارية While و for each وخلافه .


* تاسعاً : بالنسبة للمصفوفات وخلافه يستخدم القوس [] بدلاً من () في VB.net .

C#

int[] nums = {1, 2, 3};

for (int i = 0; i < nums.Length; i++)

Console.WriteLine(nums[i]);




Vb.net

Dim nums() As Integer = {1, 2, 3}

For i As Integer = 0 To nums.Length - 1

Console.WriteLine(nums(i))

Next



* لن تجد تعليقاً Comment لأكثر من سطر في VB.net مثل /* */ في C# ، وكذلك XML Comments على الرغم من أنني قرأت انها ستكون مدعومة في الاصدارة القادمة .

* في C# سوف تستخدم العلامة المئوية % بدلاً من Mod في VB.net للحصول على باقي القسمة .

* لن تدعم لك VB.net استخدام Bitwise Operations في حالة Assignment على عكس ال C# حيث تتيح لك ذلك .

الآن نترك عنا الفروقات اللغوية ، فسوف نشير للباقي منها في نهاية المقال ، نتطرق هنا على عجالة للفروقات الفعلية :

* أول تلك الفروقات هي case sensitive ، حيث أنه في VB.net فإن Ahmed هي نفسها ahmed وهو ما لا يوجد في أي لغة في العالم سوى Basic ، ولا أستطيع أن أحدد فيما إذا كان هذا ميزة أم عيب .

مميزات في VB.net - باختصار - :

* دعم ال optional parameters موجود في VB.net وليس موجود في C# .

* with موجود في VB.net وليس موجود في C# .

* Catch ... When موجودة في VB.net وهي تتيح نظاماً أفضل لفلترة الأخطاء .

* يقوم VB.net بعمل Compile للكود في BackGround ، وهذه ميزة في التطبيقات الصغيرة ولكنها عيب في التطبيقات الكبيرة حيث تلاحظ بطء الفيجوال ستوديو .

مميزات في C# - اختصار - :

* يدعم C# ما يعرف باسم unsigned types ، وهو ما يمكنك استخدامه أيضاً في VB.net ولكنه ليس جزءاً اساسياً من اللغة .

* الميزة الأقوى في C# والتي لا تتوفر في VB.net هي السماح باستخدام

unsafe أو unmaneged code ما يتيح لك العمل على Pointers وخلافه ، ما يفتح لك آفاقاً واسعة في عدة مجالات مثل معالجة الصور image processing وخلافه .

ولعل هذه الميزة مما جعل C# قريبة من C++ من ناحية تعاملها مع كود منخفض المستوى Low Level Code وهو ما يجعل سي شارب الاختيار الأمثل للكثيرين .

* لن تجد increment و decrement في VB.net حيث ستتضطر إلى كتابة كود بالشكل التالي :

A=A+1

A-=1



بينما في C# يمكنك القيام بذلك بالشكل التالي :



A++

A--



* يمكنك أن تجد الخاصية sizeof في C# بينما لن تجدها في VB.net .


كان هذا موجزاً لأوضح الاختلافات والتي ستتعامل معها كثيراً ، وكما لاحظت فهي في أغلبها ليست ذات قيمة كبيرة .

في النهاية : ماذا أختار ؟

إذا كنت منتقلاً من VB 6.0 فعليك ب VB.net أما إذا كانت لديك خبرة ب C/C++/Java فعليك ب C# وإذا كنت جديداً في مجال البرمجة فأنت حر في اختيار ما يناسبك .

وفي النهاية ومهما كان اختيارك قم بالاطلاع على اللغة الثانية - علشان تضحك على الناس وتقول انا ببرمج بلغتين مش لغة واحدة - ، ويمكنك ايضاً في هذه الحالة أن تبرمج ب J# ويبقى اسمك ادام الناس بيبرمج ب 3 لغات

في آخر هذا الدرس أحيلك إلى هذا الرابط (متميز) ويشرح الموضوع بتفصيل كامل ، أتمنى لك الاستفادة منه .

http://www.codeproject.com/dotnet/vb...difference.asp

أيضاً الملف من موقع مايكروسوفت لتوضيح الفروقات :

http://support.microsoft.com/kb/308470

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

Read more ...

Singleton Design Pattern

| Labels: , | 0 comments |

المشكلة :

أحياناً ما تحتاج لإن يكون ال Class الذي قمت بانشائه لا يمكن تعريف سوى نسخة أو Object واحد فقط منه ، وتحتاج إلى مثل هذه العملية في حالة كود هذا ال Class لا بد أن يكون موجوداً مرة واحدة في البرنامج وتظل قيمه مقروءة لجميع المستخدمين من أي مكان .


المشكلة ليست في جعل ال Class لا يتم سوى عمل نسخة واحدة منه ، بل إن هذا يتم بكل بساطة باستخدام الكلمة المحجوزة Sealed ، ولكن المشكلة تكمن في أنك عندما تريد أن تستخدم نسخة أخرى فإنك لن تستطيع ، وبذا لن يمكنك الاستفادة منه في كل مكان


في هذه الحالة نلجأ لما يسمى Singleton .


الشرح :


في البداية سوف ننشأ Class وليكن اسمه Singleton .
وفي كلا الأحوال لا بد للمنشىء constructor أن يكون private لكي لا يتمكن أحد من عمل نسخة جديدة منه .
وسنعرف نسخة من ال Class داخل ال Class نفسه بالشكل التالي :

private readonly Singleton instance;




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








public Singleton getInstance

{


if (instance ==null) instance = new Singleton();


return instance


}






والآن هناك طريقتين لتطبيق هذه التقنية ، الطريقة السابقة التي ذكرناها وبامكانها العمل على أي لغة برمجة - بغض النظر عن أنني استخدم C# في الشرح - ، أما الطريقة الثانية فهي تتطلب لغة يمكنها قراءة static من أي مكان وهو ما يتوفر مثلاً في الجافا أو ال C# ولا يتوفر في ال C++ .

الطريقة الثانية تعتمد على الغاء الفنكشن getInstance والاعتماد على أن بامكان اللغة تعريف new من المتغير وقت التعريف ، ليصبح أمر التعريف بالشكل التالي :








public static readonly Singleton instance = new Singleton();






وفي هذه الحالة قم دائماً بقراءة instance دون الحاجة إلى التعريف لإنها static .

وهذه صورة توضح التقنيتن المشروحتين :









Read more ...

StringBuilder

| Labels: , , | 0 comments |

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


عندما نقوم بدمج النصوص ، يلجأ الكثيرون منا لاستخدام المعامل + في C# أو المعامل & في VB.net بالشكل التالي - مثال اضافة امتداد البريد الإلكتروني :

//C#:
Label1.Text = Text1.Text + "@hotmail.com";

'VB.net:
Label1.Text = Text1.Text + "@hotmail.com";

إلا أن Visual Studio قدمت لنا طريقة أخرى لدمج النصوص باستخدام الفئة StringBuilder ، في مجال الأسماء System.Text.StringBuilder ، يمكن استخدامها لدمج النصوص بالشكل التالي :

//C#:
System.Text.StringBuilder mail = New System.Text.StringBuilder(Text1.Text);
mail.Append("@hotmail.com");

'VB.net:
Dim mail As New System.Text.StringBuilder(Text1.Text)
mail.Append("@hotmail.com")

الفارق بين الاثنين يكمن في ان stringbuilder يظل كما هو منذ لحظة انشاءه ، اما استخدام المعاملات + أو & فهو يقوم بعمل Object جديد من ال String مع كل عملية دمج .
والآن سنفترض مثال Loop تقوم بدمج عدد من النصوص ، وسنصور المقارنة مباشرة من كتاب .Net Gotachas ، حيث قام بعمل اختبار لعدد عمليات دمج ابتداء من 10 عمليات دمج وحتى 1000000 عملية دمج ، وقام بمقارنة الأداء بين استخدام StringBuilder او استخدام معاملات الدمج التقليدية ، مع ذكر زمن التنفيذ بالثانية لكل منهم .

لا تنسى ان 3562.933 ثانية تعني 59.4 دقيقة تقريباً ...
والآن ... هل ما زلت تستخدم & او + لدمج النصوص ؟؟؟


توفر الفئة stringbuilder ايضاً عمليات استبدال Replace وادراج Insert وحذف Remove وعمليات نصوص أخرى كثيرة ، يمكنك الاطلاع على أوجه كثيرة للمقارنة مدعومة بالرسوم البيانية من خلال هذا الرابط من Code Project :
http://www.codeproject.com/KB/cs/StringBuilder_vs_String.aspx

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

Read more ...

موقع MSDN

| Labels: | 0 comments |


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


يعد الـ Microsoft Developer Network أو ما يعرف اختصاراً باسم MSDN واحداً من أكبر مراكز الدعم للمبرمجين الذي يستخدمون أدوات Microsoft المختلفة .
http://msdn2.microsoft.com/en-us/default.aspx


في هذا الموقع ، تجد كل ما تريد من الأوامر الأساسية والفرعية وشروح لمختلف التطبيقات على لغات البرمجة من انتاج مايكروسوفت ، ففي الصفحة الأولى انت مخير للاختيار بين واحد من هذه اللغات أو التقنيات :
.NET Framework, ASP.NET, Office, SQL Server, Visual Basic, Visual C++, Visual C#, Visual Studio, Visual Studio Express, Windows Vista And More


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


إلا ان النقطة الأبرز والأكثر أهمية في MSDN تظل هي Developer Centers مركز المبرمجين ، والذي تجد فيه كل ما تحتاجه .
والآن قم باختيار أي قسم تود البحث أو التعلم فيه وليكن .net frame work مثلاً ، في هذا القسم سوف تجد قسم Downlaods لتحميل آخر البرامج والأدوات ، أيضاً تجد القسم التعليمي وهو الأهم على أية حال .

في القسم التعليمي ستجد قسم لأسئلة وأجوبة ، قسم للعروض التقديمية Presentations ، قسم آخر للتدريب وللكتب وغير ذلك .
أما لو قمنا باختيار قسم يهتم بالكود مثل Viusal C# فسوف تجد مجموعة من Tutorial التعليمية تأخذك خطوة بخطوة عبر هذه اللغة أو التقنية ، حيث تستطيع ايجاد كم هائل من الدروس والتطبيقات الجاهزة .
وفي كلا الأحوال تستطيع البحث عن ما تريد لتجد مجموعة من الأجوبة التي تفيدك في هذا الموضوع ، فمثلاً لو اردنا البحث عن SqlConnection والتي تستخدم لربط قاعدة البيانات من نوع Sql فسوف نجد الصفحة التالية :
http://msdn2.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection(VS.71).aspx
والتي تحتوي على شرح كامل لهذا الـ Class بكل التقنيات المتاحة في الغالب ، كما سيحتوي الدرس على روابط لمواضيع متعلقة سوف يهمك أغلبها إذا استمررت في العمل من خلال هذا الـ Class ، كما قد تجد في بعض المواضيع مثالاً للعمل ، أو حتى تطبيقاً جاهزاً يمكنك عمل Download له .


وبعيداً عن الدروس المباشرة ستجد أحياناً مجموعة من التعليمات السريعة Hints لمشاكل ربما تواجه في العادة مستخدمي هذه التقنية ، كما ستجد مقالات تشرح لك ماذا يحدث خلف الكود وكيفية عمل هذه التقنية بالضبط .
بقي أن نشير أيضاً إلى وجود MSDN على أقراص CD's ليتم العمل عليه في حالة عدم الاتصال بالانترنت ، ويمكن تحديثها بالربط بالموقع أيضاً ...
ويمكنك تسجيل نفسك كعضو في MSDN للاستفادة من كامل الخدمات التي يقدمها الموقع من خلال بريدك الالكتروني على Live Hotmail .

Read more ...

مقدمة إلى لغة الذكاء الإصطناعي برولوج 2

| Labels: | 0 comments |


من منا لا يعرف مسألة أو لغز آينشتاين الذي انتشر كثيراً على المنتديات وجروبات الياهو وفي كل مكان ، وهو اللغز الذي يعتقد آينشتاين أن 98% من البشر لا يمكنهم حله ، هذا هو اللغز :

1- توجد خمس منازل لكل منها لون مختلف .

2- يسكن كل منزل شخص من جنسية مختلفه .

3- كل ساكن يفضل ان يشرب مشروبا معين , ويدخن سجائر نوع معين منها,ويحتفظ بحيوان أليف معين .

4- لاأحد من الجيران الخمسة يشرب نفس المشروب أو يدخن نفس النوع من السجائر أو لديه نفس الحيوان الأليف .

معلومات الربط :

* يسكن البريطاني في المنزل الأحمر .

* لدى السويدي كلب. * يحب الدنماركي شرب الشاي .

* البيت الأخضر على الجانب الأيسر من البيت الأبيض.



* مالك البيت الاخضر يشرب القهوة.

* الشخص الذي يشرب سجائر نوع بال مال لديه طائر.

* الرجل الذي يسكن في البيت الأوسط يشرب الحليب.

* مالك المنزل الأصفر يدخن سجائر نوع دانهيل .

* يسكن النرويجي في المنزل الاول .

* يسكن مدخن سجائر نوع مارلبور مجاورا لمن لديه قطه.

* الرجل الذي لديه حصان يسكن مجاورا لمن يدخن سجائر نوع دانهيل

* مدخن سجائر نوع وينفيلد يحب شرب الجعه (شراب الشعير).

* يسكن النرويجي مجاورا للبيت الأزرق .

* يدخن الألماني سجائر نوع روثمانز.

* مدخن سجائر نوع مارلبور لديه جار يحب شرب الماء.

المطلوب -.:

تحدد اللون / الجنسيه / الحيوان / المشروب / نوع السجائر لكل واحد مع توضيح :

من منهم لديه السمكة (أو أن حيوانه الأليف سمكة)؟

لا توجد خدعه في حل هذا اللغز , بل هو منطق صرف من يعرف الإجابة سيكون من ضمن أذكى أذكياء العالم (2% الأذكياء في العالم).

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

بداية هذه المسألة بالغة الانجليزية لنستخلص منها بعض المصطلحات

The Brit lives in the red house.
The Swede keeps dogs as pets.
The Dane drinks tea.
The green house is on the left of the white house.
The green house's owner drinks coffee.
The person who smokes Pall Mall rears birds.
The owner of the yellow house smokes Dunhill.
The man living in the center house drinks milk.
The Norwegian lives in the first house.
The man who smokes Blends lives next to the one who keeps cats.
The man who keeps horses lives next to the man who smokes Dunhill.
The owner who smokes Bluemaster drinks beer.
The German smokes Prince.
The Norwegian lives next to the blue house.
The man who smokes Blend has a neighbour who drinks water.

والآن سننقل نفس البيانات السابقة ولكن بنظام كتابة برولوج :

next_to(X, Y, List) :- iright(X, Y, List).
next_to(X, Y, List) :- iright(Y, X, List).
iright(L, R, [L [R _]]).
iright(L, R, [_ Rest]) :- iright(L, R, Rest).
einstein(Houses, Fish_Owner) :-
=(Houses, [[house, norwegian, _, _, _, _], _, [house, _, _, _, milk, _], _, _]),
member([house, brit, _, _, _, red], Houses),
member([house, swede, dog, _, _, _], Houses),
member([house, dane, _, _, tea, _], Houses),
iright([house, _, _, _, _, green], [house, _, _, _, _, white], Houses),
member([house, _, _, _, coffee, green], Houses),
member([house, _, bird, pallmall, _, _], Houses),
member([house, _, _, dunhill, _, yellow], Houses),
next_to([house, _, _, dunhill, _, _], [house, _, horse, _, _, _], Houses),
member([house, _, _, _, milk, _], Houses),
next_to([house, _, _, marlboro, _, _], [house, _, cat, _, _, _], Houses),
next_to([house, _, _, marlboro, _, _], [house, _, _, _, water, _], Houses),
member([house, _, _, winfield, beer, _], Houses),
member([house, german, _, rothmans, _, _], Houses),
next_to([house, norwegian, _, _, _, _], [house, _, _, _, _, blue], Houses),
member([house, Fish_Owner, fish, _, _, _], Houses).

بعد ترجمة هذا المشروع ، تستطيع سؤال البرنامج عن اي منهم وسوف يتتبع البيانات المتاحة له + القواعد ليصل بك إلى الناتج ، هذا هو السؤال الأساسي والخاص بمن يمتلك سمكة :

?- einstein(Houses, Fish_Owner).

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

وفي الختام هذا هو الحل يمكنك اظهاره بتحديد الكلمة التالية بالماوس (الألماني) ، إذا لم يكن هذا هو حلك فأنت مرشح للانضمام إلى نادي ال 98% ، وهي نسبة ليست بسيطة كما ترى .

Read more ...

مقدمة إلى لغة الذكاء الإصطناعي برولوج 1

| Labels: | 0 comments |


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

لغة البرمجة Prolog والتي اخترعها الين كولمر ايور هي واحدة من أشهر اللغات المتخصصة في مجال الذكاء الإصطناعي ، وتعتمد اللغة على أسلوب المنطق في البرمجة ومن كلمة programmation en logique الفرنسية تم اشتقاق الكلمة الجديدة لترمز للغة .
*** المصدر : ويكيبديا .

وتعتبر اللغة Prolog قديمة نسبياً هناك لغات أخرى أصبحت أحدث مثل LISP ، لكن اللغة القديمة التي ظهرت في سبعينيات القرن المنصرم لا تزال تحتفظ بقدراتها حتى هذه اللحظة .

بداية كونك مبرمج تطبيقات عادية ب .net أو Java أو C++ لا يعني انك ستجد نفس ما تعلمته في برولوج ، أنس الأمر فالموضوع مختلف كلياً ، ولكنه سهل وبسيط ، حيث تعتمد برولوج في الأساس على العلاقات المنطقية بين الأشياء ، ويتم في هذه الحالة انشاء ما يعرف باسم ( قاعدة المعلومات Information Base ) وهي مختلفة عما عهدناه في عالم قواعد البيانات DataBase .

أيضاً ال Prolog متغيرة بالكامل ، فلا يمكن تحديد عدد أكوادها حيث أن البرنامج يتعلم أثناء عمل Run له وبالتالي عدد السطور قد يزيد أو ينقص حسب ما تعلمه البرنامج خلال هذه المراحل .

كيف أبدأ ؟

خطوتك الأولى للبداية تحتاج منك إلى استخدام أداة ما لتنفيذ أكوادك ، ستجد الكثير من الأدوات ، ولكني وجدت نسخة مناسبة اسمها Amzi Development Environment أثناء تصفحي في الموسوعة العربية ، لذا تستطيع أن تجد رابطها هنا :
http://www.c4arab.com/images/lessons/programming/AI/prolog/amzi_6-2-14_winnt.rar

كل ما عليك هو فتح ملف جديد ، وابدأ بكتابة الأكواد ، بعد الانتهاء قم باختيار Listener ثم Start لبدء التنفيذ .
مجدداً قم بالذهاب إلى Listener ومن ثم اختر Consult ومنه قم باختيار الملف الذي كتبت فيه الأكواد .
الخطوة الاخيرة ، هي البدء باستخدام البرنامج لعمل العلاقات ، سنشرح مثالاً تطبيقياً في الفقرة اللاحقة .

كيف ابرمج باستخدام برولوج ؟

كما ذكرنا في أول الدرس فإن Prolog تعتمد على العلاقات المنطقية ، فيمكنني القول مثلاً :

Human(Ahmed)
Car(Toyota)
Human(Khaled)

والمعنى باختصار ، أن أحمد و خالد من نوع انسان فيما تويوتا هي من نوع عربة .
جرب كتابة هذه الأسطر ، ومن ثم قم بتشغيل البرنامج كما أوضحنا في الجزء أعلاه (Listener -> Start ثم Listener -> Consult)

ومن ثم ابدأ بكتابة هذه الأسئلة :

?- Human(V).

هنا أن تقوم بسؤال البرنامج عن جميع من هم من النوع Human لتضعهم في المتغير V حيث سيقوم بعرضهم لك ، لا تنس أن يكون V حرف كابتيل .
طبعاً سيدأ بعرضهم علي واحداً وراء الآخر ، يمكنني ضغط Enter لو لم أرد عرض المزيد أو ; للاستمرار في العرض .

النوع الثاني من الأسئلة هو الذي تتوقع منه اجابة منطقية ، مثل هذا السؤال :

?- Human(Ahmed).


وسيرد عليك (نعم) أما لو ادخلت هذا السؤال :

?- Human(Ali).


فهذا البيان لم نقم بادخاله له في قاعدة المعلومات ، لذا ستكون الاجابة بالنفي .

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

تركيب العلاقات :

في الأجزاء السابقة كانت الأسئلة اجابات على بيانات مباشرة موجودة في قاعدة المعلومات ، ولكن الجزء الأقوى هو الخاص بالعلاقات المتعددة ، فمثلاً لو بدأنا بعلاقة : أحمد أبو محمد

father(ahmed,mohammed)

نستطيع تعريف أن أحمد أبو علي أيضاً :

father(ahmed,ali)

وهكذا عندما نبدأ بالاستعلام عن أبناء أحمد ، سنضع الجملة التالية في السؤال :

?- father(ahmed,U)


فسيعطينا جميع الأبناء للثابت (أحمد) ، لا تنس ان أي حرف كابتيل يعتبر متغير في البرلوج .

القواعد :

هذه هي النقطة التي نريد الوصول إليها وهي تعريف القواعد ، وهي التي ستحقق لنا الفائدة المرجوة في هذه البرمجة حيث أنه في جميع ما سبق كان البرنامج يجيب من البيانات التي أدخلناها ، أما الآن فسيكون قادراً على الإجابة بناء على مجموعة من المعلومات ومجموعة من القواعد ، وهو ما يفعله العقل البشري في حالة التفكير في الاجابة ، ولنبدأ بأبسط الامثلة مثل ( كل السيارات لديها باب ، وكل الطيارات لها باب ) بالشكل التالي :

car(X) :- gotadoor(X).
cairplane(X) :- gotadoor(X).

والآن لو قمنا بتعريف عدد من السيارات والطائرات ، قم قمنا لاحقاً بسؤال البرنامج عما إذا كان للسيارة mazda مثلاً باب ، ومع أننا لم نذكر صراحة ان gotadoor(mazda) إلا أن البرنامج استنتج أن ال mazda لها باب نظراً لإنها سيارة ، وكل السيارات لها باب .

نهاية :


ما زال في عالم ال Prolog الكثير من الأوامر ، لا تنس الادخال والاخراج وال List ... الخ ، ولكن كانت هذه مقدمة سريعة للبدء في العمل ، ربما لم تتضح لك الفائدة بعد ولكن جرب الإطلاع على الرد التالي مباشرة ، ستجد مثالاً حقيقياً لكيفية الاستفادة من مثل هذه التطبيقات .

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

Read more ...

بداية المدونة .. السلام عليكم

Monday, August 11, 2008 | | 0 comments |

بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
مجرد مدونة جديدة ، بس مش شخصية مختصة بالتكنكال والمقالات والدروس اللي بكتبها باللغة العربية
أتمنى أن المدونة تكون مفيدة ، وأتمنى لك زيارة ممتعة


بلوجي الشخصي

Read more ...