بسم الله الرحمن الرحيم
هنا في هذا الدرس سوف نقوم بشرح كيفية بناء شبكة ال XOR بإستخدام طريقة McCulloch-Pitts وذلك بعد بناء البوابة And Not ...
وهنا نلاحط أن الجدول المنطقي مختلف عن البوابة And ...
ولكن يمكن أن نفهم الوابة And Not على أننا وضعنا Not على المدخل الثاني أي X2 لبوابه And كما في الشكل التالي ...
فنلاحظ أننا وضعنا Not أي في منطق الدوائر الإلكرونية inverter قبل المدخل ل X2
فأصبحت قيمة X2 المدخلة على الAnd مقلوبة في الدائرة الإلكرونية فعندما تكون قيمة X2 تساوي
واحد يعطي نتيجه صفر و عندما تكون صفر تعطي نتيجة واحد ..
و بهذا فإن الشبكة لن نعمل إلا إذا تحقق الشرط التالي
الأول و عدم الثاني أي X1 And Not X2 وهذا يعطقي قيمة واحد
في حالة أن X1 = 1 و قيمة X2= 0 و هذا ما يحقق الجدول ...
يوجد هنا سؤال مهم يجب تنفيذه وهو كيف أبني خلية ال And Not بإستخدام
شبكة McCulloch-Pitts ؟
ذلك يكون لو تخيلنا أن قيمة العتبة Threshold تساوي 2
فكيف أقوم بتعليم الخليه بشك تعطيني مخرج 1 عند X1 = 1 و X2 = 0 من خلال منطق خلية McCulloch-Pitts ..
في البداية لو نظرنا إلى الشكل التالي ...
فنلاحظ أننا علمنا الخلية بأن وضعنا قيمة العتبة Threshold تساوي 2 و الوزن Weight للمدخل X1 W1 = 2 فجعناه منشط excitatory للخليه
و قيمة الوزن Weight للمدخل X2 W2 = -1 وقيمته سالبة أي مثبط inhibitory
فمثلاًً لو أردنا أن نبني الخلية برمجياً بإستخدام برنامجنا في الدرس السابق ..
نجد أننا فقط نغير في عملية التعليم و نسند القيم التالي ...
C++ كود
MyGate->w1 = 2;
MyGate->w2 = -1;
MyGate->Threshold = 2;
فهنا نكون قد علمنا الخلية على أن تتعامل منطقياً على أنها And Not
فمثلاًً لو وضعانا الكود التالي في الإقتران الرئيسي للبرنامج ...
C++ كود
int _tmain()
{
CGate *MyGate = new CGate();
MyGate->w1 = 2;
MyGate->w2 = -1;
MyGate->Threshold = 2;
Console::WriteLine(" *---------------------------*");
Console::WriteLine(" | X1 | X2 |Y=X1 And Not X2|");
MyGate->X1 = 0;
MyGate->X2 = 0;
// Y = f(y_in)
MyGate->Y = MyGate->ActvationFunction(MyGate->Yin());
Console::Write(" | 0 | 0 | ");Console::Write( MyGate->Y);Console::WriteLine(" |");
MyGate->X1 = 0;
MyGate->X2 = 1;
// Y = f(y_in)
MyGate->Y = MyGate->ActvationFunction(MyGate->Yin());
Console::Write(" | 0 | 1 | ");Console::Write( MyGate->Y);Console::WriteLine(" |");
MyGate->X1 = 1;
MyGate->X2 = 0;
// Y = f(y_in)
MyGate->Y = MyGate->ActvationFunction(MyGate->Yin());
Console::Write(" | 1 | 0 | ");Console::Write( MyGate->Y);Console::WriteLine(" |");
MyGate->X1 = 1;
MyGate->X2 = 1;
// Y = f(y_in)
MyGate->Y = MyGate->ActvationFunction(MyGate->Yin());
Console::Write(" | 1 | 1 | ");Console::Write( MyGate->Y);Console::WriteLine(" |");
Console::WriteLine(" *---------------------------*");
return 0;
}
فعند تنفيذ البرنامج ينتج عندي ما يلي ..
*---------------------------* | X1 | X2 |Y=X1 And Not X2| | 0 | 0 | 0 | | 0 | 1 | 0 | | 1 | 0 | 1 | | 1 | 1 | 0 | *---------------------------* Press any key to continue 

يمكن أن تقوم بتنفيذ التعديل على البرنامج
في الدرس السابق
أما الأن سنقوم ببناء ال XOR Gate بإستخدام الخلايا العصبية
OR و And Not ...
لكن في البداية أريد أن أوضح مفهوم ال Xor ....
ال Xor يمكن تعريفها ببساطة .. ( أحدهما وليس كلاهم )
لو كان عندي مدخل للشبة Xor إسمه X1 و مدخل أخر X2
يعني أني أريد أن يكون المدخل X1 يساوي ( واحد ) في نفس الوقت يكون المخدل X2 يساوي ( صفر ) أو يكون المدخل X2 يساوي ( واحد ) في نفس الوقت يكون المخدل X1 يساوي ( صفر )
ويمكن أن نكتب المعادلة المنطقية كما يلي
Y = X1 Xor X2
Y = ( X1 And Not X2) Or ( X2 And Not X1 )
وبهذا يكون الجدول المنطقي للبوابة كما يلي:
فهنا يمكن أن نقول أن تركيبة ال Xor يحتوي على ثلاث Gates
أساسية وهي خلية من ال Or خليتين And Not
فالخليتين And Not تكونا ممثلتان كما يلي
الخلية الاولى وهيZ1
Z1 = X1 And Not X2
ولتمثيلها بشبكة McCulloch-Pitts
والخلية الثانية تكونZ2 وتكون ممثله في الدائرة
وهي تمثيل لمعادلة المنطقية التالي
Z2 = X2 And Not X1
ولتمثيلها بشبكة McCulloch-Pitts
وهنا يكون الوزن المتبطةinhibitary للمدخل x1 والمنشطة excitatory للمدخل x2 وبعدها نرى خلية OR
....يتبع