После просмотра вашего кода, я думаю, что ваше объяснение формулы, которую вы использовали, может быть неверным. Вы говорите, что при обновлении состояния вы добавляете четыре, а не два, и вычитаете выход самого нейрона. Мне кажется, что вы вычитаете выход самого нейрона дважды. Ваш код, который находит соседей, похоже, не различает соседей нейрона и самого нейрона, и вы запускаете этот код дважды - один раз для каждой вершины.
Тесты на моем собственном коде, кажется, подтверждают это. Скорость сходимости резко улучшается, когда я вычитаю собственный выход нейрона дважды, а не один раз.