Apakah turunan dari grafik terkait dengan daftar adjacency?

14

Beberapa karya Conor McBride, Diff , Dissect , mengaitkan turunan tipe data dengan "tipe konteks satu lubang" mereka. Yaitu, jika Anda mengambil turunan dari tipe Anda dibiarkan dengan tipe data yang menunjukkan kepada Anda bagaimana tipe data terlihat dari dalam pada titik tertentu.

Jadi, misalnya, jika Anda memiliki daftar (di Haskell)

data List a = [] | a : List a

ini sesuai dengan

data List a = 1 + a * List a

dan melalui sedikit keajaiban matematika, turunannya adalah

data ListDeriv a = List a * List a

yang diartikan sebagai bahwa pada setiap titik dalam daftar akan ada daftar di sebelah kiri dan daftar di sebelah kanan. Kami dapat zip melalui daftar asli dengan menggunakan struktur data turunan.

Sekarang, saya tertarik melakukan sesuatu yang mirip dengan grafik. Representasi umum dari grafik adalah seperangkat simpul dan tepi, yang mungkin secara naif diimplementasikan dengan tipe data seperti:

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

Jika saya memahaminya dengan benar, turunan dari tipe data ini, sehubungan dengan indeks grafik i,, harus berupa sesuatu.

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)] }

Saya mendapatkan ini melalui penggunaan aturan produk dan aturan rantai untuk turunan, dan meskipun mungkin ada beberapa kesalahan, tampaknya mengikuti skema umum. Dalam struktur ini Anda akan fokus pada Nodes (InNodes constructor) atau Edges (In edge) dan diberikan tempat Anda akan melihat data yang relevan.

Tapi ini bukan yang kuharapkan. Saya berharap untuk membangun lebih dekat terkait dengan antarmuka Perpustakaan Grafik Fungsional Martin Erwigs. Secara khusus, saya ingin melihat pada sebuah konteks konteks yang mewakili label node dan dua daftar adjacency, satu untuk keluar, satu untuk masuk.

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

Saya memang melihat harapan, bagaimanapun, karena perwakilan adjacency memiliki beberapa istilah yang sama dengan turunan, label tunggal a,, di setiap lokasi lubang, perwakilan adjacency / pembedahan setiap sisi.

Karena turunan bukan fungsi yang sama dengan aslinya, tetapi integrasi turunan adalah (kindof), apakah ada semacam analog integrasi yang akan berfungsi untuk mengubah turunan menjadi kumpulan konteks simpul? Bukan integrasi langsung untuk memulihkan struktur asli, ingatlah, tetapi struktur yang setara dengan yang asli tetapi dalam representasi yang lebih ramah algoritma.

Jika ada, saya berharap bahwa struktur tipe hubungan dapat ditentukan oleh beberapa bahasa "set simpul dan tepi" yang mudah dan saya dapat memperoleh perpustakaan yang efisien untuk bekerja dengan struktur itu. Penerapan seperti itu dapat digunakan untuk mempelajari struktur "di luar teori grafik": grafik hiper, kompleks sederhana ...

Begitu. Apakah ide ini tampak layak? Berguna? Apakah ada studi tentang hal semacam ini yang bisa saya baca lebih lanjut?

Tambahan

Seperti yang dikomentari oleh Curtis F , satu set node dan edge bukan grafik. Namun, semua grafik dapat direpresentasikan dengan demikian, dan menurut saya presentasi itu cukup umum. Saya telah melihat (spesifikasi sangat kasar) G=(V,E) digunakan dalam penelitian yang menerapkan teori grafik untuk optimalisasi jaringan nirkabel dalam berbagai cara. Ini contoh akses terbuka, DRAND *. Hal ini menimbulkan pertanyaan, apa hubungan antara presentasi dan bagaimana beberapa perangkat lunak dapat diimplementasikan berdasarkan penelitian.

Yang mengatakan, saya tidak sepenuhnya menentang mengubah spec input dari ke sesuatu yang lain. Misalnya, diberi indeks tipe I , label simpul, V , dan label tepi, EG=(V,E)sayaVE . Kemudian grafiknya adalah (kurang-lebih) fungsi dari indeks ke label dan daftar tepi.

G=saya(VsayaE)

Ini, saya cukup yakin dapat dinyatakan (Kategori teori?) Sebagai

(1)G=(VEsaya)saya

atau

G=VsayaEsayasaya

(1)

G=dalam(VEsaya)(VEsaya)saya(dalam(E)VEsaya)

Saya pikir itu menunjukkan beberapa janji, tetapi saya tidak memiliki kecanggihan untuk melangkah lebih jauh. Saya tahu pasti ada beberapa pekerjaan di luar sana yang mengeksplorasi koneksi lebih lanjut.

* Jika tautannya terputus, kutipan: Rhee, Injong, et al. "DRAND: Penjadwalan TDMA acak yang didistribusikan untuk jaringan ad hoc nirkabel." Transaksi IEEE pada Mobile Computing 8.10 (2009): 1384-1396.

koki trevor
sumber
Tautan yang Anda berikan untuk penelitian sudah mati. Bisakah Anda memberikan tautan yang lebih permanen, seperti ke DOI atau jurnal tempat penerbitannya?
Curtis F

Jawaban:

5

Tipe kamu Gr Anda tidak benar-benar sesuai dengan grafik, karena mencakup banyak contoh yang jelas bukan grafik, karena indeks tepi tidak perlu indeks titik sebenarnya.

Sebagai contoh,

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

bukan grafik, tetapi diizinkan dalam tipe Anda sebagai

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

Sebaliknya, Anda Grsecara harfiah berkorespondensi dengan daftar indeks berlabel dan daftar pasangan indeks berlabel terpisah. Inilah sebabnya mengapa Anda mendapatkan turunan "harfiah" dariGr yang tidak sesuai dengan "lubang" dalam grafik.

Ada juga masalah yang disayangkan dalam memerhatikan urutan simpul / tepi (terlihat pada bagian nodesLeft/Rightdan edgesLeft/Rightperbedaannya) tetapi hal ini dapat diperbaiki dengan menggunakan daftar Setalih - alih.


Berikut adalah tipe yang diekspresikan dalam Haskell yang menurut saya lebih dekat dengan grafik (tidak kosong):

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

Untuk kesederhanaan, saya akan mempertimbangkan grafik yang lengkap, sederhana, tidak terarah:

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

(Untuk bersantai sepenuhnya, biarkan e = Booltandai keberadaan tepi)

Catatan yang Graphrekursif (dan faktanya, rekursif parametrik). Inilah yang memungkinkan kita untuk membatasi diri kita sendiri tipe hanya grafik dan bukan hanya daftar adjacency dikombinasikan dengan daftar vertex.

Ditulis lebih aljabar,

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

evG :

G(v)=v+vG(ve)

Dengan berekspansi berulang kali, kami mendapatkan poin tetap

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

Ini masuk akal, karena grafik (lengkap) adalah baik

  • Satu simpul dan tanpa ujung
  • Dua simpul dan satu ujung
  • Tiga simpul dan tiga ujung
  • Empat simpul dan empat pilih 2 = 6 tepi
  • ....

kGk(v)=vke(k2)G(v)=G1(v)+G2(v)+...

yang memiliki turunan

ddvG(v)=saya=1Gsaya(v)

Gk(v)=ddv[vkek(k-1)2]=kvk-1ek(k-1)2

Gk-1(v)=vk-1e(k-1)(k-2)2Gk(v)=Gk-1(v)kek-1

kk-1k-1k-1k

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)

Memperbaiki Urutan dalam grafik ini

Versi struktur data Grafik ini pada dasarnya adalah linked-list, dan dengan demikian mengkodekan urutan simpul. Sementara itu bisa diperbaiki di versi daftar kedekatan Anda dengan menggunakan Set, itu tidak begitu langsung di sini.

Saya pikir Anda dapat memodifikasi struktur data pohon untuk melakukan jenis rekursi parametrik yang sama, dengan root memainkan peran seperti yang dilakukan "head" SimpleGraph . Dengan antarmuka set pohon yang dihasilkan, susunan / struktur dasar menjadi tidak terlihat (atau bahkan kanonik, jika Anda tidak tertarik dengan pembaruan cepat).

Usulan Derivatif Anda

Anda mengusulkan jenis turunan; Saya akan mengubahnya untuk mengonfigurasi label dan indeks seperti yang saya lakukan:([(v,e)], [(v,e)])

1(1-ve)2C+v1-ve , atau adil (v, [(v, e)]). Ini tidak memiliki informasi yang cukup untuk merekonstruksi seluruh grafik , karena informasi "edge" hanya mengidentifikasi satu titik.

Curtis F
sumber