One way to do this is to use a pseudo-physical model. Your objects have repulsive force and attractive force if attached.
: , , .
:
for each object o1
force[o1] = 0
for each object o2
if o1 and o2 are linked
force[o1] += attraction_force(o1, o2)
else
force[o1] += repulsion_force(o1, o2)
for each object o1
move(o1, force[o1])
, .
, , . , , . , (, a spring) (- )
, , , , . .