Bir grafiğin türevi bitişiklik listeleriyle ilişkili mi?


14

Conor McBride'ın bazı çalışmaları Diff , Dissect , veri türlerinin türevini "tek delikli bağlamlar" ile ilişkilendirir. Yani, türün türevini alırsanız, veri türünün herhangi bir noktada içeriden nasıl göründüğünü gösteren bir veri türüyle kalırsınız.

Örneğin, bir listeniz varsa (Haskell'de)

data List a = [] | a : List a

bu karşılık gelir

data List a = 1 + a * List a

ve biraz matematiksel bir sihir sayesinde,

data ListDeriv a = List a * List a

Bu, listenin herhangi bir noktasında solda bir liste ve sağda bir liste olacağı anlamına gelir. Türev veri yapısını kullanarak orijinal listede gezinebiliriz.

Şimdi, grafiklere benzer bir şey yapmak istiyorum. Grafiklerin ortak bir temsili, aşağıdakiler gibi bir veri türüyle saf bir şekilde uygulanabilen bir dizi köşe ve kenardır:

data Gr a b i = Gr [(i,a)] [(i,i,b)]

Doğru anlıyorsam, bu veri tipinin bir türevi, grafik indeksine göre i, böyle bir şey olmalıdır.

data GrDeriv a b i = d/di (Gr a b i)
     = d\di ( [a*i] * [b*i^2] )
     = (d\di [a*i]) * [b*i^2] ) + [a*i]*(d/di [b*i^2])
     = (a* [a*i] * [a*i]) * [b*i^2] ) 
       + [a*i] * (2*b*i) *[b*i^2]*[b*i^2])
     = InNodes { nodesLeft :: [(a,i)]
               , nodeLbl :: a
               , nodesRight :: [(a,i)]
               , edges :: [(b,i,i)] }
     | InEdges { nodes :: [(a,i)]
               , adjNode :: Either (b,i) (b,i)
               , edgesLeft :: [(b,i,i)]
               , edgesRight :: [(b,i,i)] }

Bunu türevler için ürün kuralı ve zincir kurallarını kullanarak aldım ve muhtemelen bazı hatalar olsa da, genel şemayı takip ediyor gibi görünüyor. Bu yapıda Düğümlere (InNodes yapıcısı) veya Kenarlara (Kenarlarda) odaklanacak ve ilgili verileri görebileceğiniz yere verilecektir.

Ama umduğum bu değildi. Martin Erwigs Fonksiyonel Grafik Kütüphanesi'nin arayüzü ile daha yakından ilgili bir yapı umuyordum. Özellikle, bir düğümde düğümün etiketini temsil eden bir bağlam ve biri giden, diğeri gelen olmak üzere iki bitişik liste görmek istiyorum.

Node a b = ([(i,b)],a,[(i,b)])

Bununla birlikte, bitişiklik gösteriminin türev, yalnız etikel, aher bir delik konumunda, her bir kenarın bitişiklik gösterimi / diseksiyonu ile ortak bazı terimleri olduğu için umut görüyorum .

Bir türev, orijinal ile aynı işlev olmadığından, ancak türevin bir entegrasyonu (kindof) olduğundan, türevi bir düğüm bağlamları koleksiyonuna dönüştürmeye yarayacak bir çeşit entegrasyon analogu var mı? Orijinal yapıyı kurtarmak için doğrudan bir entegrasyon değil, dikkat edin, ancak orijinaline eşdeğer bir yapı ama daha algoritma dostu bir sunumda.

Varsa, ilişki türü yapıların bazı kolay "köşe ve kenar kümesi" diliyle belirtilebileceğini ve bu yapı ile çalışmak için verimli bir kütüphane elde edebileceğimi umuyorum. Böyle bir uygulama "grafik teorisinin ötesinde" yapıları incelemek için kullanılabilir: hiper grafikler, basit kompleksler ...

Yani. Bu fikir uygulanabilir görünüyor mu? İşe yarar? Bu tür şeyler hakkında daha fazla bilgi edinebileceğim bir çalışma oldu mu?

ek

Curtis F tarafından yorumlandığı gibi , bir dizi düğüm ve kenar tam olarak bir grafik değildir. Ancak, tüm grafikler bu şekilde temsil edilebilir ve bunu yeterince yaygın buluyorum. Kablosuz ağların optimizasyonuna grafik teorisini çeşitli şekillerde uygulayan araştırmalarda kullanılan çok kaba şartname) gördüm . İşte açık erişim örneği DRAND *. Bu, sunum arasındaki bağlantı ve araştırmaya dayalı olarak bazı yazılımların nasıl uygulanabileceği sorusunu gündeme getirmektedir.G=(V,E)

Bununla birlikte, giriş spesifikasyonunun den başka bir şeye değiştirilmesine tamamen karşı değilim . Örneğin, bir indeks türü verilen , düğüm etiketler, , ve kenar etiketler, . Daha sonra grafik, dizinlerden etiket ve kenar listesine kadar (yaklaşık olarak) bir işlevdir.G=(V,E)IVE

G=I(VIE)

Bu, eminim (Kategori teorisi?)

(1)G=(VEI)I

veya

G=VIEII

Yeterli uyarı verildiğinde, bir dizi köşe ve kenar olarak görülebilir. Bununla birlikte, in türevinin anlamlı olup olmadığı açık değildir :(1)

G=ln(VEI)(VEI)I(ln(E)VEI)

Biri için bir vaat gösterdiğini düşünüyorum, ama daha ileri gitmek için sofistike değilim. Orada daha fazla bağlantı keşfetmek bazı çalışmalar olması gerektiğini biliyorum.

* Bağlantının kopması durumunda alıntı: Rhee, Injong, et al. "DRAND: Kablosuz ad hoc ağlar için dağıtılmış rasgele TDMA zamanlama." Mobil Hesaplamada IEEE İşlemleri 8.10 (2009): 1384-1396.


Araştırma için verdiğiniz bağlantı öldü. DOI veya yayınlandığı dergi gibi daha kalıcı bir bağlantı verebilir misiniz?
Curtis F

Yanıtlar:


5

Türünüz Grgerçekten grafiklere karşılık gelmez, çünkü açıkça grafik olmayan birçok örnek içerir, çünkü kenar indekslerinin gerçek tepe indeksleri olması gerekmez.

Örneğin,

V={A,B}E={(C,D,e)}

bir grafik değil, ancak türünüzde

Gr [(1, A), (2, B)] [(3, 4, e)]

Bunun yerine, Grkelimenin tam anlamıyla etiketlenmiş dizinler listesine ve ayrı, ilişkisiz, etiketlenmiş dizin çiftleri listesine karşılık gelir. Bu nedenle Gr, grafiklerde "deliklere" karşılık gelmeyen böyle bir "değişmez" türev elde edersiniz .

Köşelerin / kenarların sırasını ( nodesLeft/Rightve edgesLeft/Rightayrımlarda görülebilir) önemsemek de talihsiz bir sorun var, ancak bu Setliste yerine bir liste kullanılarak düzeltilebilir .


İşte Haskell'de ifade edilen (boş olmayan) grafiklere daha yakın olduğunu düşündüğüm bir tür:

data Graph v e = Lone v | Joined v (Graph (v, ([e], [e])) e)

Basitlik için, bunun yerine tam, basit, yönlendirilmemiş grafikleri ele alacağım:

data Graph v e = Lone v | Joined v (Graph (v, e) e)

(Tamamen rahatlamak için e = Boolkenar varlığını işaretleyin)

Bunun Graphözyinelemeli (ve aslında parametrik olarak özyinelemeli) olduğuna dikkat edin. Bu, kendimizi, yalnızca köşe listeleriyle komşu bitiş listeleriyle değil, yalnızca grafiklerle sınırlandırmamıza olanak tanır.

Daha cebirsel olarak yazılmış,

G(v,e)=v+vG(ve,e)

Yana değişmez , ben ikinci argümanı ortadan kaldırmak için gidiyorum :evG

G(v)=v+vG(ve)

Tekrar tekrar genişleyerek, sabit noktayı elde ederiz.

G(v)=v1e(12)+v2e(22)+v3e(32)+v4e(42)+

(Tam) bir grafik ya

  • Bir köşe ve kenar yok
  • İki köşe ve bir kenar
  • Üç köşe ve üç kenar
  • Dört köşe ve dört 2 = 6 kenar seçer
  • ....

grafik türü türünü çağırın . SonrakGk(v)=vke(k2)G(v)=G1(v)+G2(v)+

türevi olan

ddvG(v)=i=1Gi(v)

Türev

Gk(v)=ddv[vkek(k1)2]=kvk1ek(k1)2

Not bu , bu nedenle buGk1(v)=vk1e(k1)(k2)2Gk(v)=Gk1(v)kek1

Yani, bir türevi -node grafiktir ile birlikte düğüm grafik, için çıkarılan düğümünden kenarları kalan düğümleri ve dizin düğümü listesinde işgal köşe noktası.kk1k1k1k

data SimpleGraph v e = Lone v | Joined v (SimpleGraph (v, e) e)

data SimpleGraphHole v e = Empty
                         | InsertLater v (SimpleGraphHole (v, e) e)
                         | InsertHere (SimpleGraph (v, e) e)

Bu grafikteki Sabitleme Sırası

Grafik veri yapısının bu sürümü temel olarak bağlantılı bir listedir ve bu nedenle köşelerin sırasını kodlar. Bu, bir Set kullanılarak bitişik liste sürümünüzde düzeltilebilse de, burada çok doğrudan değil.

Ben bir ağaç veri-yapısını aynı tür parametrik özyineleme yapmak için değiştirebilirsiniz, kök "kafa" rol oynuyor SimpleGraph. Ortaya çıkan ağaç setlerinin arayüzü ile, sipariş / temel yapı görünmez hale gelir (veya hızlı güncellemelerle ilgilenmiyorsanız bile kanonik).

Önerilen Türeviniz

Bir türev türü önerdiniz; Etiketleri ve endeksleri benim yaptığım gibi birleştirmek için değiştireceğim:([(v,e)], [(v,e)])

Bu , olan veya sadece olarak entegre edilebilir . Bu, tüm bir grafiği yeniden oluşturmak için yeterli bilgiye sahip değildir , çünkü "edge" bilgileri sadece tek bir tepe noktasını tanımlar.1(1ve)2C+v1ve(v, [(v, e)])

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.