Là đạo hàm của một biểu đồ liên quan đến danh sách kề?


14

Một số tác phẩm của Conor McBride, Diff , Dissect , liên quan đến đạo hàm của các loại dữ liệu với "loại bối cảnh một lỗ" của chúng. Đó là, nếu bạn lấy đạo hàm của loại bạn còn lại với kiểu dữ liệu cho bạn biết kiểu dữ liệu trông như thế nào từ bên trong tại bất kỳ điểm nào.

Vì vậy, ví dụ, nếu bạn có một danh sách (trong Haskell)

data List a = [] | a : List a

cái này tương ứng với

data List a = 1 + a * List a

và thông qua một phép thuật toán học nhỏ, đạo hàm là

data ListDeriv a = List a * List a

được hiểu là tại bất kỳ thời điểm nào trong danh sách sẽ có một danh sách ở bên trái và một danh sách ở bên phải. Chúng tôi có thể nén qua danh sách ban đầu bằng cách sử dụng cấu trúc dữ liệu phái sinh.

Bây giờ, tôi thích làm một cái gì đó tương tự với đồ thị. Một biểu diễn phổ biến của đồ thị là một tập hợp các đỉnh và cạnh, có thể được triển khai một cách ngây thơ với một kiểu dữ liệu, chẳng hạn như:

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

Nếu tôi hiểu chính xác, một dẫn xuất của kiểu dữ liệu này, liên quan đến chỉ số biểu đồ i, sẽ là một cái gì đó như thế.

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

Tôi đã nhận được điều này thông qua việc sử dụng quy tắc sản phẩm và quy tắc chuỗi cho các công cụ phái sinh và mặc dù có thể có một số lỗi, nhưng nó dường như tuân theo sơ đồ chung. Trong cấu trúc này, bạn sẽ tập trung vào Nút (hàm tạo InNodes) hoặc Cạnh (Trong các cạnh) và được cung cấp vị trí bạn sẽ thấy dữ liệu có liên quan.

Nhưng đây không phải là điều tôi đã hy vọng. Tôi đã hy vọng về một cấu trúc có liên quan chặt chẽ hơn với giao diện của Thư viện đồ thị chức năng Martin Erwigs. Cụ thể, tôi muốn xem tại một nút một bối cảnh đại diện cho nhãn của nút và hai danh sách kề, một cho đi, một cho đến.

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

Tuy nhiên, tôi thấy hy vọng, vì đại diện kề kề có một số thuật ngữ chung với đạo hàm, lable lable a, tại mỗi vị trí lỗ, biểu diễn / phân tích kề của mỗi cạnh.

Vì một đạo hàm không giống như chức năng ban đầu, nhưng sự tích hợp của đạo hàm là (kindof), có một loại tương tự tích hợp nào sẽ phục vụ để chuyển đổi đạo hàm thành một tập hợp các bối cảnh nút không? Không phải là một sự tích hợp trực tiếp để khôi phục cấu trúc ban đầu, làm phiền bạn, nhưng một cấu trúc tương đương với bản gốc nhưng trong một biểu diễn thân thiện với thuật toán hơn.

Nếu có, tôi hy vọng rằng các cấu trúc kiểu mối quan hệ có thể được chỉ định bởi một số ngôn ngữ "tập hợp đỉnh và cạnh" dễ dàng và tôi có thể lấy được một thư viện hiệu quả để làm việc với cấu trúc đó. Việc cấy ghép như vậy có thể được sử dụng để nghiên cứu các cấu trúc "ngoài lý thuyết đồ thị": siêu đồ thị, phức tạp đơn giản ...

Vì thế. Liệu ý tưởng này có vẻ khả thi? Hữu ích? Đã có nghiên cứu nào về loại điều này mà tôi có thể đọc thêm về?

Phụ lục

Theo nhận xét của Curtis F , một tập hợp các nút và cạnh không chính xác là một biểu đồ. Tuy nhiên, tất cả các biểu đồ có thể được biểu diễn bằng như vậy, và tôi thấy nó đủ trình bày phổ biến. Tôi đã thấy (đặc điểm kỹ thuật rất thô) được sử dụng trong nghiên cứu áp dụng lý thuyết đồ thị để tối ưu hóa mạng không dây theo nhiều cách khác nhau. Đây là một ví dụ truy cập mở, DRAND *. Điều này đặt ra câu hỏi, liên kết giữa bài thuyết trình là gì và làm thế nào một số phần mềm có thể được thực hiện dựa trên nghiên cứu.G= =(V,E)

Điều đó nói rằng, tôi không hoàn toàn phản đối việc thay đổi thông số kỹ thuật đầu vào từ sang một thứ khác. Ví dụ, cung cấp một loại chỉ số I , nhãn nút, V , và nhãn cạnh, E . Sau đó, biểu đồ là (xấp xỉ) một chức năng từ các chỉ mục đến một danh sách nhãn và cạnh.G= =(V,E)TôiVE

G= =Tôi(V*TôiE)

Điều này, tôi khá chắc chắn có thể được thể hiện (Lý thuyết loại?) Là

(1)G= =(V*ETôi)Tôi

hoặc là

G= =VTôi*ETôi*Tôi

(1)

G'= =ln(V*ETôi)*(V*ETôi)Tôi*(ln(E)*V*ETôi)

Tôi nghĩ rằng nó cho thấy một số lời hứa, nhưng tôi thiếu sự tinh tế để đi xa hơn. Tôi biết phải có một số công việc ngoài kia để khám phá kết nối hơn nữa.

* Trong trường hợp liên kết bị đứt, trích dẫn: Rhee, Injong, et al. "DRAND: Lập kế hoạch TDMA ngẫu nhiên phân tán cho các mạng ad hoc không dây." Giao dịch của IEEE trên máy tính di động 8.10 (2009): 1384-1394.


Liên kết bạn cung cấp cho nghiên cứu đã chết. Bạn có thể cung cấp một liên kết lâu dài hơn, như DOI hoặc tạp chí mà nó đã được xuất bản không?
Curtis F

Câu trả lời:


5

Loại của bạn Grkhông thực sự tương ứng với biểu đồ, bởi vì nó bao gồm nhiều trường hợp rõ ràng không phải là biểu đồ, bởi vì các chỉ số cạnh không cần phải là chỉ số đỉnh thực tế.

Ví dụ,

V= ={Một,B}E= ={(C,D,e)}

không phải là biểu đồ, nhưng được cho phép trong loại của bạn như

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

Thay vào đó, Grnghĩa đen của bạn tương ứng với một danh sách các chỉ mục được gắn nhãn và một danh sách các cặp chỉ số được gắn nhãn riêng biệt, không liên quan. Đây là lý do tại sao bạn có được một đạo hàm "theo nghĩa đen" Grnhư vậy không tương ứng với "lỗ hổng" trong biểu đồ.

Ngoài ra còn có vấn đề đáng tiếc là quan tâm đến thứ tự các đỉnh / cạnh (có thể nhìn thấy trong nodesLeft/RightedgesLeft/Rightphân biệt) nhưng điều này có thể được khắc phục bằng cách sử dụng Setthay vì danh sách.


Đây là một loại được thể hiện bằng Haskell mà tôi nghĩ tương ứng chặt chẽ hơn với các biểu đồ (không trống):

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

Để đơn giản, thay vào đó tôi sẽ xem xét các biểu đồ hoàn chỉnh, đơn giản, không bị chặn:

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

(Để thư giãn hoàn toàn, hãy e = Boolđánh dấu sự hiện diện cạnh)

Lưu ý rằng Graphlà đệ quy (và trên thực tế, đệ quy tham số). Đây là những gì cho phép chúng ta giới hạn bản thân loại chỉ vào biểu đồ và không chỉ danh sách kề là kết hợp với danh sách đỉnh.

Viết đại số hơn,

G(v,e)= =v+v*G(v*e,e)

evG

G(v)= =v+v*G(v*e)

Bằng cách liên tục mở rộng, chúng tôi có được điểm cố định

G(v)= =v1e(12)+v2e(22)+v3e(32)+v4e(42)+Giáo dục

Điều này có ý nghĩa, vì một đồ thị (hoàn chỉnh) là một trong hai

  • Một đỉnh và không có cạnh
  • Hai đỉnh và một cạnh
  • Ba đỉnh và ba cạnh
  • Bốn đỉnh và bốn chọn 2 = 6 cạnh
  • ....

kGk(v)= =vke(k2)G(v)= =G1(v)+G2(v)+Giáo dục

trong đó có đạo hàm

ddvG(v)= =ΣTôi= =1GTôi'(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)*k*ek-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)

Thứ tự sửa chữa trong biểu đồ này

Phiên bản cấu trúc dữ liệu đồ thị này về cơ bản là một danh sách được liên kết và do đó, nó mã hóa thứ tự các đỉnh. Mặc dù điều đó có thể được sửa trong phiên bản danh sách kề của bạn bằng cách sử dụng Bộ, nhưng nó không trực tiếp ở đây.

Tôi nghĩ rằng bạn có thể sửa đổi cấu trúc dữ liệu cây để thực hiện cùng một kiểu đệ quy tham số, với gốc đóng vai trò "đầu" thực hiện SimpleGraph. Theo giao diện của các tập hợp cây kết quả, cấu trúc thứ tự / cơ bản trở nên vô hình (hoặc thậm chí là chuẩn, nếu bạn không quan tâm đến các bản cập nhật nhanh).

Đạo hàm đề xuất của bạn

Bạn đã đề xuất một loại phái sinh; Tôi sẽ thay đổi nó để ghi nhãn và chỉ số như tôi đã làm:([(v,e)], [(v,e)])

1(1-ve)2C+v1-ve(v, [(v, e)])

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.