Чи похідна графа пов'язана зі списками суміжності?


14

Деякі з творів Конора Макбріда " 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)] }

Я отримав це завдяки використанню правила про продукт та ланцюгових правил щодо похідних, і, хоча можливо, є деякі помилки, схоже, це дотримується загальної схеми. У цій структурі ви будете зосереджені або на Вузлах (конструктор InNodes), або на Краях (В краях), і дасте місце, ви побачите відповідні дані.

Але на це я не сподівався. Я сподівався на конструкцію, більш тісну, пов’язану з інтерфейсом бібліотеки функціональних графіків Мартіна Ервігса. Зокрема, я хочу побачити на вузлі контекст, що представляє мітку вузла та два списки суміжності, один для вихідних, другий для вхідних.

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

Я бачу надію, однак, оскільки представлення суміжності має деякі спільні риси з похідною, самотньою міткою a, у кожному місці отвору, поданням / розсіченням кожного ребра.

Оскільки похідна не є такою ж функцією, як оригінал, але інтеграція похідної є (kindof), чи існує якийсь аналог інтеграції, який слугуватиме перетворенню похідної у набір контекстів вузлів? Зверніть увагу, не на пряму інтеграцію для відновлення початкової структури, а на структуру, еквівалентну оригіналу, але в більш алгоритмічному представленні.

Якщо є, я сподіваюся, що структури типів відносин можуть бути визначені легкою мовою "набір вершин і ребер", і я можу отримати ефективну бібліотеку для роботи з цією структурою. Така реалізація може бути використана для вивчення структур "поза теорією графів": гіперграфи, спрощені комплекси ...

Так. Чи здається ця ідея здійсненною? Корисно? Чи було якесь дослідження такого типу речей, про яке я міг би прочитати більше?

Додаток

Як коментує Кертіс F , набір вузлів і ребер не є точно графіком. Однак усі графіки можуть бути представлені такими, і я вважаю, що це досить поширене уявлення. Я бачив (дуже груба специфікація) використовується в дослідженнях, що застосовують теорію графіків для оптимізацій бездротових мереж різними способами. Ось приклад відкритого доступу, DRAND *. Це ставить питання про те, яка зв'язок між презентацією та як може бути впроваджене деяке програмне забезпечення на основі дослідження.G=(V,E)

Це означає, що я не зовсім проти того, щоб змінити специфікацію входу з на щось інше. Наприклад, з урахуванням типу індексу , вузли мітки, і мітки ребер, . Тоді графік є (приблизно) функцією від індексів до списку міток та ребер.G=(V,E)IVE

G=I(VIE)

Це, я впевнений, можна висловити (теорія категорій?) Як

(1)G=(VEI)I

або

G=VIEII

які можна розглядати як набір вершин і ребер - дано достатньо застережень. Однак не ясно, чи є похідна значущою:(1)

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

Я, напевно, думаю, що це демонструє певну обіцянку, але мені не вистачає витонченості йти далі. Я знаю, що там повинна бути якась робота над вивченням зв'язку.

* Якщо посилання коли-небудь перерветься, цитуйте: Rhee, Injong та ін. "DRAND: розподілений рандомізований графік TDMA для бездротових спеціальних мереж." Операції IEEE з мобільних обчислень 8.10 (2009): 1384-1396.


Посилання, яке ви надаєте для дослідження, мертве. Чи можете ви надати більш постійне посилання, як DOI або журнал, в якому він був опублікований?
Кертіс Ф

Відповіді:


5

Ваш тип Grнасправді не відповідає графам, оскільки він включає багато примірників, які явно не є графами, тому що крайові індекси не повинні бути фактичними індексами вершин.

Наприклад,

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

не є графіком, але дозволено у вашому типі як

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

Скоріше, ваш Grбуквально відповідає списку мічених індексів та окремому, неспорідненому списку мічених пар індексів. Ось чому ви отримуєте таку "буквальну" похідну Gr, яка не відповідає "діркам" у графіках.

Існує також прикрою проблемою турботи про порядок вершин / ребер (видно в nodesLeft/Rightта edgesLeft/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 = 6 ребер
  • ….

Назвіть тип графіків розміру . ТодіkGk(v)=vke(k2)G(v)=G1(v)+G2(v)+

яка має похідну

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

Похідна

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

Зауважимо, що , так щоGk1(v)=vk1e(k1)(k2)2Gk(v)=Gk1(v)kek1

Тобто, похідна -node граф є графа вузла, в поєднанні з ребер з віддаленого вузла на інших вузлів, а індекс , що вузол займав у списку вершин.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)

Виправлення порядку в цій графі

Ця версія структури даних Graph є принципово пов'язаним списком, тому вона кодує порядок вершин. Хоча це можна виправити у вашій версії списку суміжності за допомогою набору, тут це не так прямо.

Я думаю, ви можете змінити структуру даних дерева, щоб виконати такий же параметричний рекурсій, при цьому корінь відіграє ту роль, яку виконує "голова" SimpleGraph. За допомогою інтерфейсу отриманих деревних наборів структура порядку / основи стає невидимою (або навіть канонічною, якщо вас не цікавлять швидкі оновлення).

Ваш запропонований похідний

Ви запропонували похідний тип; Я зміню його, щоб зв'язати мітки та індекси, як це зробив:([(v,e)], [(v,e)])

Це може бути інтегровано як що є , або просто . Це не має достатньої інформації для реконструкції цілого графа , оскільки інформація "краю" ідентифікує лише одну вершину.1(1ve)2C+v1ve(v, [(v, e)])

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.