English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

NetworkX之Prim算法(实例讲解)

مقدمة

خوارزمية Prim تشبه خوارزمية دijkstra لأقصر المسار، حيث تستخدم استراتيجية الجشع. تبدأ الخوارزمية بإنشاء أقل حرف من حيث القيمة يُضيف إلى شجرة T، ثم تُضيف باستمرار أقل حرف من حيث القيمة E (يكون أحد أطرافه في T، والأخر في G-T). تنتهي الخوارزمية عند عدم وجود حرف يُلبي الشروط، وفي هذه الحالة يكون T شجرة توليد أقل لـ G.

NetworkX هو حزمة برمجية في Python لإنشاء وتعامل مع الشبكات المعقدة، وتعلم هيكل الشبكات المعقدة، وديناميكياتها وكيفية عملها. يُستخدم هذا المقال class networkx.Graph لإنجاز خوارزمية Prim.

النص الرئيسي

كود خوارزمية Prim

Prim

def prim(G, s):
 dist = {} # dist تسجل المسافة الأقل إلى العقد
 parent = {} # parent تسجل جدول الأباء لشجرة التوليد الأقل
 Q = list(G.nodes()) # Q تحتوي على جميع العقد التي لم تُغطى من قبل شجرة التوليد
 MAXDIST = 9999.99 # MAXDIST يمثل غير المحدود، أي أن العقد لا يُتواصلان
 # تعيين البيانات
 # جميع العقد الأقل مسافة معينة تُحدد كـMAXDIST، والبصلة الأم تُحدد كـNone
 لـ v في G.nodes():
  مسافة[v] = MAXDIST
  والد[v] = None
 # إعداد مسافة العقدة البداية 's' إلى 0
 مسافة[s] = 0
 # باستمرار استخراج العقدة الأقرب 'u' من Q وإضافته إلى شجرة التوليد الأدنى
 # عند تشغيل Q تكون فارغة، ينتهي الخوارزمية
 بينما Q:
  # استخراج العقدة الأقرب 'u'، وإضافة 'u' إلى شجرة التوليد الأدنى
  u = Q[0]
  لـ v في Q:
   إذا (مسافة[v] < مسافة[u]):
    u = v
  إزالة(Q)
  # تحديث مسافة الجيران الأقرب لـ u
  لـ v في G.adj[u]:
   إذا (v في Q) وأيضاً (G[u][v]['وزن'] < مسافة[v]):
    والد[v] = u
    مسافة[v] = G[u][v]['وزن']
 # نهاية الخوارزمية، العودة إلى جدول الأباء كشجرة التوليد الأدنى
 عدد_والد = والدا

بيانات اختبار

من ~ إلى 2 3 4 5 6 7 8
1 1.3 2.1 0.9 0.7 1.8 2.0 1.8
2 0.9 1.8 1.2 2.8 2.3 1.1
3 2.6 1.7 2.5 1.9 1.0
4 0.7 1.6 1.5 0.9
5 0.9 1.1 0.8
6 0.6 1.0
7 0.5

كود اختبار

استيراد matplotlib.pyplot كـ plt
استيراد networkx كـ nx
g_data = [(1, 2, 1.3), (1, 3, 2.1), (1, 4, 0.9), (1, 5, 0.7), (1, 6, 1.8), (1, 7, 2.0), (1, 8, 1.8), (2, 3, 0.9), (2, 4, 1.8), (2, 5, 1.2), (2, 6, 2.8), (2, 7, 2.3), (2, 8, 1.1), (3, 4, 2.6), (3, 5, 1.7), (3, 6, 2.5), (3, 7, 1.9), (3, 8, 1.0), (4, 5, 0.7), (4, 6, 1.6), (4, 7, 1.5), (4, 8, 0.9), (5, 6, 0.9), (5, 7, 1.1), (5, 8, 0.8), (6, 7, 0.6), (6, 8, 1.0), (7, 8, 0.5)]
def draw(g):
 pos = nx.spring_layout(g)
 nx.draw(g, pos, \

   arrows=True, \

   with_labels=True, \

   nodelist=g.nodes(), \

   style='dashed', \

   edge_color='b', \

   width=2, \

   node_color='y', \

   alpha=0.5)
 plt.show()
g = nx.Graph()
g.add_weighted_edges_from(g_data)
tree = prim(g, 1)
mtg = nx.Graph()
mtg.add_edges_from(tree.items())
mtg.remove_node(None)
draw(mtg)

نتيجة التنفيذ

هذا المقال عن Prim Algorithm في NetworkX (شرح عملي) هو كل محتوى قدمته لك، آمل أن يكون مرجعًا لك، وأتمنى أن تدعموا تعليمات النفخة.

البيان: محتوى هذا المقال تم جمعه من الإنترنت، يملك الحقوق الأصلية المالك الأصلي، تم إضافة المحتوى من قبل مستخدمي الإنترنت بطرقهم الخاصة، ويملك هذا الموقع حقوق الملكية، لم يتم تعديل المحتوى بشكل إنساني، ولا يتحمل هذا الموقع أي مسؤولية قانونية. إذا وجدت محتوى يشتبه في حقوق النسخ، فيرجى إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال #بـ @) للإبلاغ، وقدم الأدلة ذات الصلة، وسيتم حذف المحتوى المزعوم عن الفساد على الفور.