Skip to content

Latest commit

 

History

History
84 lines (61 loc) · 5.6 KB

jop-ipython.md

File metadata and controls

84 lines (61 loc) · 5.6 KB

اینم یه تجربه پراکنده دیگه!

من این چند روز بخاطر یه کاری نیاز داشتم یه مساله تئوری گراف رو حل کنم. من معمولا سعی میکنم که توی کارها یه چیز جدید رو یاد بگیرم. به همین خاطر با استفاده از ipython notebook یا jupyter 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 قرار گرفته و از اینجا قابل مشاهده است. همین!