Уплотнение математического графа

Я хочу нарисовать график, который будет примерно таким: alt text http://img25.imageshack.us/img25/9786/problemo.png

Вы можете увидеть 3 патча: a, b и c. Как изменить положение элементов (1,2,3..., 9), чтобы сделать длинный путь максимально коротким? Я имею в виду, что эти строки должны быть как можно короче.

Мне очень интересно это, потому что я рисую график с вопросом, какой-то инфографический, как "следуйте строкам, чтобы узнать ответ". Я знаю, что это немного о теории графов... так что если это слишком сложно, вы знаете, есть ли какая-нибудь программа для linux для компактного вещания вроде этого?

Например, программа должна работать следующим образом: При вводе он должен получить 3 патча

a='1,5,7,8,4,2,6'
b='4,2,3,6,9,8,5'
c='7,9'

И в выводе в должны быть координаты этих элементов.

Ответ 1

Всякий раз, когда у меня есть проблема оптимизации, которую трудно решить, я думаю о генетических алгоритмах. Мое решение ниже предполагает, что вы знакомы с GA (не очень сложно реализовать его самостоятельно)

Рассматривая примерный график, который вы дали, предположим, что узлы будут помещены в сетку NxN (целые позиции), а затем для кодификации геномов рассмотрим следующую схему:

00101 00100 11010 11110 11000     
  A     B     C     D     E

где каждая часть кодирует позицию в сетке (в двоичном порядке) узлов (в этом порядке). Длина каждой части зависит от размера сетки (length = ceil (log2 (N * N))). Сетка пронумерована по строкам, слева направо.

Итак, в качестве примера для полного графика с 4 узлами (A, B, C, D) и сеткой 3x3 строка:

0011 0001 0101 1000    =   3  1  5  8 
 A    B    C    D          A  B  C  D

представляет следующий макет:

. B .       00  01  02
A . C       03  04  05
. . D       06  07  08

Далее мы создаем оператор кроссовера как обычно (одно- или двухточечный кроссовер) и мутацию (случайным образом переворачиваем один бит). Мы просто должны убедиться, что в любой момент мы имеем только действительные позиции внутри сетки.
Наконец, функция пригодности будет некоторой функцией расстояний между узлами пути (сумма для нескольких путей), которая будет наказывать длинные пути (как проблема минимизации). Примером может служить расстояние между городами между узлами.
Остальная часть метода представляет собой стандартный генетический алгоритм (инициализация, оценка, выбор, воспроизведение, завершение).

Пример Чтобы проиллюстрировать, рассмотрим предыдущую компоновку с расстоянием между городскими блоками, учитывая следующие два пути: A D C B и C B D A

A -> D -> C -> B
  3  + 1  + 2    = 6        therefore
C -> B -> D -> A              fitness(0011 0001 0101 1000) = 6 + 8 = 14
  2  + 3  + 3    = 8

Очевидно, цель состоит в том, чтобы найти макет, который минимизирует функцию фитнеса.