그래프의 미분은 인접리스트와 관련이 있습니까?


14

Conor McBride의 일부 작품 인 Diff , Dissect 는 데이터 유형의 파생물을 "단일 컨텍스트 유형"과 관련시킵니다. 즉, 유형의 미분을 취하면 데이터 유형이 주어진 지점에서 내부에서 어떻게 보이는지 보여주는 데이터 유형이 남습니다.

예를 들어 (Haskell에) 목록이 있다면

data List a = [] | a : List a

이것은에 해당

data List a = 1 + a * List a

약간의 수학적 마술을 통해 미분은

data ListDeriv a = List a * List a

이는 목록의 어느 시점에서든 왼쪽에 목록이 있고 오른쪽에 목록이 있음을 의미하는 것으로 해석됩니다. 미분 데이터 구조를 사용하여 원래 목록을 압축 할 수 있습니다.

저는 그래프와 비슷한 일을하고 싶습니다. 그래프의 일반적인 표현은 다음과 같은 데이터 유형으로 순진하게 구현 될 수있는 정점과 모서리의 집합입니다.

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

내가 올바르게 이해하면 그래프 색인과 관련 하여이 데이터 유형의 파생물은 i비슷해야합니다.

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

파생 상품에 대해 제품 규칙 및 체인 규칙을 사용하여 이것을 얻었으며 약간의 오류가있을 수는 있지만 일반적인 계획을 따르는 것 같습니다. 이 구조에서는 Nodes (InNodes 생성자) 또는 Edges (Edges)에 중점을두고 관련 데이터를 볼 수있는 곳이 주어집니다.

그러나 이것은 내가 바랐던 것이 아닙니다. Martin Erwigs Functional Graph Library의 인터페이스와 더 밀접한 관련이있는 구조를 원했습니다. 특히, 노드의 레이블과 두 개의 인접 목록 (발 신용, 수 신용)을 나타내는 컨텍스트를 노드에서보고 싶습니다.

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

그러나 인접성 표현이 파생물, 고독한 lable, a각 구멍 위치에서 각 모서리의 인접성 표현 / 해부 와 공통 인 용어가 있기 때문에 희망이 있습니다.

미분은 원래와 동일한 기능이 아니지만 미분의 통합은 (종류), 미분을 노드 컨텍스트의 모음으로 변환하는 데 사용되는 일종의 통합 아날로그가 있습니까? 원래 구조를 복구하기위한 직접 통합은 아니지만, 원래 구조와 동일하지만보다 알고리즘 친화적 인 구조로 된 구조입니다.

있는 경우 관계 유형 구조를 "정점과 모서리의 쉬운"언어로 지정할 수 있기를 바라며 해당 구조를 사용하기위한 효율적인 라이브러리를 도출 할 수 있습니다. 이러한 구현은 "그래프 이론을 넘어서"구조를 연구하는 데 사용될 수 있습니다 : 하이퍼 그래프, 단순화 복합 ...

그래서. 이 아이디어가 실현 가능한 것 같습니까? 유능한? 내가 읽을 수있는 이런 유형의 것에 대한 연구가 있습니까?

추가

Curtis F가 언급했듯이 노드와 모서리 세트는 정확히 그래프가 아닙니다. 그러나 모든 그래프는 그러한 것으로 나타낼 수 있으며, 나는 그것이 충분히 일반적인 표현이라는 것을 알았습니다. 나는 무선 네트워크의 최적화에 다양한 방법으로 그래프 이론을 적용하는 연구에 사용 된 매우 거친 사양) 보았습니다 . 다음은 공개 액세스 예인 DRAND *입니다. 이것은 연구, 프레젠테이션에 기초한 프레젠테이션과 일부 소프트웨어가 어떻게 구현 될 수있는 가라는 문제를 제기합니다.G=(V,E)

즉, 입력 사양을 에서 다른 것으로 변경하는 것에 전적으로 반대하지 않습니다 . 예를 들어, 색인 유형 , 노드 레이블 및 가장자리 레이블 됩니다. 그런 다음 그래프는 인덱스에서 레이블 및 가장자리 목록까지의 함수입니다.IG=(V,E)IVE

G=I(VIE)

이것은 (범주 이론?)으로 표현 될 수 있다고 확신합니다.

(1)=(V이자형나는)나는

또는

=V나는이자형나는나는

이것은 충분한주의 사항이 주어진 정점과 모서리의 집합으로 볼 수 있습니다. 그러나 의 미분 이 의미가 있는지 명확하지 않습니다 .(1)

'=ln(V이자형나는)(V이자형나는)나는(ln(이자형)V이자형나는)

나는 그것이 어떤 약속을 보여 준다고 생각하지만, 더 나아갈 정교함이 부족합니다. 나는 더 많은 연결을 탐구해야 할 일이 있다는 것을 안다.

* 연결이 끊어 질 경우 인용 : Rhee, Injong, et al. "DRAND : 무선 애드혹 네트워크를위한 분산 무작위 TDMA 스케줄링." 모바일 컴퓨팅 8.10 (2009)의 IEEE 트랜잭션 : 1384-1396.


연구를 위해 제공 한 링크가 죽었습니다. DOI 또는 출판 된 저널과 같이보다 영구적 인 링크를 제공 할 수 있습니까?
커티스 F

답변:


5

Gr가장자리 인덱스는 실제 꼭짓점 인덱스 일 필요가 없으므로 그래프가 아닌 많은 인스턴스가 포함되어 있으므로 실제로 유형에 해당하는 유형 이 아닙니다.

예를 들어

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

그래프는 아니지만 다음과 같이 유형에 허용됩니다.

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

오히려 Gr문자 그대로 레이블이 지정된 인덱스 목록과 레이블이없는 별도의 레이블이 지정된 인덱스 쌍 목록에 해당합니다. 이것이 Gr그래프의 "구멍"에 해당하지 않는 "리터럴"파생물을 얻는 이유 입니다.

또한 정점 / 가장자리의 순서 ( nodesLeft/RightedgesLeft/Right구별 에서 볼 수 있음) 를 돌보는 불행한 문제가 있지만 Set목록 대신에이를 사용하여 해결할 수 있습니다 .


다음은 Haskell로 표현 된 유형으로, 비어 있지 않은 그래프와 더 밀접하게 일치한다고 생각합니다.

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

간단하게하기 위해, 대신 완전하고 간단한 무 방향 그래프를 고려하겠습니다.

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

(완벽 함을 완화하려면 e = Bool가장자리 유무 표시)

Graph(사실, 파라 메트릭 재귀) 재귀입니다. 이것이 바로 정점 목록과 결합 된 인접 목록뿐만 아니라 그래프만으로 유형을 제한 할 수있게하는 것입니다.

더 대수적으로 쓰여진

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

evG

G(v)=v+vG(ve)

반복적으로 확장함으로써 고정 점을 얻습니다.

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

(완전한) 그래프는 다음 중 하나이므로

  • 하나의 꼭지점과 가장자리 없음
  • 꼭지점 2 개와 모서리 1 개
  • 3 개의 꼭지점과 3 개의 모서리
  • 4 개의 꼭지점과 4 개의 꼭지점은 2 = 6 모서리를 선택합니다
  • ....

크기 그래프 유형 호출하십시오 . 그런 다음kGk(v)=vke(k2)G(v)=G1(v)+G2(v)+

파생물이있는

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

미분

Gk(v)=ddv[vkek(k1)2]=kvk1이자형케이(케이1)2

참고 , 그래서케이1(V)=V케이1이자형(케이1)(케이2)2케이'(V)=케이1(V)케이이자형케이1

즉, (A)의 유도체 인 - 노드 그래프 인 결합 노드 그래프, 받는 제거 된 노드로부터 에지 나머지 노드 및 인덱스 노드의 목록에 점령 정점.케이케이1케이1케이1케이

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)

이 그래프에서 고정 순서

이 버전의 그래프 데이터 구조는 기본적으로 링크 된 목록이므로 정점의 순서를 인코딩합니다. 인접 목록 버전에서 세트를 사용하여 수정할 수는 있지만 여기서 직접적이지는 않습니다.

루트가 "헤드"의 역할을 수행하면서 동일한 종류의 파라 메트릭 재귀를 수행하도록 트리 데이터 구조를 수정할 수 있다고 생각합니다 SimpleGraph. 결과 트리 세트의 인터페이스로 인해 순서 / 기본 구조가 보이지 않게됩니다 (또는 빠른 업데이트에 관심이없는 경우 정식적인 경우도 있음).

제안 된 파생 상품

파생 상품 유형을 제안했습니다. 내가 한 것처럼 레이블과 색인을 혼동하도록 변경합니다.([(v,e)], [(v,e)])

이것으로 통합 될 수 이고 , 또는 단지 . "가장자리"정보는 단일 정점 만 식별하므로 전체 그래프 를 재구성하는 데 충분한 정보가 없습니다 .1(1V이자형)2+V1V이자형(v, [(v, e)])

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.