Skip to content

This is an implementation of two Spring-embedder algorithms used for graph layout: Force-directed (Fruchterman - Reingold) and Local minimum energy (Kamada- Kawaii) in C language.

Notifications You must be signed in to change notification settings

minhanhari/MyForce-Directed

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

28 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Introduction

This is an implementation of two Spring-embedder algorithms used for graph layout: Force-directed (Fruchterman - Reingold) and Local minimum energy (Kamada- Kawaii) in C language.

Instruction

Generate matrix vertexes and edges:

make
.\MyForce

Draw graph:

cd drawgraph
qmake
make
.\release\drawgraph

1. НСориСнтированныС Π³Ρ€Π°Ρ„Ρ‹

ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ Π½Π΅ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π³Ρ€Π°Ρ„Π° являСтся основным Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈ Π³Ρ€Π°Ρ„ΠΎΠ², Π² частности Π² Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ матСматичСской Ρ‚Π΅ΠΎΡ€ΠΈΠΈ Π³Ρ€Π°Ρ„ΠΎΠ². Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ нСсколько ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Π³Ρ€Π°Ρ„Π°, Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π³Ρ€Π°Ρ„ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΠ°Ρ€Π° ∈ (V, E), Π³Π΄Π΅ V – мноТСство Π²Π΅Ρ€ΡˆΠΈΠ½ Π³Ρ€Π°Ρ„Π°, Π° E – мноТСство Ρ€Π΅Π±Π΅Ρ€. Π”Π²Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ v ΠΈ u ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ Ρ€Π΅Π±Ρ€ΠΎ Π³Ρ€Π°Ρ„Π°, Ссли {v, u} ∈ E. Если {v, u} ∈ E слСдуСт, Ρ‡Ρ‚ΠΎ {u, v} ∈ E, Ρ‚ΠΎ Π³Ρ€Π°Ρ„ являСтся Π½Π΅ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС это ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π³Ρ€Π°Ρ„.

Визуализация Π³Ρ€Π°Ρ„Π° ΠΈΠ»ΠΈ сСтСвой Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ β€” это графичСскоС прСдставлСниС Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΈ Ρ€Π΅Π±Π΅Ρ€ Π³Ρ€Π°Ρ„Π°. Визуализация Π½Π΅ слСдуСт ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с самим Π³Ρ€Π°Ρ„ΠΎΠΌ: ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π³Ρ€Π°Ρ„Ρƒ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ раскладки.

Для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π³Ρ€Π°Ρ„ΠΎΠ² Π±Ρ‹Π»ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ мноТСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ качСства Π² ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ срСдства ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΈΡ… эстСтики ΠΈ удобства использования. Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ руководству Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ раскладки для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Π³Ρ€Π°Ρ„Π°, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ раскладки ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти ΠΌΠ΅Ρ€Ρ‹.

  • МСньшСС количСство пСрСсСчСний Ρ€Π΅Π±Π΅Ρ€: Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΈ Ρ€Π΅Π±Π΅Ρ€ для получСния наимСньшСго количСства пСрСсСчСний Ρ€Π΅Π±Π΅Ρ€ Π΄Π΅Π»Π°Π΅Ρ‚ Π³Ρ€Π°Ρ„ΠΈΠΊ Π±ΠΎΠ»Π΅Π΅ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½Ρ‹ΠΌ ΠΈ ΠΌΠ΅Π½Π΅Π΅ Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹ΠΌ.
  • ΠœΠΈΠ½ΠΈΠΌΡƒΠΌ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΈ Ρ€Ρ‘Π±Π΅Ρ€.
  • РаспрСдСлСниС Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΈ/ΠΈΠ»ΠΈ Ρ€Ρ‘Π±Π΅Ρ€ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ.
  • Π‘ΠΌΠ΅ΠΆΠ½Ρ‹Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π±Π»ΠΈΠ·ΠΊΠΈ Π΄Ρ€ΡƒΠ³ ΠΊ Π΄Ρ€ΡƒΠ³Ρƒ, нСсмСТныС Π΄Π°Π»Π΅ΠΊΠΈ.
  • БообщСства Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² кластСры.

2. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ сообщСств

БообщСства ΡΠ²Π»ΡΡŽΡ‚ΡΡ свойством ΠΌΠ½ΠΎΠ³ΠΈΡ… сСтСй, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… конкрСтная ΡΠ΅Ρ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько сообщСств, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΡƒΠ·Π»Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ сообщСства тСсно связаны. Π£Π·Π»Ρ‹ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… сообщСствах ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒΡΡ.

Π’Π°ΠΊΠΆΠ΅ Π½Π°ΠΌ потрСбуСтся нСкоторая числовая характСристика, которая описываСт Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ структуры сообщСств Π² Π΄Π°Π½Π½ΠΎΠΌ Π³Ρ€Π°Ρ„Π΅, называСмая ΠΌΠΎΠ΄ΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒΡŽ:

Π³Π΄Π΅ Ξ΄(Ci, Cj) β€” Π΄Π΅Π»ΡŒΡ‚Π°-функция, равная Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅, Ссли Ci = Cj ΠΈ Π½ΡƒΠ»ΡŽ ΠΈΠ½Π°Ρ‡Π΅.

ΠŸΠΎΠΏΡ‹Ρ‚Π°Π΅ΠΌΡΡ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚. Π’ΠΎΠ·ΡŒΠΌΡ‘ΠΌ Π΄Π²Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ i ΠΈ j Π’Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ появлСния Ρ€Π΅Π±Ρ€Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ ΠΏΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ случайного Π³Ρ€Π°Ρ„Π° с Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ количСством Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΈ Ρ€Ρ‘Π±Π΅Ρ€, ΠΊΠ°ΠΊ Ρƒ исходного Π³Ρ€Π°Ρ„Π°, Ρ€Π°Π²Π½Π° didj/2m. РСальноС количСство Ρ€Ρ‘Π±Π΅Ρ€ Π² сообщСствС C Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΡΡ‚ΡŒΡΡ Ξ£i,j ∈ C Ai,j.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΠΎΠ΄ΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π²Π½Π° разности ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄ΠΎΠ»Π΅ΠΉ Ρ€Ρ‘Π±Π΅Ρ€ Π²Π½ΡƒΡ‚Ρ€ΠΈ сообщСства ΠΏΡ€ΠΈ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠΈ ΠΈ Π΄ΠΎΠ»Π΅ΠΉ Ρ€Ρ‘Π±Π΅Ρ€, Ссли Π±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ случайно сгСнСрированы. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½Π° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ сообщСств (случайный Π³Ρ€Π°Ρ„ структуры сообщСств Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚). Π’Π°ΠΊΠΆΠ΅ стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π²Π½Π° 1 для ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π³Ρ€Π°Ρ„Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ всС Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² ΠΎΠ΄Π½ΠΎ сообщСство ΠΈ Ρ€Π°Π²Π½Π° Π½ΡƒΠ»ΡŽ для разбиСния Π½Π° сообщСства, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ сопоставлСно ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ сообщСству. Для особо Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹Ρ… Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ.

2.1. Edge Betweenness – ΠΌΠ΅Ρ‚ΠΎΠ΄ Girvan – Newman

Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ связного Π³Ρ€Π°Ρ„Π° ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠΈΠΉ ΠΏΡƒΡ‚ΡŒ, ΠΈΡ… ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰ΠΈΠΉ. Π‘ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡƒΡ‚ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ вСс, Ρ€Π°Π²Π½Ρ‹ΠΉ 1/N, Π³Π΄Π΅ N β€” число Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠΈΡ… ΠΏΡƒΡ‚Π΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΏΠ°Ρ€ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½. Если Ρ‚Π°ΠΊΠΈΠ΅ вСса ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ для всСх ΠΏΠ°Ρ€ Π²Π΅Ρ€ΡˆΠΈΠ½, Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ€Π΅Π±Ρ€Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² соотвСтствиС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Edge betweenness β€” сумму вСсов ΠΏΡƒΡ‚Π΅ΠΉ, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠΈΡ… Ρ‡Π΅Ρ€Π΅Π· это Ρ€Π΅Π±Ρ€ΠΎ.

Для ясности ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ:

Π“Ρ€Π°Ρ„, для Ρ€Π΅Π±Ρ‘Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ посчитаны значСния Edge betweenness Π’ Π΄Π°Π½Π½ΠΎΠΌ Π³Ρ€Π°Ρ„Π΅ хочСтся Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄Π²Π° сообщСства: с Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ 1-5 ΠΈ 6-10. Π“Ρ€Π°Π½ΠΈΡ†Π° ΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Ρ€Π΅Π±Ρ€ΠΎ, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ вСс, 25. На этой ΠΈΠ΄Π΅Π΅ ΠΈ основываСтся Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ: поэтапно удаляСм Ρ€Π΅Π±Ρ€Π° с наибольшим вСсом, Π° ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ связности объявляСм сообщСствами. Алгоритм состроит ΠΈΠ· 6 этапов:

  1. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вСса
  2. Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Ρ€Π΅Π±Ρ€ΠΎ с наибольшим вСсом
  3. ΠŸΠ΅Ρ€Π΅ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ вСса для Ρ€Π΅Π±Ρ‘Ρ€
  4. БообщСствами ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ связности
  5. ΠŸΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» модулярности
  6. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ с шаги 2-6, ΠΏΠΎΠΊΠ° Π΅ΡΡ‚ΡŒ Ρ€Ρ‘Π±Ρ€Π°

2.5. MultiLevel – ΠΌΠ΅Ρ‚ΠΎΠ΄ Louvain

Π˜Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Multilevel: Π΄Π²Π° ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π°, для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ ΠΎΠ±Π° этапа

Алгоритм основан Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ модулярности. Как ΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ…, ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ сначала ставится Π² соотвСтствиС ΠΏΠΎ сообщСству. Π”Π°Π»Π΅Π΅ Ρ‡Π΅Ρ€Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ этапы:

  1. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ этап
    • Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅ΠΌ Π΅Ρ‘ сосСдСй
    • ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² сообщСство сосСда, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ увСличиваСтся максимально
    • Если ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π² любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅ сообщСство ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ, Ρ‚ΠΎ Π²Π΅Ρ€ΡˆΠΈΠ½Π° остаётся Π² своём сообщСствС
    • ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ повторяСм, ΠΏΠΎΠΊΠ° ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ
  2. Π’Ρ‚ΠΎΡ€ΠΎΠΉ этап
    • Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚Π°Π³Ρ€Π°Ρ„ ΠΈΠ· сообщСств-Π²Π΅Ρ€ΡˆΠΈΠ½. ΠŸΡ€ΠΈ этом Ρ€Ρ‘Π±Ρ€Π° Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ вСса, Ρ€Π°Π²Π½Ρ‹Π΅ суммС вСсов всСх Ρ€Ρ‘Π±Π΅Ρ€ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ сообщСства Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΈΠ»ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ сообщСства (Ρ‚.Π΅. Π±ΡƒΠ΄Π΅Ρ‚ взвСшСнная пСтля)
    • ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ этап для Π½ΠΎΠ²ΠΎΠ³ΠΎ Π³Ρ€Π°Ρ„Π°

Алгоритм ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΊΠΎΠ³Π΄Π° Π½Π° ΠΎΠ±ΠΎΠΈΡ… этапах ΠΌΠΎΠ΄ΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ Π½Π΅ поддаётся ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡŽ. ВсС исходныС Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ входят Π² Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ΅Ρ‚Π°Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ ΠΎΠ΄Π½ΠΎΠΌΡƒ сообщСству. НСсколько Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠΉ:

  • На ΠΏΠ΅Ρ€Π²ΠΎΠΌ этапС Π²Π΅Ρ€ΡˆΠΈΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ нСсколько Ρ€Π°Π·
  • ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° Π½Π΅ сильно влияСт Π½Π° Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ сущСствСнно Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°
  • На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ оказываСтся достаточно 3-4 ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ

3. Алгоритмы раскладки Π³Ρ€Π°Ρ„ΠΎΠ²

РисованиС ΠΎΠ±Ρ‰ΠΈΡ… Π½Π΅ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π³Ρ€Π°Ρ„ΠΎΠ² прСдставляСт собой ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² рисования Π³Ρ€Π°Ρ„ΠΎΠ². Они Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ»ΠΈ ΠΎΠ±ΠΎΠΈΠΌ ΠΈΠ· Π΄Π²ΡƒΡ… Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ: (1) Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊ ΠΈ (2) Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ быстро. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ нСскольким ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ эвристикам. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ большой Π³Ρ€Π°Ρ„.

РисованиС Π½Π΅ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π³Ρ€Π°Ρ„ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π΄ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° проСктирования Π‘Π‘Π˜Π‘, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ силовым Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ, Ρ†Π΅Π»ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся оптимизация схСмы схСмы с наимСньшим количСством пСрСсСчСний Π»ΠΈΠ½ΠΈΠΉ. Eades (1984) Π²Π²Π΅Π» модСль Spring-Embedder, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π² Π³Ρ€Π°Ρ„Π΅ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊΠΎΠ»ΡŒΡ†Π°ΠΌΠΈ, Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Ρ€Π΅Π±Ρ€ΠΎ замСняСтся ΠΏΡ€ΡƒΠΆΠΈΠ½ΠΎΠΉ. ΠŸΡ€ΡƒΠΆΠΈΠ½Π½Π°Ρ систСма запускаСтся со случайным Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ состояниСм, ΠΈ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ соотвСтствСнно ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ΄ дСйствиСм ΠΏΡ€ΡƒΠΆΠΈΠ½Π½Ρ‹Ρ… сил. ΠžΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Π°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° достигаСтся Π·Π° счСт Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ энСргия систСмы сводится ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ.

Π­Ρ‚Π° интуитивная идСя Π²Π΄ΠΎΡ…Π½ΠΎΠ²ΠΈΠ»Π° ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ Ρ€ΠΈΡΠΎΠ²Π°Π½ΠΈΡŽ Π½Π΅ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π³Ρ€Π°Ρ„ΠΎΠ², особСнно Камада ΠΈ Каваи (1989), Π€Ρ€ΡƒΡ…Ρ‚Π΅Ρ€ΠΌΠ°Π½ ΠΈ РСйнгольд (1991). Π—Π΄Π΅ΡΡŒ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠ±ΠΎΠ±Ρ‰Π°ΡŽΡ‚ΡΡ ΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ влияниС ΠΌΠΎΠ΄Π΅Π»ΠΈ Spring-Embedder Π½Π° рисованиС Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. ИдСи, Π²Π΄ΠΎΡ…Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅ этими Ρ€Π°Π±ΠΎΡ‚Π°ΠΌΠΈ, бСсцСнны для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² Ρ†Π΅Π»ΠΎΠΌ.

3.1. The Spring Model

МодСль spring-embedder Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π° Eades (1984) ΠΈ Π² настоящСС врСмя являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· самых популярных Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² для рисования Π½Π΅ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π³Ρ€Π°Ρ„ΠΎΠ² с прямолинСйными Ρ€Π΅Π±Ρ€Π°ΠΌΠΈ, ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² систСмах Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° Π΅Π³ΠΎ простоту ΠΈ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ ΠΏΠΎΠ½ΡΡ‚Π½ΡƒΡŽ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Алгоритм ИдСса слСдуСт Π΄Π²ΡƒΠΌ эстСтичСским критСриям: равномСрная Π΄Π»ΠΈΠ½Π° Ρ€Π΅Π±Π΅Ρ€ ΠΈ максимально возмоТная симмСтрия. Π’ ΠΌΠΎΠ΄Π΅Π»ΠΈ Spring-Embedder Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π³Ρ€Π°Ρ„Π° ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠ»Π΅Ρ†, ΠΈ каТдая ΠΏΠ°Ρ€Π° ΠΊΠΎΠ»Π΅Ρ† соСдинСна ΠΏΡ€ΡƒΠΆΠΈΠ½ΠΎΠΉ. ΠŸΡ€ΡƒΠΆΠΈΠ½Π° связана с двумя Π²ΠΈΠ΄Π°ΠΌΠΈ сил: силами притяТСния ΠΈ силами отталкивания, Π² зависимости ΠΎΡ‚ расстояния ΠΈ свойств ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ пространства.

Рисунок Π³Ρ€Π°Ρ„ΠΈΠΊΠ° приблиТаСтся ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ энСргии ΠΏΡ€ΡƒΠΆΠΈΠ½Π½ΠΎΠΉ систСмы. К ΡƒΠ·Π»Π°ΠΌ, соСдинСнным ΠΏΡ€ΡƒΠΆΠΈΠ½ΠΎΠΉ, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½Π° сила притяТСния (fa), Π° ΠΊ Ρ€Π°Π·ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Π½Ρ‹ΠΌ ΡƒΠ·Π»Π°ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½Π° сила отталкивания (fr). Π­Ρ‚ΠΈ силы ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ka ΠΈ kr β€” константы, Π° d β€” Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ ΡƒΠ·Π»Π°ΠΌΠΈ. Для соСдинСнных ΡƒΠ·Π»ΠΎΠ² это расстояниС d являСтся Π΄Π»ΠΈΠ½ΠΎΠΉ ΠΏΡ€ΡƒΠΆΠΈΠ½Ρ‹. ΠΠ°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° Π³Ρ€Π°Ρ„Π° настраиваСтся случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ силы Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°, ΠΈ ΡƒΠ·Π»Ρ‹ соотвСтствСнно ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ напряТСниС. Богласно Eades (1984), модСль Spring Embedder Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° ΠΎΡ‡Π΅Π½ΡŒ быстро Π½Π° VAX 11/780 Π½Π° Π³Ρ€Π°Ρ„Π°Ρ… с числом ΡƒΠ·Π»ΠΎΠ² Π΄ΠΎ 30. Однако модСль Spring-Embedder ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° ΠΎΡ‡Π΅Π½ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π³Ρ€Π°Ρ„Π°Ρ….

3.2. Local Minimum

МодСль spring-embedder Π²Π΄ΠΎΡ…Π½ΠΎΠ²ΠΈΠ»Π° Π½Π° созданиС ряда ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² рисования Π½Π΅ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π³Ρ€Π°Ρ„ΠΎΠ². НапримСр, силы отталкивания ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ всСми ΠΏΠ°Ρ€Π°ΠΌΠΈ Π²Π΅Ρ€ΡˆΠΈΠ½, Π° силы притяТСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ рассчитаны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ сосСдними Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ. УпрощСнная модСль ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: вычислСниС сил притяТСния ΠΌΠ΅ΠΆΠ΄Ρƒ сосСдями выполняСтся O(|E|), хотя вычислСниС силы отталкивания выполняСтся Π΄ΠΎ O(|V|Β²), Ρ‡Ρ‚ΠΎ Π² Ρ†Π΅Π»ΠΎΠΌ являСтся большим ΡƒΠ·ΠΊΠΈΠΌ мСстом Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² с n Ρ‚Π΅Π»Π°ΠΌΠΈ. Камада ΠΈ Каваи (1989) прСдставили Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, основанный Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΡ€ΡƒΠΆΠΈΠ½Π½ΠΎΠ³ΠΎ внСдрСния Идса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пытаСтся Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄Π²ΡƒΡ… ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π² ΠΈΠ»ΠΈ эвристик рисования Π³Ρ€Π°Ρ„Π°:

  • ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ пСрСсСчСний Ρ€Π΅Π±Π΅Ρ€ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ.
  • Π’Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΈ Ρ€Π΅Π±Ρ€Π° распрСдСлСны Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ.

ЦСль Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ энСргии Π² соотвСтствии с Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π° Οƒ = 0, Ρ‡Ρ‚ΠΎ являСтся Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ, Π½ΠΎ Π½Π΅ достаточным условиСм глобального ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ°. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ слоТности, Ρ‚Π°ΠΊΠΎΠΉ поиск Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ большого количСства ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, поэтому Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ часто Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты управлСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ пруТинная систСма Π½Π΅ окаТСтся Π² Π»ΠΎΠ²ΡƒΡˆΠΊΠ΅ Π² Π΄ΠΎΠ»ΠΈΠ½Π΅ локального ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ°.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ИдСса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ явно Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π·Π°ΠΊΠΎΠ½ Π“ΡƒΠΊΠ°, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠšΠ°ΠΌΠ°Π΄Ρ‹ ΠΈ Каваи ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π² Π½ΠΎΠ²Ρ‹Π΅ полоТСния ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ общая энСргия ΠΏΡ€ΡƒΠΆΠΈΠ½Π½ΠΎΠΉ систСмы ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ с Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ. Он Ρ‚Π°ΠΊΠΆΠ΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ понятиС ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ расстояния ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ Π½Π° Ρ‡Π΅Ρ€Ρ‚Π΅ΠΆΠ΅: расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ Π΄Π»ΠΈΠ½Π΅ ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠ΅Π³ΠΎ ΠΏΡƒΡ‚ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ.

БлСдуя обозначСниям ΠšΠ°ΠΌΠ°Π΄Ρ‹ ΠΈ Каваи (1989), для динамичСской систСмы ΠΈΠ· n частиц, соСдинСнных ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΠΏΡ€ΡƒΠΆΠΈΠ½Π°ΠΌΠΈ, ΠΏΡƒΡΡ‚ΡŒ p1, p2 ... pn Π±ΡƒΠ΄ΡƒΡ‚ частицами Π² области рисунка, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌ v1, v2 ... vn V соотвСтствСнно. . БбалансированноС располоТСниС Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ достигнуто с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ динамичСски сбалансированной ΠΏΡ€ΡƒΠΆΠΈΠ½Π½ΠΎΠΉ систСмы. Камада ΠΈ Каваи сформулировали ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ дисбаланса ΠΊΠ°ΠΊ ΠΎΠ±Ρ‰ΡƒΡŽ ΡΠ½Π΅Ρ€Π³ΠΈΡŽ ΠΏΡ€ΡƒΠΆΠΈΠ½:

Π˜Ρ… модСль ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠ΅Π΅ располоТСниС Π³Ρ€Π°Ρ„Π° β€” это состояниС с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ E. РасстояниС dij ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ vi ΠΈ vj Π² Π³Ρ€Π°Ρ„Π΅ опрСдСляСтся ΠΊΠ°ΠΊ Π΄Π»ΠΈΠ½Π° ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠ΅Π³ΠΎ ΠΏΡƒΡ‚ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ vi ΠΈ vj. Алгоритм Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π½Π° согласованиС Π΄Π»ΠΈΠ½Ρ‹ ΠΏΡ€ΡƒΠΆΠΈΠ½Ρ‹ lij ΠΌΠ΅ΠΆΠ΄Ρƒ частицами pi ΠΈ pj с ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠΈΠΌ расстояниСм ΠΏΡƒΡ‚ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Π½Π° Ρ‡Π΅Ρ€Ρ‚Π΅ΠΆΠ΅. Π”Π»ΠΈΠ½Π° lij опрСдСляСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π³Π΄Π΅ L β€” ТСлаСмая Π΄Π»ΠΈΠ½Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π΅Π±Ρ€Π° Π² области рисования. L ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° основС наибольшСго расстояния ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ Π² Π³Ρ€Π°Ρ„Π΅. Если Lo β€” Π΄Π»ΠΈΠ½Π° стороны ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° области рисования, L ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π‘ΠΈΠ»Π° ΠΏΡ€ΡƒΠΆΠΈΠ½Ρ‹, ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰Π΅ΠΉ pi ΠΈ pj, обозначаСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ kij:

Π—Π°Ρ‚Π΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ КК ΠΈΡ‰Π΅Ρ‚ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° v Π² Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ сСти ΠΈ пытаСтся ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ энСргии Π²ΠΎ всСй сСти. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ КК вычисляСт частныС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ для всСх ΡƒΠ·Π»ΠΎΠ² Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ сСти с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ xv ΠΈ yv, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ (Ρ‚.Π΅. βˆ‚E / βˆ‚xv = βˆ‚E / βˆ‚yv = 0; 1 < v < n).

Однако Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ всСх этих Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Ρ… ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ зависят Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ уравнСния ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, основанный Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΠΡŒΡŽΡ‚ΠΎΠ½Π°-Рафсона. На ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΡƒΠ·Π΅Π» m с наибольшим ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ (Ξ”m). Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΡƒΠ·Π΅Π» m пСрСмСщаСтся Π² Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π³Π΄Π΅ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня Ξ”m, Ρ‡Π΅ΠΌ Ρ€Π°Π½ΡŒΡˆΠ΅. ΠœΠ΅ΠΆΠ΄Ρƒ Ρ‚Π΅ΠΌ, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΡƒΠ·Π»Ρ‹ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ фиксированными. МаксимальноС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ (Ξ”m) рассчитываСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

3.3. Force-Directed Placement

Алгоритм Π€Ρ€ΡƒΡ…Ρ‚Π΅Ρ€ΠΌΠ°Π½Π°-РСйнгольда основан Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΡ€ΡƒΠΆΠΈΠ½Π½ΠΎΠ³ΠΎ встраивания Идса. Он Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ распрСдСляСт ΡƒΠ·Π»Ρ‹, минимизируя пСрСсСчСния Ρ€Π΅Π±Π΅Ρ€. Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ Ρ€Π΅Π±Π΅Ρ€. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° КК, ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π²Π΅ силы (силы притяТСния ΠΈ силы отталкивания) для обновлСния ΡƒΠ·Π»ΠΎΠ², Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ энСргии с тСорСтичСским графичСским расстояниСм. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, сила притяТСния (fa) ΠΈ сила отталкивания (fr) ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π³Π΄Π΅ d β€” расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΡƒΠ·Π»Π°ΠΌΠΈ, Π° k β€” константа идСального ΠΏΠΎΠΏΠ°Ρ€Π½ΠΎΠ³ΠΎ расстояния. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° идСального расстояния k = √(area / n). Π—Π΄Π΅ΡΡŒ area β€” ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Ρ€Π°ΠΌΠΊΠΈ Ρ‡Π΅Ρ€Ρ‚Π΅ΠΆΠ°, n β€” ΠΎΠ±Ρ‰Π΅Π΅ количСство ΡƒΠ·Π»ΠΎΠ² Π² Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ сСти.

Алгоритм Π€Ρ€ΡƒΡ…Ρ‚Π΅Ρ€ΠΌΠ°Π½Π°-РСйнгольда выполняСтся ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ, ΠΈ всС ΡƒΠ·Π»Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ послС расчСта сил для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. Алгоритм добавляСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ «смСщСниС» для контроля смСщСния полоТСния ΡƒΠ·Π»ΠΎΠ². Π’ Π½Π°Ρ‡Π°Π»Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π€Ρ€ΡƒΡ…Ρ‚Π΅Ρ€ΠΌΠ°Π½Π°-РСйнгольда вычисляСт Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ смСщСния для всСх ΡƒΠ·Π»ΠΎΠ² с использованиСм силы отталкивания (fr). Алгоритм Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ силу притяТСния (fa) для ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ обновлСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ полоТСния ΡƒΠ·Π»ΠΎΠ² Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ€Π΅Π±Ρ€Π΅. НаконСц, ΠΎΠ½ обновляСт смСщСниС полоТСния ΡƒΠ·Π»ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ смСщСния.

3.4. РСализация Π½Π° Π‘

Π­Ρ‚ΠΎ рСализация Π΄Π²ΡƒΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ²: Камада-Каваи ΠΈ Π€Ρ€ΡƒΡ…Ρ‚Π΅Ρ€ΠΌΠ°Π½Π°-РСйнгольда Π½Π° языкС программирования Π‘ΠΈ. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Graph Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Π΄Π²Π° динамичСских массива: ΠΎΠ΄ΠΈΠ½ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΈ ΠΎΠ΄ΠΈΠ½ массив Ρ€Π΅Π±Π΅Ρ€ c ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ.

struct Graph
{
  struct Vertex **vertexes;
  struct Edge *edges;
  int vertexes_num;
  int edges_num;
};

КаТдая Π²Π΅Ρ€ΡˆΠΈΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ имя ΠΈ своС мСстополоТСниС Π² Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅:

struct Vertex { int name; struct Vector location; };

Π Π΅Π±Ρ€ΠΎ состоит ΠΈΠ· Π΄Π²ΡƒΡ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΎ соСдиняСт:

struct Edge { struct Vertex *start; struct Vertex *end; };
void ForceDirectedLayout(struct Graph *graph, int max_iteration)
{
    int v_num = graph->vertexes_num;
    double k = sqrt(LENGTH * LENGTH / v_num);
    double t = 20;

    int stop_count = 0;

    // Stop when total movement falls under a certain range
    // for (int i = 0; i < max_iteration; i++)
    while (stop_count < max_iteration)
    {
        struct Vector displacement[v_num];
        // Calculate the repulsive forces on vertexes/electrons
        for (int i = 0; i < v_num; i++)
        {
            displacement[i] = new_vector(0, 0);

            for (int j = 0; j < v_num; j++)
            {
                if (i != j)
                {
                    struct Vector diff = sub(graph->vertexes[i]->location, graph->vertexes[j]->location);
                    // displacement = displacement + (diff / |diff|) * Fr
                    displacement[i] = add(displacement[i], multiply(devide(diff, absolute(diff)), Fr(absolute(diff), k)));
                }
            }
        }

        // Calculate the attractive forces on edges/springs
        for (int i = 0; i < graph->edges_num; i++)
        {
            int start_i = findVIndex(graph->edges[i].start, graph);
            int end_i = findVIndex(graph->edges[i].end, graph);

            struct Vector diff = sub(graph->vertexes[start_i]->location, graph->vertexes[end_i]->location);
            // displacement = displacement +- (diff / |diff|) * Fa
            displacement[start_i] = sub(displacement[start_i], multiply(devide(diff, absolute(diff)), Fa(absolute(diff), k)));
            displacement[end_i] = add(displacement[end_i], multiply(devide(diff, absolute(diff)), Fa(absolute(diff), k)));
        }

        double total_displacement = 0;

        // Limit the max displacement to a temperature t and keep them inside the frame
        // The temperature t allows for large movements at the beginning of the loop
        // and smaller, more refined movements near the end.
        for (int i = 0; i < v_num; i++)
        {
            struct Vector disp = displacement[i];
            struct Vector lim_disp = multiply(devide(disp, absolute(disp)), __min(absolute(disp), t));

            graph->vertexes[i]->location = add(graph->vertexes[i]->location, lim_disp);
            total_displacement += absolute(lim_disp);
        }

        // Stop when total movement falls under a certain range
        if (total_displacement < 0.0001 * (v_num))
        {
            printf("Small displacement\n");
            stop_count++;
        }

        t = cool(t);
    }
    printf("Graph placed with force-directed layout!\n");
}

void LocalMinimum(struct Graph *gr, double eps)
{
    // Two dimensional array of shortest path between two vertexes
    // Calculate using Floyd-Warshall algorithm
    int **d = floyd_warshall(*gr);
    int v_num = gr->vertexes_num;
    int e_num = gr->edges_num;
    double Lo = LENGTH * 10 / e_num;
    double K = 100;

    int d_max = d[0][0];
    for (int i = 0; i < v_num; i++)
    {
        for (int j = i + 1; j < v_num; j++)
        {
            d_max = __max(d_max, d[i][j]);
        }
    }

    // Initializing l_ij, k_ij
    double **l = (double **)malloc(sizeof(double *) * v_num);
    double **k = (double **)malloc(sizeof(double *) * v_num);
    for (int i = 0; i < v_num; i++)
    {
        l[i] = (double *)malloc(sizeof(double) * v_num);
        k[i] = (double *)malloc(sizeof(double) * v_num);
        for (int j = 0; j < v_num; j++)
        {
            l[i][j] = Lo / d_max * d[i][j];
            k[i][j] = K / pow(d[i][j], 2);
        }
    }

    // Moving the vertex with highest energy decrease
    double *Delta = (double *)malloc(sizeof(double) * v_num);
    int max_i = calcDelta(gr, k, l, Delta);
    while (Delta[max_i] > eps)
    {
        while (Delta[max_i] > eps)
        {
            struct Vector dE = new_vector(0, 0);
            double Exx = 0;
            double Exy = 0;
            double Eyy = 0;
            for (int i = 0; i < v_num; i++)
            {
                if (i == max_i)
                    continue;

                struct Vector dmax_i = sub(gr->vertexes[max_i]->location, gr->vertexes[i]->location);
                double n = 1.0 - l[max_i][i] / absolute(dmax_i);
                dE = add(dE, multiply(multiply(dmax_i, n), k[max_i][i]));

                Exy += k[max_i][i] * l[max_i][i] * dmax_i.x * dmax_i.y / pow(absolute(dmax_i), 3);
                Exx += k[max_i][i] * (1.0 - l[max_i][i] * dmax_i.y * dmax_i.y / pow(absolute(dmax_i), 3));
                Eyy += k[max_i][i] * (1.0 - l[max_i][i] * dmax_i.x * dmax_i.x / pow(absolute(dmax_i), 3));
            }

            double D = Exx * Eyy - Exy * Exy;
            struct Vector d;
            d.x = -(Eyy * dE.x - Exy * dE.y) / D;
            d.y = -(-Exy * dE.x + Exx * dE.y) / D;

            gr->vertexes[max_i]->location = add(gr->vertexes[max_i]->location, d);

            Delta[max_i] = absolute(dE);
        }

        max_i = calcDelta(gr, k, l, Delta);
    }
    printf("Graph placed with local minimum layout!\n");
}

int calcDelta(struct Graph gr, double **k, double **l, double *Delta)
{
    double maxDelta = 0;
    int m_i = 0;
    for (int i = 0; i < gr.vertexes_num; i++)
    {
        // dE is vector energy
        struct Vector dE = new_vector(0, 0);
        for (int j = 0; j < gr.vertexes_num; j++)
        {
            if (i == j)
                continue;

            struct Vector d = sub(gr.vertexes[i]->location, gr.vertexes[j]->location);
            double n = 1.0 - l[i][j] / absolute(d);
            dE = add(dE, multiply(multiply(d, n), k[i][j]));
        }
        // Find vertex with highest energy
        Delta[i] = absolute(dE);
        if (Delta[i] > maxDelta)
        {
            maxDelta = Delta[i];
            m_i = i;
        }
    }
    return m_i;
}

Раскладка Π³Ρ€Π°Ρ„Π° Local minmum - Kamada - Kawaii

Раскладка Π³Ρ€Π°Ρ„Π° Force-directed layout - Fruchterman - Reingold

About

This is an implementation of two Spring-embedder algorithms used for graph layout: Force-directed (Fruchterman - Reingold) and Local minimum energy (Kamada- Kawaii) in C language.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published