1.4k likes | 1.82k Views
المخططات والشبكات Graphs & Networks لمقرر تركيب البيانات وتصميم الخوارزميات 1289. اعداد د. محمد ذويـب. أهداف المادة العلمية. تعريف مفهوم المخططات والشبكات وتميز بينهما. تمثل المخططات والشبكات بطرق مختلفة. تستطيع استخدام خوارزمية Dijkstra لإيجاد اقصر ممر بين زوجين من العناصر.
E N D
المخططات والشبكاتGraphs & Networks لمقرر تركيب البيانات وتصميم الخوارزميات 1289 اعداد د. محمد ذويـب
أهداف المادة العلمية • تعريف مفهوم المخططات والشبكات وتميز بينهما. • تمثل المخططات والشبكات بطرق مختلفة. • تستطيع استخدام خوارزمية Dijkstraلإيجاد • اقصر ممر بين زوجين من العناصر. • تستطيع استخدام خوارزمية Floyed لإيجاد • اقصرممر بين زوجين من العناصر.
المخططـات GRAPHSKS الشبكـات NETWORK
اولا:المخططات (Graphs) تعريف المخططات هي تراكيب بيانات تشبه الهياكل الشجرية في التمثيل الرياضي حيث تمثل الهياكل الشجرية نوع من أنواع المخططات
أما في برمجة الحاسوب فان المخطـطات تستعمل بطريقة تختلف عن الهياكل الشجرية وما يميزها قلة القيود عليها مقارنة بالهياكل الشجريةومن الممكن للعناصر أن تؤشر الى بعضها
بمعنى آخر ليس هناك علاقة أبوة وأبناء في المخططات فالمخططات في اغلب الأحيان لها شكل موحد لتمثيل مشكلة طبيعية فمثلا يمكن ان تمثل مجموعة الرؤوس في المخطط المدن بينما الحواف يمكن ان تمثلالطريق الواصلة بين هذه المدن
وعلى اي حـال فان المخطط لا يعكس المواقع الجغرافية بل يعكس واقع العلاقات بين المواقع والممثلة في القمـم (Vertices) والطرق الواصلة بينها (Edges) ويمكن أن تمثل الحواف في بعض الاحيان على شكل أقواس بالإضافة الى الخطوط المستقيمة
تتكون المخططات من جزئيين رئيسين هما : مجموعة من العناصر (Element) او العقد (Node)وتسمى الرؤوس V (Vertices) مجموعة الحواف E (edge) وبناء عليه فان المخطط يشار اليه كما يلي: G=(V,E)
انـواع المخططات Graphs Type يوجد نوعان رئيسيان من المخططات هي: • المخططات الغير متجهة • (UNDIRECTED GRAPHS) • المخططات المتجهة • (DIGRAPH )
اولا: المخططات الغير متجهة (UNDIRECTED GRAPHS) يكون المخطط غير متجه عندما تكون كل حافة تصل بين زوج من القمم الغير مرتبة
وكذلك إذا لم تحدد الحواف التي تربط بين رؤوس المخطط باتجاه معين وفي هذه الحالة: تكون القمة (v1,v2) مكافئة للقمة (v2,v1)
v2 v1 v3 v5 v4
ثانيا: المخططات المتجهة (DIGRAPHS) المخطط يسمى متجه إذا كانت كل حافةفي المخطط تربط بين زوج مرتب من القمم ويكون هناك على الأقل ممرواحد من كل قمةالى قمةأخرى ومحددا بسهم يشير الى تلك القمة
v1 v2 v4 v3 v5 v7 v6
تمثيل المخططاتRepresentation of Graphs هناك عدة طرق لتمثيل المخططات منها: القوائم المتصلة (Linked Representation) مصفوفة الجوار (Adjacency Matrices)
اولا : القوائم المتصلة(Linked Representation) تعتبر من ابسط الطرق إستخداما فإستعراض المخطط يتضمن زيارة كل قمة في المخطط مرة واحدة فقطفالخوارزميات التي تطبق في الهياكل الشجرية لا يمكن أن تطبق هنا لان المخطط قد يحتوي على دوران
لذلك خوارزمية الاستعراض الشجري من الممكن أن تؤدي الى تكرار لا نهائي لمنع ذلك من الحدوث كل رأس تمت زيارته يمكن أن يسجل لتجنب زيارته مرة أخرى
مع ذلك من الممكن أن تحتوي المخططات على قمم معزولة(غيرمتصلة) مما يعني أن بعض أجزاءالمخطط من الممكن أن تحذف إذا تم تطبيق منهج الاستعراض الشجري
مثـال: مثل المخطط التالي باستخدام مؤشرات الربط 1 4 2 3
الحـل: يتم تمثيل المخطط كي يشمل قائمتين: قائمة العناصر قائمة الحـواف
قائمــة الحواف قائمة العناصر 1 NULL 2 NULL 3 NULL NULL 4
مصفوفة الجوار(Adjacency Matrices) ثانيا : هي عبارة عن مصفوفة ثنائية الأبعاد التي تحددجميع القمم المجاورة لكل قمة في المخطط فمصفوفة الجوار A(aij)هي مصفوفة من الحجم n x nحيث يوضع في الموقع aij قيمة الوزن
اذا كان هناك حافة من القمة iالى القمةj ويوضع 0 اذا لم يكن هناك حافة تربط بين الرأسين وبشكل عام العلاقة التالية تمثل مصفوفة الجوار: aij := 1 if there is an edge from i to j 0 if there is no edge
: مثـال مثل الشكل التالي باستخدام مصفوفة الجوار v2 v1 v4 v3 v5 v6 v7
الحـل: يمكن تمثيل المخطط السابق بمصفوفة الجوار التالية:
نلاحظ ان مصفوفة الجوار تحتوي دائما على العنصرين 0و1 ولهذا السبب يطلق عليها المصفوفة البوليّة
حساب الحواف الداخلة والخارجة من كل قمـة في المخطط باستخدام مصفوفة الجوار لحساب عدد الحواف الداخلة: نستعمل رقم العنصر n كدليل للعمود في مصفوفة الجوار ونحسب عدد مرات تكرار الرقم 1 في مصفوفة الجوار
وبنفس الطريقة لحساب الحواف الخارجة: حيث نستخدم رقم العقدة n كدليل الصف في مصفوفة الجوار ونحسب عدد مرات حصول الرقم 1 في ذلك الصف ويمثـل عدد مرات حصول الرقم 1عدد الحواف الخارجة من كل عقدة في المخطط.
مثـال : لحساب الحواف الداخلة والخارجة من والى كل عنصر في المخطط باستخدام تمثيل مصفوفة الجوار نكتب الدوال التالية: buildadjm(intadj[][MAX], int n)
void buildadjm(int adj[][MAX], int n) { int i,j; for(i=0;i<n;i++) for(j=0;j<n;j++) { cout<<"Enter 1 if there is an edge from "<< i <<" “ << "to" <<" "<< j <<" otherwise enter 0 "<<endl; cin>>adj[i][j]; } }
حل المثال: ثم نبني الدالة indegree حيث تحسب عدد مرات ظهور الرقم 1 في كل عمود في مصفوفة الجوار باستخدام رقم العقدة التي سيتم حساب الحـواف الداخلة لها والذي يمثل دليل المصفوفة
وهي كالتالي: Intindegree(intadj[][MAX],intx,int n) { int i, count =0; for(i=0;i<n;i++) if( adj[i][x] ==1) count++; return(count); }
: حل المثال ثم نبني الدالة outdegree حيث تحسب عدد مرات ظهور الرقم 1في كل صف من مصفوفة الجوار باستعمال رقم العقدة (الرأس) التي ستحسبلها عدد الحواف
وهي كالتالي: int outdegree(int adj[][MAX],int x,int n) { int i, count =0; for(i=0;i<n;i++) if( adj[x][i] ==1) count++; return(count); }
:حل المثال وهنا يكونالبرنامج الرئيسي كالتالي : void main() { int adj[MAX][MAX], n, i; cout<<"Enter the number of nodes in graph maximum = “ <<MAX<<endl; cin>>n; buildadjm(adj,n);
for(i=0;i<n;i++){ cout<<"The indegree of the node "<<i<<" is” <<indegree(adj,i,n)<<endl; cout<<"The outdegree of the node“<<i<<"is” <<outdegree(adj,i,n)<< endl; } }
شرح البرنامج: يقوم هذا البرنامج أولا ببناء مصفوفة الجوار من خلال مناداة الدالةbuildadjmبعد ذلك يدخل في حلقة التكرار لحسـاب الحوافالداخلة والخارجة لكل عقدة في المخطط من خلال مناداة الدوال........... indegreeوoutdegreeعلى التوالي.
الدالةindegree تحسب عدد مرات ظهور الرقم 1 في كل عمود في مصفوفة الجوار بإستخدام رقم العقدة الـتي سيتم حساب الحواف الداخلة لها والذي يمثل دليل المصفوفة.
الدالةoutdegree تحسب عدد مرات ظهور الرقم 1في كل صف من مصفوفة الجوار بإستعمال رقم العقدة التي ستحسب لها عدد الحواف.
ثانيا: الشبكات NETWORKS تعرف الشبكة على انها مخطط هندسي Diagram يتكون من نقطة بدايةA ونقطة نهاية Fمتصلات فيما بينهما بمجموعة متتابعة من العقد Nods متصلة معا بعدد من الحواف Edges
(كل حافة تصل بين نقطتين او اكثر ) ولكل حافة من حوافه قيمة عددية موجبة تمثل وزن تلك الحافة
طرق ايجاد اقصر الممرات SHORTEST PATH ان ايجاد اقصر الممرات في المخطط الشبكي يعتمد على وجود ممر بين كل قيمتين في المخطط بحيث يكون مجموع اوزان الحواف هو الاقل
فمثلا: لإيجاد الطريق الأسرع للوصول من موقع الى آخر في مخطط الطرق نعمل على ايجاد اقصر الممرات بين هذه المواقع من خلال فحص جميع الطرق المؤدية الى الموقع المطلوب بداية من نقطة الانطلاق ونهــاية الى الوجهة المقصودة
ولإيجاد اقصر الممرات نستخدم احدى الطريقتين : الطريقة الاولى : باستخدام خوارزمية ديجكسترا(Dijkstra) الطريقة الثانية : باستخدام خوارزمية فلويد (Floyd)
الطريقة الاولى : • باستخدام خوارزمية ديجكسترا Dijkstra هناك العديد من الخوارزميات لإيجاد المسافة من قمة الى اخرى في المخطط منها خوارزمية Dijkstra حيث تقوم هذه الخوارزمية على تحديد المسافة من قمة محددة وجميع القمم الاخرى في المخطط
تبدأ خوارزمية Dijkstraمن قمة معينة تسمى نقطة المصدر(source) في المخطط الشبكي وتمتد حتى تصل الى جميع القمم الاخرى في المخطط وتقوم على تخزين المسافة الكلية من القمة المصدرية الى القمة المراد الوصول اليها
وللتوضيح اكثر تعمل خوارزمية Dijkstra على تخزين مجموع اقل تكلفة للحواف من نقطة البداية الى نقطة النهاية ومن الجدير بالذكر ان كفاءة هذه الخوارزمية هو O(n2)
مصفوفة تكلفة الجوار (Adjacency Matrix Cost) • مصفوفة الطول( Distance Matrix) • مصفوفة التخزين (Path Matrix) • مصفوفة العناصر (Include Matrix) تحتاج هذه الخوارزمية الى اربع مصفوفات وهي :
المصفوفة الأولى: مصفوفة تكلفة الجوار (Adjacency Matrix Cost) في الشكل التالي يظهر شكــل الشبكة