whitefoxЕсли вы поймете его статью, то возможно поможете мне убедить автора в бесперспективности этого подхода. Все его попытки можно свести к следующей схеме.
Строим отображение
из графов в матрицы
обладающее следующими свойствами:
1. Для разных графов
и
значения функции различны:
.
2. Перестановка вершин графа
приводит к такой же перестановке строк и столбцов в матрице
.
3. Матрица
симметрична.
4*. У матрицы
элементы на диагонали не совпадают с внедиагональными элементами. (от этого свойства на самом деле можно легко избавится и оно не используется в новой версии автора)
После чего автор предлагает искать соответствие между матрицами
и
вместо задачи изоморфизма графа. Проблема в том, что его сложное отображение
можно заменить на
, где
- матрица смежности графа,
- единичная матрица. А если избавится от свойства 4, то можно просто брать
. Но искать соответствие между матрицами смежности, это в точности тоже самое, что и решать исходную задачу об изоморфизме графа. Поэтому его идея, которой он так гордится, не дает ровно ничего. Установить какие-либо дополнительные полезные свойства
тоже весьма проблематично.
Далее автор пытается использовать простейшие свойства матриц чтобы решить задачу изоморфизма. Если бы это можно было сделать, это давно бы придумали. Но автора это не останавливает.
Конкретную ошибку не сложно увидеть, если рассмотреть случай
(т.е.
в обозначениях статьи). Сперва он сортирует строки матрицы смежности. Отсортированная строка матрицы смежности - это несколько единичек, за которыми следуют нулю. Количество единичек равно степени вершины. Затем выбирается пара вершин
с совпадающими отсортированными строками, т.е. 2 вершины одинаковой степени. После чего строится двудольный граф
в котором соседи
соединены с соседями
, а не соседи
соединены c не соседями
.
После чего вызывается процедура removeBadEdges. Она берет ребро
в графе
. После чего проверяется, что для любого ребра
из
если
сосед
, то
сосед
и наоборот.
Если существует изоморфизм
который переводит
в
, но не переводит
в
, то найдется такое
, что либо
и
соседи, а
и
не соседи, либо наоборот
и
не соседи, а
и
соседи. Поскольку ребро
лежит в
(по крайней мере изначально), то такое ребро
будет выкинуто.
Здесь мы и видим две проблемы. Во-первых, поскольку мы выкидываем ребра из
в процессе выполнения процедуры removedBadEdges, то эти рассуждения могут перестать работать. А во-вторых, мы с легкостью можем выкинуть ребра между подобными вершинами (если бы этой проблемы не было, то первая проблема не была бы проблемой). Ведь если вершины
и
подобны, то может существовать изоморфизм, который не переводит одну в другую, а в таком случае, как мы показали выше, ребро будет выкинуто (если только ребро
между подобными вершинами не будет выкинуто раньше). После чего функция GetSimilar будет работать не правильно (не выдавать подобную вершину, не смотря на то, что она существует) и, как следствие, вся программа будет работать не правильно.
Есть и другие проблемы. К примеру, функция P1 работает не правильно, даже при правильно работающей GetSimilar. Из подобия вершин
и
и похожести разбиений не значит, что можно добавлять
в map. Это можно делать только на первом шаге. После первого шага мы возможно уже определились с изоморфизмом, а подобные вершины выбранные на втором шаге к нему не подходят. Похожесть разбиений никак не может помочь, поскольку автор ничего существенного про них не доказал.