اینم یه تجربه پراکنده دیگه!
من این چند روز بخاطر یه کاری نیاز داشتم یه مساله تئوری گراف رو حل کنم. من معمولا سعی میکنم که توی کارها یه چیز جدید رو یاد بگیرم. به همین خاطر با استفاده از ipython notebook یا jupyter notebook مساله رو حل کردم. اتفاقا جادی هم یه ویدئوی آموزشی خوب در موردش ساخته.
خب اول از همه میخوام یه چیزایی رو توضیح بدم که به نظر من چرا شاید کسی بخواد از این سیستمها استفاده کنه. مهمترین استفادهای که من براش داشتم اینه که هر جا که به نظرم میخواستم از matlab استفاده کنم میتونستم از jupyter notebook استفاده کنم. بدین شکل که شما برای خیلی کارهای علمی یه کارهایی رو توی matlab پیادهسازی میکنی و تست میکنی و وقتی لازم شد واقعا در محیط عملیاتی ازش استفاده کنی اونها رو در محیط عملیاتی دوباره پیادهسازی میکنی.
خب اولین زبانی که jupyter notebook پشتیبانی میکرده python بوده که مثل زبان matlab ساده بوده و بخاطر پکیجهای عملی که هر دو زبان دارن پیادهسازی کارهای علمی به شدت ساده میشه.
دوم اینکه هر دو از مفهوم به نام متغیرهای مشترک بین همه برنامههای مختلف پشتیبانی میکنن که باعث میشه شما یه کار پر هزینه رو یه بار انجام بدی و نتیجه رو داشته باشی و مراحل بعدی رو براساس اون و بدون نیاز به اجرای از اول اون بخش پر هزینه انجام بدی
سوم اینکه هر دو ابزارهای بسیار خوب و قوی برای کشیدن نمودارهای علمی دارن که باعث میشه گزارش ساختن با اونها راحت باشه.
چهارم اینکه در jupyter notebook شما میتونید همزمان که کد مینویسید گزارش هم بنویسید. یعنی بلوکهایی داریم که توش میشه با استفاده از markdown متن هم بنویسید که در نهایت گزارش کاری که دارید انجام میدید هم آماده باشه. لازم نیست تکرار کنم که markdown رو من خیلی دوست دارم(1 و 2 و 3)
حالا کار من این بود که بتونم یه گراف جهتدار بدون دور بسازم و بتونم اون رو بکشم. خب اول از هم نحوه ساختن اون. کلا در ریاضی اثبات میشه که اگه بخواید گراف جهتدار بدون دور بسازید تنها چیزی که نیاز دارید اینه که توی ماتریس مجاورت اون گراف تنها درایههای زیر قطر اصلی ۱ باشن. این تضمین میکنه که گراف تولید شده گراف جهتدار بدون دور باشه.
اول از همه باید نیازمندی ها رو وارد کرد
%matplotlib inline
import numpy as np
import random
import networkx as nx
import matplotlib.pyplot as plt
from nxpd import draw
from nxpd import nxpdParams
import copy
nxpdParams['show'] = 'ipynb'
بعد نوبت به کد ساختن DAG میرسه که کد این کار اینه
def generateDAG(nodeNo, edgeProb):
adj = np.zeros((nodeNo, nodeNo))
G=nx.DiGraph()
deps = dict()
nodeLables = list(range(nodeNo))
addedLabels = list()
for i in range(nodeNo):
lIdx = random.randrange(len(nodeLables))
lable = nodeLables[lIdx]
addedLabels.append(lable)
nodeLables.remove(lable)
G.add_node(str(addedLabels[i]))
deps[str(addedLabels[i])] = set()
for j in range(i):
rnd = random.random()
if rnd < edgeProb and i != j:
G.add_edge(str(addedLabels[j]), str(addedLabels[i]))
deps[str(addedLabels[i])].add(str(addedLabels[j]))
adj[i,j]= 1
return (adj, G, deps)
بعدش هم میشه نمایش دادنش که به سادگی میشه این
nodeCount = 10
dependencyProbability= 0.7
dag, G, deps = generateDAG(nodeCount,dependencyProbability)
draw(G)
نتیجه کار هم توی github قرار گرفته و از اینجا قابل مشاهده است. همین!