(Оффтоп)
Долго не мог завершить тему из-за острой нехватки времени.
Хочется в первую очередь рассмотреть некоторые сложности, возникающие при использовании алгоритма Спарроу, на которые указывал еще автор статьи, но в нашей теме это не было отмечено.
Типы ошибок
Полезно суммировать все типы отказов, которые могут возникнуть при использовании метода числовых сигнатур при определении автоморфно эквивалентных классов.
(a) Тип I: Размещение автоморфно эквивалентных узлов в различных классах.
(b) Тип II: Размещение автоморфно различных узлов в том же самом классе в результате случайного совпадения числовых сигнатур.
(c) Тип III: Размещение автоморфно различных узлов в том же самом классе в результате генерации идентичных многочленов от разных структур.
(d) Тип IV: Размещение автоморфно различных узлов в том же самом классе в результате дефицита самого метода.
Ошибки первого рода никогда не должны происходить, при нормальной работе компьютера.
Ошибка первого рода у меня произошла всего один раз при вводе ошибочных данных.
Ошибки второго рода являются самыми неожиданными, учитывая число значащих цифр, используемых в арифметике с плавающей запятой. Они могут быть устранены, увеличением точности, или повторением процесса, с использованием различные случайно произведенные коэффициенты составления.
Ошибок III типа можно избежать полностью при использовании различных коэффициентов составления в каждой последовательной стадии. Практически такие ошибки не возникают, даже при неоднократном использовании тех же самых коэффициентов.
Ошибки IV типа, кажется, редки. Кроме случаев особенно построенных графов (таких как граф AVLF) метод неизменно приводит к соответствующему разложению.
Спарроу в статье указал на два возможных «подводных камня».
Первый «камень» -- это ошибки, возникающие из-за погрешностей округления при произведении неупорядоченного набора числовых сигнатур. Для устранения этой ошибки Спарроу предложил производить упорядочение числовых сигнатур перед их произведением.
Я опробовал разные реализации алгоритма Спарроу как с упорядочением, так и без упорядочения числовых сигнатур. При этом были получены абсолютно идентичные результаты.
Второй такой «камень» привожу в авторском тексте:
Цитата:
«Но остерегайтесь экспоненциального роста в числовых сигнатурах, которые произойдут при расчете больших сетей. Если вещественным числам позволить стать слишком большими, то они достигнут некоторого верхнего допустимого предела, определенного для языка программирования и компилятора.
В этом случае многие такие числа могут принять одинаковое максимально допустимое значение. Избегайте этого, отказываясь от части целого числа каждой сигнатуры в каждой стадии расчета. Это сохранит значения всех сигнатур в диапазоне (0, 1).»
Честно говоря, мне это его предложение кажется немного сомнительным.
Для преодоления этой трудности я реализовал модифицированный алгоритм Спарроу, в котором вместо произведения числовых сигнатур используется сложение логарифмов числовых сигнатур (что позволило значительно уменьшить получаемые при этом числа). Кроме того при таком подходе, по-видимому, не требуется производить сортировку числовых сигнатур перед их использованием, поскольку погрешности возникающие при сложении намного меньше погрешностей, возникающих при произведении неупорядоченных чисел. В результате проверки модифицированного алгоритма были получены идентичные результаты.
С учетом вышеописанных модификаций структура алгоритма Спарроу выглядит так:
1. Сначала всем вершинам
графа
присваиваются начальные (нулевые) значения числовых сигнатур
, равные степеням вершин
, то есть
2. На первой итерации числовые сигнатуры 1-го порядка вершин вычисляются по следующим выражениям:
где
-- множество вершин, смежных с вершиной
;
-- коэффициенты составления(разные иррациональные числа типа
,
или случайные числа в диапазоне от 0 до 1) которые или могут быть постоянными, или изменяться при изменении номера вершины
.
3. На
-ой итерации
числовые сигнатуры
-го порядка вершин вычисляются по следующим выражениям:
где
-- окрестность
–го порядка вершины
(т.е. множество вершин, находящихся на расстоянии
от вершины
;
-- множество вершин, смежных с вершиной
;
-- общее количество выполняемых итераций;
-- коэффициенты составления (разные иррациональные числа типа
,
или случайные числа в диапазоне от 0 до 1), которые или могут быть постоянными, или изменяться от стадии к стадии, или изменяться при изменении номера вершины
и номера
стадии.
4. После завершения вычисления числовых сигнатур (необходимого)
-го порядка всех вершин производится их сравнение. Вершины с одинаковым значением сигнатуры вводятся в один класс. Процесс вычисления автоморфно эквивалентных классов реализуется в отдельной процедуре. Эту процедуру также можно выполнять и после выполнения каждой
--той итерации.
В целом можно сделать вывод, что алгоритм Спарроу очень простой, прозрачный, легко модифицируется и не уступает многим известным алгоритмам.