Pages

Monday, September 12, 2011

Python’da NetworkX ile Graph Denemeleri

Geçen dönem C ile gördüğümüz graph algoritmalarını bir de Python ile denemek istedim. Ve bu işlemleri daha kolay yapabileceğimiz bir kütüphane arayışına girdim. Stackoverflow’da bu konuyla alakalı şu soruyu da görünce, NetworkX ile tanışmış oldum.

Gerekli yüklemeleri yaptıktan sonra, bu kütüphaneyle biraz uğraşmak adına unweighted (unit-weight) shortest path algoritmasını yazmayı denedim. Ve de bu kütüphanenin özelliklerinden biri olan ve beni heyecanlandıran oluşturduğumuz graph’ları mathplotlib ile çizdirme özelliğini de görmek istedim.

C ile yazarken graph’ı tutmak için 2 boyutlu array kullanmıştık ve bu array’in boyutunu da node sayısı belirlemişti. Node’ların komşuluklarını (adjacency) belirlemek için ise kesişim yerlerine flag koymuştuk, Graph[1][3] = -1 gibi. Eğer unweighted değilse, iki node’un arasındaki ağırlık neyse onu yazmıştık.

NetworkX’te ise herşey daha kolay. Kullanıcının işini kolaylaştıran add_node(), add_edge() vb. methodlar var. Eğer edge’lere ağırlık eklemek istersek G.add_edge(1, 2, weight=4.7 )
ve G.edge[1][2]['weight'] = 4 gibi kullanımlar mevcut.

Kendi sitesindeki başlangıç tutorial’ı için buraya bakabilirsiniz. Gerçekten uğraşması zevkli bir kütüphane.

Yazıyı bitirmeden önce bahsettiğim algoritmayı ve çıktı resmini ekliyorum.


Kaynak 3, hedef 6 iken oluşan görüntü:


Aslında kodun bu kadar uzun sürmemesi gerekiyordu. Ben çıktıyı biraz daha süslemek istediğim için oldu galiba. Bu süslemeyi yaparken de şuradaki örnek çok işime yaramıştı.

Görüşmek üzere.